So, there is a workflow I feel needs to exist. It may already exist, and I don't know about it.
Consider the Linux command line workflow, the "motto" of Linux, more or less. You have a bunch of small programs, accepting input and producing output. Each does one thing well, and the user puts them together to do complicated things. (In theory. There are counterexamples, but on the whole, my experience has been that this is true, and tends to work well.) However, I feel that there are a few problems.
- A given program can only easily accept one input, and produce one output.
- Both input and output are a linear sequence of characters. (It is debatable whether this is truly a problem.)
- The model, as it stands, is somewhat incompatible with GUIs.
Alternatives to each item in order:
- A given program has an arbitrary number of input/output ports.
- Each port has a specified "type" - raw binary, video, text, arrays of numbers, etc. (The likelihood of standards-war makes me waffle on this point. Perhaps it could just be marked as "16 bit raw PCM" or something, but all data is basically just raw binary streams and it's up to you to make sure they're matched correctly, as when piping output from gzip etc.)
- A GUI would display its I/O ports somewhere, and you could drag from one of one program's outputs to one of another program's inputs.
Consider, if you will, the following vision of a glorious future: You open some esoteric video format in program 1, which offers it in a raw format. You drag that output to another program 2, which splits the stream into a video output and an audio output. You drag the video from 2 to some filtering program 3 where you invert the colors, and the audio from 2 to some program 4 resembling Audacity, where you select reverb and equalization or something. You drag from 3 and 4 back to a recombiner 5, from 5 to an encoder 6, and from 6 to a streaming service 7. Then you hit go or something and you're streaming a bizarrely filtered video onto the internet, because you can.
So, my actual questions:
- Is there already a way this can be done, functional for an end user right now?
- Are there libraries that are intended and designed to allow this kind of thing?
- Are there fundamental obstacles to this that I have overlooked?
- Any other comments you feel ought to be noted?