- Merge the base/client/server model class trees into a single tree.
- Move the model into the UI process.
- Autogenerate model boilerplate code.
- Replace commands by arbitrary mutations directly from the UI.
- Assorted other cleanups.
- Oscillator
- VCA
- Noise
- Step Sequencer
- MIDI CC to CV
Also added the infrastructure to use Faust for creating new processors (used by the Oscillator, VCA
and Noise nodes).
Also:
- Also add ControlValueDials for a-rate control ports (and make them exposeable).
- Fix exception in UI when removing nodes with connections.
- Fix exception in PluginHost when cleaning up some LV2 plugins.
- Dump audio engine opcode list to log.
- Mostly internal refactoring without user visible changes.
- Optimize the IPC code a bit, which makes it a bit faster.
- Shutting down is a bit more reliable.
- Use a common Create/Update/Delete convention for naming commands.
- Simplify the API of the Command class.
- Add factory functions for the remaining commands in noisicaa.music.
- Rename node related stuff:
- 'pipeline graph node' -> 'node'
- 'pipeline graph connection' -> 'node connection'
- 'pipeline graph' -> 'graph'
- A new "MIDI source" node, which can feed MIDI events from any ALSA device into the graph.
- All done rt safe in C++. The older Python implementation in noisicaa.devices has been removed.
- Still quite hacky:
- It's built into the portaudio backend. There should probably be a separate "ALSA sequencer"
backend for this, with the option to have an alternative "Jack MIDI" backend. But for that I
have to figure out how to have separate backends for audio and MIDI and how that interacts
for all possible combinations.
- It just blindly connects to all readable MIDI ports, collecting all events. Filtering out
the events for a specific port (e.g. a MIDI keyboard) happens in the "MIDI source" node.
The engine should track, which ports are being used and only connect to those.
Squashed commit of the following:
commit c811be510347d1fd23abea081ba0a4d93e8cb6bf
Author: Ben Niemann <pink@odahoda.de>
Date: Mon Jan 14 03:36:18 2019 +0100
Move ALSADeviceManager to a separate file.
commit 6e5d9a2c691fdf639f0173b9dd2ebfde7f58f4f4
Author: Ben Niemann <pink@odahoda.de>
Date: Mon Jan 14 03:25:29 2019 +0100
Fix/improve tests.
commit 94b4fa253f8a4f8a84d13dd718dbaeac99fee5fe
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 13:57:07 2019 +0100
Reanimate playback from the instrument library.
commit 17a288980fc361f190876763dbe4a6a6bbd0c2b3
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 12:57:54 2019 +0100
Remove the now obsolete noisicaa.devices package.
commit aa2f9bbc1ae61295157f66948b276861dee00379
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 12:45:50 2019 +0100
Strip the PianoWidget down to just the keys.
commit 1c87b29f7abb51defa28b33f902f8de85ae7eb55
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 12:24:57 2019 +0100
Add piano to MIDI source node.
- Make BasePipelineGraphNode.pipeline_node_id globally available.
- Allow sending processor messages from the UI.
- Pass the MIDI events to the rt thread via a FIFO queue.
commit f19114e966ab2d9261fd3a86b93d2ca88e9f3fba
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 11:29:43 2019 +0100
Remove the System Out node again.
And the related Backend::input().
Not needed after all.
commit a839f259e3b8e338072be9c8b9fa58d8dc0d36a4
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 10:03:33 2019 +0100
Wire up MIDI source to events from the backend.
- Make the event buffer accessible via the block context.
- Backend creates sequence of (uri, midi) tuples.
- ProcessorMidiSource filters that list and emit list of midi events.
commit 347dc0168b00315eed233fdec40c8a9d6b5ffe41
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 09:21:36 2019 +0100
Make the main ALSA sequences listen to all output ports again.
Now also tracking new ports as they appear.
commit 86b6b7a59974c18c6078761fe1010456e5f26e43
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 09:20:52 2019 +0100
Bug fix.
commit 776dbd4a946ecfa8e178cd7e3e108a4c3519f3cb
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 08:43:47 2019 +0100
Editor tracks devices in a QAbstractItemModel.
And MIDI Source node uses that for the port selector combobox.
commit a9c578e377948d187a0ee8ede90c29cc32b337a1
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 08:42:30 2019 +0100
Also handle port changes somewhat gracefully.
commit f4cd8c7535b36e7c6b9323ff2861d72e376bac08
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 05:34:01 2019 +0100
Also handle CC events.
commit 1329e51ff9747764a2bb5c6578f3490047cee135
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 04:30:45 2019 +0100
Device manager that tracks ALSA sequencer clients.
- Allow backends to post engine notifications.
- PortAudioBackend runs a separate (non-rt) thread, with a sequencer client just for listening for
client notifications.
- Create a DeviceDescription proto for ALSA sequencer clients and post them as engine notifications.
commit 10c5b827de47479e6a8046c44cd32494693c762b
Author: Ben Niemann <pink@odahoda.de>
Date: Sun Jan 13 01:34:47 2019 +0100
A MIDI source node, which doesn't really do anything yet.
commit e09a5c70e3b950f3c6e30b81c2e8b67d65a947b3
Author: Ben Niemann <pink@odahoda.de>
Date: Sat Jan 12 11:51:36 2019 +0100
Use C string for Spec::get_buffer_idx() to avoid malloc in the audio thread.
commit 24cfffdf60a4ad888e65fe839165666ebef0f9f0
Author: Ben Niemann <pink@odahoda.de>
Date: Sat Jan 12 08:13:26 2019 +0100
Add a "System In" node to the graph and wire it up to the MIDI events from the backend.
Also rename "Audio Out" to "System Out", because that makes more sense, now that there is more than
audio being passed around.
commit 77be27b0e487b0830d913bdcc54cf56ea35114cf
Author: Ben Niemann <pink@odahoda.de>
Date: Sat Jan 12 08:10:55 2019 +0100
Add Backend::input() method to read incoming MIDI events.
Also switch to an enum for the channel arg.
commit 5c4acefc476ace640d8a0ac40d6816ca48399207
Author: Ben Niemann <pink@odahoda.de>
Date: Sat Jan 12 08:08:20 2019 +0100
PortAudioBackend also reads MIDI events into a buffer.
Very prototypish implementation. It just scans for all available devices and connects to their
outputs. Still need to think about how to deal with different devices.