aboutsummaryrefslogtreecommitdiffhomepage
AgeCommit message (Collapse)AuthorFilesLines
2015-12-31support only LuaJIT and use some additional (insignificant) optimizationsRobin Haberkorn3-9/+10
2015-12-31fixed potential segfaults in MIDI processing & 1-based channelsRobin Haberkorn2-17/+28
* there are at most 128 different MIDI notes; mtof() will now also work for all of them * channels have origin 1 now in the public APIs. This is what most applications seem to use, so in order to avoid confusion it's probably a good idea to use it as well.
2015-12-31implemented basic support for MIDI NOTE ON/OFF eventsRobin Haberkorn2-30/+218
* MIDIVelocityStream will report the velocities on a particular note. This can be used to build polyphonic instruments. * MIDINoteStream will report all possible notes on a particular channel. The velocity of the note last triggered is also encoded into the stream values. This can be used to build simple monophonic instruments. * Map bit methods to stream methods, e.g. Stream:band() Is especially useful for streams that encode multiple values into single integers for performance reasons. * mtof() and ftom() methods for converting from and to MIDI note numbers. mtof() is very efficient since its values are all precalculated in a lookup table. * fixed tostring() method for streams smaller than 1024 samples
2015-11-04added simple support for MIDI CC commandsRobin Haberkorn3-3/+144
* MIDICCStream provides a stream of CC values as if polled from the controller (this is emulated in applause.c)
2015-11-03enforce minimum buffer size for lua<->realtime communication based on ↵Robin Haberkorn1-2/+17
jack_get_buffer_size()
2015-11-03fixed ZipStream for non-stream operands (like numbers)Robin Haberkorn1-1/+2
2015-11-03fixed semaphore for realtime<->lua thread synchronizationRobin Haberkorn1-8/+16
2015-11-03allow Stream:play() to be interrupted by CTRL+CRobin Haberkorn1-1/+35
* more precisely, Stream:play() will now throw an error whenever the process receices SIGINT. * this allows us to interrupt long playbacks
2015-11-03ring buffer size is configurable now via ./applause command-line parameter ↵Robin Haberkorn1-9/+32
in milliseconds * default buffer size: 100ms
2015-11-03synchronize buffer access via System V semaphoreRobin Haberkorn1-10/+74
* allows the Lua thread to block when the ringbuffer is full while keeping the realtime thread (jack_process()) realtime-safe. Hopefully :-) * since audio generation is usually faster than consumption (if you don't want to have buffer underruns), this fixes audio generation longer than BUFFER_SIZE (currently 1s)
2015-11-03report buffer underrunsRobin Haberkorn1-6/+23
2015-05-03changed semantics of the __call metamethod: create VectorStreamRobin Haberkorn1-18/+25
* the call metamethod is most useful in compositions in order to evaluate a stream to save computing power at runtime. * this meant that in addition to adding () to a stream expression it was necessary to convert the table to a stream (e.g. using tostream()). * Now the totable() method converts to a pure table, while __call returns a VectorStream. This means it will be sufficient to add "()" in order to evaluate a stream eagerly
2015-04-30added Stream.save() and SndfileStream based on FFI wrapper around libsndfileRobin Haberkorn2-0/+253
2015-04-30use LuaJIT's FFI instead of lposix library for clock_gettime()Robin Haberkorn1-5/+33
2015-04-30added RavelStream and minor changes to make streams of non-numbers possibleRobin Haberkorn1-5/+68
2015-04-28optimizations, scalar operations and ZipStream as an abstraction of stream ↵Robin Haberkorn1-138/+211
operations
2015-04-20resample() and toplot() methodsRobin Haberkorn1-0/+49
2015-04-20added bit-crusher effectRobin Haberkorn1-0/+6
2015-04-20filters: handle input streams shorter than the frequency streamRobin Haberkorn1-18/+24
2015-04-20filtering: handle frequency streams short than the input streamRobin Haberkorn1-4/+16
2015-04-20added filter streams adapted from ChucK and revised wave form functionsRobin Haberkorn1-19/+373
* LPF, HPF, BPF, BRF filters are 2nd order Butterworth filters. Derived verbatim from ChucK's implementation. This can probably be optimized by caching the tan/cos functions. Also, they do not yet handle frequency streams shorter than the stream to filter. * Basic wave forms are now Stream methods to allow concatenative style of FM synthesis (or LFOs). To generate e.g. a sine wave with constant frequency, you can still write Stream.SinOsc(440); or tostream(440):SinOsc()
2015-04-11stop garbage collector temporarily during play()Robin Haberkorn1-1/+16
This improves the real-time properties of sample generation since it avoids CPU spkikes. On the other hand, this may not be ideal as playing a long streams could have non-constant space requirements now. A proper solution would probably involve calling the garbage collector incrementally during the play() loop.
2015-04-11added custom interactive Lua interpreter for evaluating applause expressionsRobin Haberkorn4-1/+307
* implements Stream:play() using Jack as the audio backend
2015-04-09additional useful stream operationsRobin Haberkorn1-13/+54
2015-04-07replaced co-routine based implementation with closuresRobin Haberkorn1-72/+153
* this improves performance by 10 times (both lua5.1 and luajit) * also, when using luajit, there appears to be little peformance loss when using stream compositions instead of maps (which are sometimes even slower!?)
2015-04-07initial commit based on coroutinesRobin Haberkorn1-0/+462