aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--README.md59
-rw-r--r--TODO44
3 files changed, 105 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 42740e7..bd77a2f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
/applause
*.o
+
+/.applause_history
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..bd81e57
--- /dev/null
+++ b/README.md
@@ -0,0 +1,59 @@
+# Applause 2
+
+## Installation
+
+You have to manually build and install LuaJIT v2.1:
+
+ git clone -b v2.1 https://luajit.org/git/luajit.git
+ cd luajit
+ make
+ sudo make install
+
+Furthermore, install the following dependencies:
+
+ sudo apt-get install build-essential libreadline-dev libjack-jackd2-dev \
+ libsndfile1 libasound2 feedgnuplot
+
+## Usage
+
+Start qjackctl.
+
+TODO: How to use jack-plumbing?
+
+ ./applause -o 2
+
+This may require root rights for accessing HID devices.
+You may also add the current user to the `input` group.
+
+Example (one channel):
+
+ > Stream.SinOsc(440):play()
+
+# Applause Clients (Editor Integration)
+
+ echo -ne "25 \nStream.SinOsc(440):play()" | socat -,ignoreeof TCP:127.0.0.1:10000"
+
+See also `client.tes` for a SciTECO integration.
+
+# Joysticks and Gamepads
+
+This is supported by EvdevStream().
+
+Alternatively you can use aseqjoy together with `a2jmidid --export-hw`
+to expose them as MIDI events.
+
+# Mice
+
+This is supported by EvdevStream().
+
+Alternatively you can use [raton](https://github.com/GModal/raton) together with `a2jmidid --export-hw`
+to expose them as MIDI events.
+
+# Other useful programs
+
+* jack_rec, QJackRcd or Audacity to record sessions
+* midisnoop for diplaying MIDI events
+* jack-keyboard for producing MIDI note events
+* [midicontroller](https://sourceforge.net/projects/midicontrol/) for producing MIDI CC events
+* MIDI Tracker ???
+* evtest to find and test HID devices
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..faf5d3e
--- /dev/null
+++ b/TODO
@@ -0,0 +1,44 @@
+# Bugs
+
+* Stream:foreach() cannot be interrupted
+ Perhaps C core should export an interrupted variable that we can check from Lua.i
+ For Stream:play() this is solved differently.
+* EvdevStream("TrackPoint"):evrel('REL_X'):scale(440,880):SinOsc():play()
+ Afterwards even Stream.SinOsc(880):play() will stutter.
+ However, this seems to happen only with the builtin speakers.
+
+# Features
+
+* Line Continuations on the CLI (like Lua's CLI)
+* CLI auto completions via libreadline
+* OSC support
+* Audio input (see inputstream branch)
+* File writing during live playback to avoid having to use jack_rec.
+* Multi-core support via GStreamer-like queue:
+ https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-queue.html
+* Stream optimizer
+ * Automatic caching (finding identical subtrees)
+ * Automatic paralellization
+ * ...
+* Documentation.
+ Either we use LDoc or manually write a Markdown file.
+
+# Improvements
+
+* add optional Stream:gtickCtx() containing potentially real-time unsafe code.
+ Higher-order streams call Stream:gtickCtx() for all dependant streams only
+ once in their own gtickCtx() function.
+ This will allow gtick() to be called in tick-functions (that must be real-time safe).
+* Inconsistent signal normalization.
+ Some signals like Stream:CC() are not normalized to [-1,1], so you need
+ special scaling methods like Stream:ccscale().
+ The supposed advantage is that often a signal between [0,1] is needed, so you only
+ need a single division. E.g. Stream:mul(Stream:CC(...) / 127).
+ On the other hand, with normalized outputs, you could also write Stram:mul(Stream:CC(...):scale(1)).
+ Or there could even be a Stream:vol() method that takes signals between [-1,1].
+ The question is whether the JIT compiler is smart enough to optimize this code.
+* Does the compiler currently produce SIMD instructions?
+ Perhaps we need blockwise processing to faciliate those optimizations.
+ Unfortunately, this would complicate all of the code.
+ Unless we could define a block with metamethods to allow basic arithmetics to be
+ performed just like on scalars.