For experiments with synthesys algorythms for my Teensy Theremin project, I'm going to create desktop application.
Unlike score for usual instruments, theremin score is continuous pitch and volume changing, which can be drawn as lines instead of individual notes.
Screenshot from prototype:
Source code is available on GitHub.
App uses Qt and seems to be cross platform.
App can be built using Qt Creator or command line (qmake).
Theremin score is represented as pitch and volume tracks.
Pitch is floating point log scale midi note number, 0..127 (where 1 is halftone).
Volume is floating point log scale -110dB..+10dB gain.
Pitch+Volume are sampled with some high rate (1200 samples per second in current implementation).
Information from this track is enough to perform synthesys of theremin-like sound. Parameters will be interpolated during synthesys.
GUI allows to "draw" both pitch and volume tracks.
To make it sound more theremin-like, while drawing of track, restrictions should be applied on parameter change speed.
Currently, only velocity is limited (halftones per second, dB per second).
TODO:
Acceleration, and higher order derivatives must be limited as well.
It makes sense to add "drawing tool" customization - e.g. to choose between hand movement and finger movement limits.
Additional track editing tools - for various transition options between two notes.
Pitch correction tool - to move pitch in region closer to halftone center frequencies.
Optional pitch correction while drawing.
Import options:
- extract track from audio file - detect pitch and volume changes in audio
- record pitch+volume track in real time from hardware digital theremin with serial interface
Export:
- render sound file according to track, using selected instrument (synthesis preset)
Playback:
- play whole track or selection with synthesizer.
- "pitch preview" - when pointer is over pitch widget, play sound of corresponding pitch
- while drawing pitch or volume, play sound if pitch corresponding to pointer position - when looped playback of selection is not active