ꘇ dat.transpose
Flip your rows and columns without touching a spreadsheet
- input
- table
- text
One input, one job
ꘇ dat.transpose takes a GENERETI_DAT table in, and gives you the same table with rows and columns swapped: table out and the CSV as text. That's it. There is one input, input, and no widgets at all - nothing to configure, nothing to get wrong.
Which is exactly why it's more useful than it sounds. In this pack, the difference between a table and a signal is orientation. dat.tochop reads columns as channels and rows as samples. dat.totop reads columns as x and rows as y. So whether your pasted data becomes four control channels of a hundred samples or a hundred channels of four samples depends entirely on which way round it happens to be, and transpose is the one-key fix.
The mechanism
Straightforward, with one deliberate bit of tolerance: the implementation takes the widest row as the column count, then walks column by column emitting a row from every source row. Where a row is shorter than the widest row - a ragged table - the missing cells come back as empty strings.
So transposing a ragged table regularises it. A 3-row table where row two has five columns and the others have two becomes a 5-row table where every row has three cells, some of them blank. That's occasionally what you want and occasionally a surprise, but never an error.
The empty-string fill also matters downstream, since numeric conversion happens at the boundary: dat.tochop writes 0.0 for anything it can't parse as a float, and dat.totop clamps cells to 0..1. A blank cell therefore arrives as a zero rather than as "missing".
When you reach for it
Three real cases:
Pasted data that's the wrong way up. You copied a row of values out of a spreadsheet and dat.tochop sees one sample and ten channels instead of ten samples of one channel. Transpose before dat.tochop. This is the single most common reason to use the node, and it takes about four seconds to diagnose once you know the convention.
Building a "channel list" header. Because dat.tochop takes channel names from the first row, a transposed table lets you feed names in as a column of your own making.
Turning a timeline into a curve. Put sample values in rows, transpose, and dat.totop now rasterises them the other way up - rows become x, which is exactly what you want for a value-over-time strip. The pack's own operator examples chain DAT → texture this way, and it's a cheap way to visualise a signal without audio hardware.
It's also a legitimate way to read a wide table. Big tables are easier to eyeball as tall ones when every node panel in ComfyUI is roughly 500 pixels wide.
Where it sits in the family
Genereti's OpenTouch layer maps three interfaces onto one graph: TOP for images, CHOP for sampled signal channels, DAT for tables and documents. Each family has its own near-identical set of primitives, and transpose is the DAT member of that set - the way you reshape the data so that the next operator's convention is satisfied instead of fighting it. The pack also ships six explicit conversion directions between the families, precisely so that orientation and type mismatches get solved by a node rather than by guesswork.
Install
Ships only inside the Genereti pack. ComfyUI Manager → search Genereti (publisher liuboto) → install → restart → hard-refresh the browser. By hand:
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 ComfyUI's own interpreter rather than a global pip - .venv on a checkout, python_embeded\python.exe on Windows Portable. The requirements file contains one line, comfyui-frontend-package>=1.53.6; there are no models and no heavy dependencies to worry about. Needs ComfyUI 0.38.2+ and Python 3.11+.
Gotchas
- No transpose of a header. If row one is
name,value, after transposing your header is the first column. Nothing is aware that it was ever special. - Ragged input, rectangular output. Padding is silent.
- Alpha pack, thin documentation. The README warns this is "super alpha - early classroom testing", and there's no community discussion of the pack to fall back on, so verify with
dat.inspecton thetextoutput rather than trusting a tutorial - including this one. - Nothing to click here, but the pack still needs the browser. Other nodes in Genereti register frontend extensions; if those render blank, refresh the tab before you start debugging a data node that can't possibly be the culprit.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| input | GENERETI_DAT | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| table | GENERETI_DAT | — |
| text | STRING | — |