Still curious about RAUL. As i have no immediate plans beyond learning how
to write proper audio app, even if license restrictions prevent from using
RAUL in a hypothetical commercial product years down the road, it may well
be worth me using for my own personal needs in the meantime.
Would love to hear feedback on technical merits of RAUL, minus license
conversations which now have my other thread. ;-)
heck I'd like to hear about any other libraries worth looking into too. I'm
trending at the moment to STK, embedded csound, Jack, and QT for gui. The
part I need library help with is likely synchronization and
interprocess/interthread communication. ( ie do I use the jack ringbuffer?
Do I look at boost queue implementations? does RAUL have a higher level
convenience ring buffer?
thanks!
iain
I found it on Dave's site, but other than that, couldn't find find much
mention of it. Do many people use it? Would it be wise to dig into RAUL for
writing a real time jack app?
Dave, any comments on it?
http://drobilla.net/software/raul/
thanks
iain
Can anyone point me at what they consider the best thing to look at for an
introduction to communication between threads in a jack app using the
ringbuffer?
I found some, but as docs appear a bit scattered, wondered if there was a
known best-first-reference type thing.
thanks
iain
this is totally prealpha-OMG-IT'S-FULL-OFF-FAIL-state..
https://github.com/fps/jiss
requirements: SWIG, libjack-dev and liblua5.1-dev on ubuntu..
compile with make (if it fails, you're on your own. it's a simple
makefile though). then run in the build dir:
lua wicked.lua
if you have jass running with a piano sample on midi channel 0, a bass
drum on channel 1 and a hihat on 2 you should get a rather weird
interpretation of "stella by starlight", a jazz standard..
something like this (some effects added with jack-rack):
http://shirkhan.dyndns.org/~tapas/stella.ogg
(wicked.lua code here with some omission of some chords at the start and
some remarks in comments added):
-- some stuff :D
require "jiss"
require "jissing"
-- create engine in stopped state
e = jiss.engine()
-- setup some state that the sequences later use
-- e:run can only be used when the engine is stopped..
-- as this is executed in non-RT context it's ok to
-- create some variables and tables here..
e:run([[
bar = 0;
min = 20;
max = 80;
stella = {
range(min, 80, min7b5(E(4))),
range(min, 80, min7b5(E(4))),
-- cut away quite a bit here (see wicked.lua in git clone) :D
range(min, 80, maj7s11(B(4)-1)),
range(min, 80, maj7s11(B(4)-1))
}
]])
-- this sequence can control the others since it's processed before
-- the others in the engine
-- events string is newline sensitive. in this case the events
-- on consecutive lines are spaced 1 second apart..
-- also: loop back to 0 at time t = 8 sec
tune = seq(e, "tune", loop_events(8, events_string(1, [[
drums1:relocate(0.0); drums1:start_(); notes:relocate(0.0);
notes:start_()
drums1:stop_();
]])))
-- manually start this sequence and add to the engine
tune:start()
-- note that a copy is appended to the engine
e:append(tune)
-- a sequence that controls the global variable bar to advance through
the song
play(e, seq(e, "control", loop_events(1, events_string(1, [[
bar = bar + 1; bar = (bar % #stella);
]]))))
-- events at fixed times. loop at t = 0.75 sec
play(e, seq(e, "notes",
loop_events(0.75, {
{ 0.125, [[ for i = 1,4 do note_on(0, 24 +
stella[bar][math.random(#stella[bar])], 30 + math.random()*64) end
]] },
{ 0.5, [[ for i = 1,2 do note_on(0, 24 +
stella[bar][math.random(#stella[bar])], 10 + math.random()*34) end ]] }
})))
-- a drum pattern
drums = [[
note_on(1, 64, 127); note_on(2, 64, 127)
note_on(2, 64, 127)
note_on(2, 64, math.random(127))
note_on(2, 64, math.random(127))
note_on(2, 42, 110)
note_on(2, 64, 127)
note_on(2, 64, math.random(127))
note_on(1, 64, 127); note_on(2, 64, 127)
note_on(2, 64, math.random(127))
]]
play(e, seq(e, "drums1", loop_events(1, events_string(0.125/2, drums))))
-- connect all sequence outputs to jass:in
connect(e,"jass:in")
-- run the whole thing
e:start()
-- wait for the user to press enter
io.stdin:read'*l'
Have fun,
Flo
Thanks everyone for all the help on my architecture questions. It seems
like a lot of the best practise functionality has tools/components for it
already in Jack. I *was* planning on using rtaudio in order to be cross
platform, but if it's a lot easier to get things done in Jack, i could live
with being limited to linux and OS X.
Just wondered if I could poll opinions, for a real time step sequencer
meant to do super tight timing and by syncable with other apps, is Jack
going to be a lot easier to work with? Should I just lay into the jack
tutorials?
And is it straightforward to use the perry cook stk in a jack app?
thanks everyone
iain
Hi All,
Recent thoughts of mine include changing the "direction" of operations in
real-time program design:
Eg: Don't call a set() on a Filter class to tell it its cutoff, every time
there's a change,
but make it ask a State class what its cutoff should be every time it runs.
I'm now considering implementing this pattern, but I'm wondering have
others done this before?
Along the same lines, say I have a single linked list of AudioElements, and
the 3rd element needs info, should
it request it, be told it, or have some other system to inform it of events?
I'm seeing downsides to each approach:
1: Tell it on every change -> performance hit
2: Request it every time it runs -> Keeping control over the many values &
unique ID's of class instances
Experience & Opinions all welcomed, -Harry
David's advice is right on.
> why not use audio rate control ports? Or some sort of hybrid, allowing
> you to
> switch as needed - but that quickly becomes a complexity explosion...
I use a hybrid where ports are audio-rate AND each port has two states:
'streaming' or 'static'. So if you don't want audio-rate modulation, you
pass a buffer of identical values and set the port state 'static' (not
changing).
The advantage is: 'Dumb' plugins need no special-case code, just write them
as though the port was always audio-rate, one single simple code-base.
'Smart' plugins can query the port state and switch to more efficient code
when the port is 'static', e.g. read only the first sample, treat it like a
block-accurate parameter (i.e. Far more efficient).
Best Regards,
Jeff
Hi,
I spent a few hours here and there to work on jass. Thus I give you
release 0.9 which is fairly feature complete. But it might still have a
gazillion of bugs. So please test, before I go 1.0..
http://shirkhan.dyndns.org/~tapas/Jass-0.9.tar.bz2
Jass - A Jack Simple Sampler
Qt4-, libsamplerate-, libsndfile-, jack_midi-, jack_session-,
ladish-L1-enabled sampler..
Changes (AFAICT):
* graphical editors for most parameters (those can be resized to suite
your needs)
* waveform display to set sample start/end, loop start/end
* keyboard widget to set note, min note and max note
* a retarded dial_widget that is barely usable :D
* global voice allocation (you can set the global polyphony per setup in
the xml file
* ADSR envelope that actually works
* show/hide some parameter sections
Screenshot (showing all parameter editors):
http://i.imgur.com/Ssc4F.png
Regards,
Flo
Hey everyone, especially those who have been helping me with me
architecture questions. I'm wondering whether some of you would be
interested in helping in a simple advisory/editorial capacity if I were to
try to write up a wiki or e-book of some kind on real time audio
architecture. It seems to me like there is a lot of knowledge here on it,
and not very many (if any) good starting points for such things. I've found
decent references on the dsp side of audio coding, but not seen anything on
'how to put together a real time audio app from a-z' kind of thing. I find
writing docs helps me clarify things in my head, I'd be interested in doing
some writing if I know that people who know what they are doing would be
interested in advising and correcting. I figured if I put it online it
might be a good source of publicity for your work and we could link back to
projects ( ardour, etc, )
It would take a while of course, but might also help people new to these
lists and give us all some thing to point at and say: there's a good write
up on that here ->
thoughts?
iain