-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 25.01.2014 17:04, Florian Paul Schmidt wrote:
I don't see the original message on this list, so
I'll just reply
to this one. You might have seen my recent post about the ongoing
development of teqqer (a console based tracker style midi/cv
sequencer). It is based on a simple library called teq [1] which
provides a pattern/tracker based abstraction for playing midi/cv
events over jack ports.
[snip]
Now I get into the habit of replying to myself, since I missed to
mention some points. Caution: Wall of text ahead! :D
Mario also wrote:
"[...] I am aware of the KISS principle and actually love it very
much. So if
anyone has suggestions on how to implement such a workflow/tool with
existing tools and plumbing code, I am very open to ideas and
suggestions. However, I get a feeling that what I want is only
convenient if relatively tightly integrated, so that I do not have to
tinker with too many individual tools while trying to be productive.
[...]"
I fully agree. I'm also not a fan of creating numerous connections
myself, be it either in the jack graph nor in modular synths. And
especially redoing all these connections again if I forgot to store
the connections for the current projects using e.g. the excellent
aj-snapshot.
Integrated packages like Ardour or Renoise provide lots of convenience
in that they allow one to build up a relatively complex project and
have all state be stored/restored at once as long as one is willing to
stay contained in the boundaries of that particular program. And those
programs are graphical by nature and thus almost by definition less
hackable than a more KISS/modular approach.
On the other end of the spectrum we have session managers like non,
lash, ladish, jack_session, etc. They partly solve the session storing
and restoring problem but do not help with integration.
The integration part is the interesting one. It's the part that allows
one to be not only effective, but furthermore efficient. I.e. get
results with relatively few actions.
For my electronic music projects I do not care too much about
recording audio. I'm more interested in generating audio. So what
follows is based on my preferences of making electronic music. Maybe
they overlap with yours. I have a rough idea on how to realize such a
setup. But there are some parts missing.
First of all: I'm not all opposed to user interfaces other than script
language bindings. Ideally all those interfaces that go beyond
directly scriptable stuff are console/text based because
a] They are more accessible than graphical user interfaces (or at
least a little bit easier to make accessible than GUIs). See my recent
post asking for feedback on teqqer and whether it's usable from e.g.
braille interfaces.
b] They make you think rather hard about supporting the keyboard.
Every action that requires a mouse is aside from a few exceptions an
action that is hard to hack/script/extend.
c] They force users to use the keyboard. While maybe initially a
hurdle, this leads to boosted productivity in ideal circumstances.
All those interfaces should be hackable and should therefore be
implemented in a scripting language that allows easy tinkering if the
interface has shortcomings.
So let's identify some core components for my imagined environment:
1.] A sequencer component. I like the tracker style approach to
sequencing for electronic music. That's why I started to implement
teq/teqqer. teq is a c++ sequencing backend with python bindings that
allows programatically creating patterns/songs. teqqer is a console UI
on top of that which is developed with the explicit goal of being
hackable (one goal is to make the user options themself be scripts
with full control over what actions perform in the sequencer). teq
does not only support jack_midi, but also sending control values over
jack audio ports (though this part of the implementation is still WIP)
which would allow sample accurate control of control parameters for
instruments/hosts that expose their control ports in such a manner.
I'm in discussion with falkTX (Felipe) in how to implement this in his
2.0 branch of Carla. teq/teqqer has preliminary support for
jack_transport (as of 5 am this morning ;D)
2.] A mixer/instrument abstraction component. This part is unsolved
yet but is also the really interesting part. The common usecase for my
personal workflow is this:
2a.] There exist N instruments (Samplers, VST/LV2/DSSI-Instruments, etc).
2b.] For each instrument I_n there is an associated mixer strip M_n (a
collection of plugins where signal flows linearly from the top to the
bottom - a "rack").
2c.] There exist M mixer strips B_n without an associated instrument
("busses").
2c.] And finally there's a master section into which all mixer strips
feed and which provides again a rack of effects for mastering
(dynamics, stereo processing, etc.).
The plan for 2] is to build again a scripting language library and
associated console UI which streamlines the process of setting these
up. In contrast to teq/teqqer in the sequencing component my plan here
is to reuse existing components as much as possible. Instrument
loading could be performed by Carla. Effect racks could be provided by
a different host, maybe mod-host, or jack-rack (though jack-rack is
neither hackable nor really accessible) or again by Carla. Carla
provides an OSC interface over which all the plugin setup could be
performed an it even provides a "rack mode". It is thus scriptable,
while at the same time being not really hackable due to its
complexity. But without making the effort of reinventing the wheel and
implementing yet another plugin hosts. compromises have to be made.
And falkTX is a cool guy and open to suggestions. So carla is my
plugin host of choice.
The envisioned library interface could be used in a way similarly to
this (pseudo code):
import mixer
m = mixer.mixer()
m.add_instrument("Aspect")
# This only for instruments that provide a GUI and are not
hackable/scriptable for those parts:
m.instruments[0].show_gui()
m.instruments[0].add_plugin("foldover_distortion")
m.instruments[0].plugins[0].set_parameter("gain", 0.8)
m.master.add_plugin("sc4")
m.master.plugins[0].set_parameter("threshold", 0.7)
and the library would care about loading the plugins into the plugin
host (carla), looking up plugin names and ports by name (substring
search etc.) and maintaining jack connections for the signal flow.
Alternatively a simple console based UI can be provided on top of this
library. If someone's interested in working with me on this, do not
hesitate to contact me.
3] A jack patchbay. The scriptable part is there: jack_connect,
jack_disconnect and aj-snapshot especially together with working
bash_completion are a powerful combo. Sadly the bash completion for
jack_connect seesms to be somewhat broken in ubuntu 13.10. the
jack_patchbay would only be needed to a] hook up ports from the
sequencer to the mixer or b] setting up connections that fall outside
of the scope of the mixer abstraction provided by the previous
component. Here again a simple console based UI might be provided on
top of these tools.
3.] What brings it all together:
3a.] A screen/tmux session where different components are loaded onto
different screens. E.g. teqqer on screen 0, a mixer/instrument
abstraction on screen 1, a jack patchbay on screen 2, a session
handler on screen 3, etc.. There's an unclear part about the
interaction of the session handling with the terminal multiplexer.
Oh well, this mail is already long enough. I'm open for discussions as
this topic is dear to my heart and the reason I started implementing
teq/teqqer.
Have fun,
Flo
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
Comment: Using GnuPG with Thunderbird -
http://www.enigmail.net/
iQEcBAEBAgAGBQJS5PV9AAoJEA5f4Coltk8Z4pMH/3FwjxIDQ2b3/kt/Hw4lDjiV
G7oBK5cCRHFo1bkaAlN9Oltpa+9iDKwIlWh8WNd5dNC7C8dH7Cpws6NtQ2qTPePk
/CoYYKvU/gbh8pnrDUdrXIMGNjZPPg0o63Doc7sp8dGbsgViHwmnWMlHNdsTQZiu
fXGfqx0m6Wxk/IaEM7/dQDJ5EhR2gphQye8f/Hb4JmLPAZcCnQAD8wvjXJkTEEeb
IQ17wWdNm1wrwPuosi2dRZnwLlXlRjj/3P7qK1QWoV4USckI0Wqmxp3/VlC5uHsp
lJEZm0bxOBG50ARNZxe0ZkdtFUebBnufmy63Uxz+1WnfJ6bWhzybdOhrKbQxE1s=
=xmDQ
-----END PGP SIGNATURE-----