Nodes/ꘇ Genereti/ꘇ dat.tochop
ComfyUI Node

ꘇ dat.tochop

Turn a CSV into control channels that drive your graph

By languel·Created about a month ago·Updated 3 days ago· 1
ꘇ dat.tochop
  • input
  • channels
  • value
◄sample_rate60.00►
◄headertrue►

The bridge between a spreadsheet and a slider

ꘇ dat.tochop is the node that makes Genereti's data family pay off. You feed it a GENERETI_DAT table and you get GENERETI_CHOP - named sampled channels - plus a plain FLOAT.

The convention, stated once so you don't have to reverse-engineer it: columns become channels, rows become samples, and the first row can be the channel names. So a three-row table like the default

name,value
speed,0.5
influence,0.8

becomes two channels, name and value, each with two samples. Not what the default table is for, but it shows the shape.

The FLOAT output is the useful bit for beginners: it's the last sample of the first channel. That means even a one-cell table gives you a single number you can wire into any converted numeric widget - a seed, a cfg, a denoise, a LoRA strength. Convert the widget to an input, drop dat.tochop's value output on it, and your text box now steers the sampler.

What the conversion tolerates

It's built to not blow up on messy data:

  • Non-numeric cells become 0.0. No error, no warning. This is the number-one cause of a channel that reads flat zero, and it's almost always whitespace or a stray header row rather than a real data problem.
  • NaN and infinity are sanitised to zero. So an inf in your table arrives as a dead channel rather than poisoning a CUDA op downstream.
  • Duplicate names get suffixed. Two columns called value produce value and value_, because channel names have to be unique. If a downstream chop.select pattern is missing one channel, that's why.
  • Header off = every row is a sample. If your table has no header and you leave header on, row one becomes your channel names and you lose a sample without noticing.
  • Columns beyond the header length get generated names (chan0, chan1, …), so an uneven header row degrades instead of erroring.

The sample_rate input (default 60, range 1–1000) is metadata: it declares the rate of the sample axis and it's what CHOP processors use when they integrate or differentiate. The conversion itself is not resampling anything - rows are samples, full stop.

Inputs and outputs

  • input - the GENERETI_DAT table.
  • sample_rate - FLOAT, default 60. Declared rate for the channel data.
  • header - BOOLEAN, default true. Whether row one names the channels.
  • channels - GENERETI_CHOP, the named channels. Wire this into CHOP processors (chop.math, chop.lag, chop.select) or into another conversion.
  • value - FLOAT, the last sample of the first channel.

Since channels are addressed by name in this pack, dat.replace upstream is how you rename a column so that a downstream CHOP that wants note1 actually finds it - which is precisely how people feed chords into chop.arpeggiator from a text table.

Install

Only ships inside Genereti. Manager → search Genereti (publisher liuboto) → install → restart → hard-refresh the browser tab. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/languel/genereti.git genereti
cd ../
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt

Use your ComfyUI interpreter (.venv on a checkout, python_embeded\python.exe on Portable, the bundled env on Desktop). Requirements: one line, comfyui-frontend-package>=1.53.6. Nothing model-shaped is downloaded. Floor versions are ComfyUI 0.38.2+, Python 3.11+, frontend 1.53.6+.

Gotchas

  • A flat zero channel is usually a parse failure, not a bug. Check for whitespace, units, or a header row you didn't skip.
  • The value output is one number, from one channel, from the last row. If you expected an average or a first sample, that's not what this is. Filter with dat.select first if you need a specific cell, or use dat.cell for exact addressing.
  • Live vs. Queue. In the browser these channels can update live with the graph's transport; on Queue you get one evaluation with the explicit time/sample settings. Don't assume a queued run and a live run produce identical samples.
  • Alpha pack, thin docs. The README leads with "super alpha - early classroom testing… back up your workflows before updating." Verify table shape with dat.inspect before blaming the conversion.
CategoryGenereti / DAT

Inputs (3)

NameTypeDefaultDescription
inputGENERETI_DAT—
sample_rateFLOAT60.001–1000—
headerBOOLEANtrue—

Outputs (2)

NameTypeDescription
channelsGENERETI_CHOP—
valueFLOAT—