summaryrefslogtreecommitdiff
path: root/README
diff options
context:
space:
mode:
authorMitya Selivanov <automainint@guattari.tech>2023-09-25 01:39:03 +0200
committerMitya Selivanov <automainint@guattari.tech>2023-09-25 01:39:03 +0200
commite747b343c332907110dad26e15c20daf3d7d7125 (patch)
treef7bbda928fa3e88a01f77839dd8e729929ae9ada /README
downloadsaw-e747b343c332907110dad26e15c20daf3d7d7125.zip
init
Diffstat (limited to 'README')
-rw-r--r--README118
1 files changed, 118 insertions, 0 deletions
diff --git a/README b/README
new file mode 100644
index 0000000..06efed4
--- /dev/null
+++ b/README
@@ -0,0 +1,118 @@
+Music sequencer and audio editor
+
+
+Tech
+
+- kit - https://guattari.tech/kit.git
+- sokol_app - https://github.com/floooh/sokol.git
+- nanovg - https://github.com/memononen/nanovg.git
+- miniaudio - https://github.com/mackron/miniaudio.git
+- portmidi - https://github.com/PortMidi/portmidi.git
+
+
+Algorithms
+
+- Cooley-Tukey FFT
+- Biquad filter
+
+
+Primary design
+
+
+Basic UI
+
+- Bus list
+- Bus units
+- Track editor
+- Sheet editor
+
++---------+ +-----------------------------------+ +-[ Bus A ]-------+
+[+]Bus A ^ | [ track 1 ====== ] ^ [+] Arpeggiator ^
+|---------| | | | [x] ** *** |
+[+]Bus B | | [ track 2 ============== ] | | [ ] <--> ++ |
+|---------| | | |-----------------|
+[+]Master v | v [+] Synth |
+[+]-------+ +<--------------------------------->+ | ^ ^ ^ [ ] |
+ | / \ / \ / [x] |
++----[ track 2 ]--------------------------------+ | V V [o] |
+|F > ^ |-----------------|
+|E > x x x x x | [+] Reverb |
+|D > x x x x x | | <-----> [x] [u] |
+|C > x x x x x x x v | v
++--|<------------------------------------------>+ [+]---------------+
+
+
+Modularity
+
+Music and audio features will be implemented as a separate library with no external dependencies.
+UI and audio devices will be distinct modules which can be replaced.
+
+
+Sheet data
+
+ /---------------------\
+ | |
+ | Note |
+ | |
+ | time : i64 |
+ | duration : i64 |
+ | frequency : f64 |
+ | amplitude : f64 |
+ | flavor : f64 |
+ | |
+ \---------------------/
+
+Unlike MIDI, we will allow to set any floating-point value for the note frequency.
+Time is defined as a sample index and therefore is relative to the sample rate.
+
+
+Processing
+
+A unit is a processing entity.
+
+ for each unit:
+ output[channel, time] = eval(inputs, channel, sample_rate, time)
+
+Unlike VST, time for a processing routine is one of explicit parameters.
+The processing routine can access any samples of inputs.
+This approach allows to evaluate samples non-sequentially, and even do some tricks like time-reverse effects.
+Changing the sample rate is also quite simple.
+
+
+Global matrix
+
+ /---------------------------\
+ | Matrix |
+ | |
+ | (connections data) |
+ | A.out[0] -> B.in[0] |-----------------+
+ | B.out[0] -> Master.in[0] |----------------+|
+ | B.out[1] -> Master.in[1] | ||
+ \---------------------------/ ||
+ ^ | ^^ ||(in[0], in[1])
+ | | || ||
+ | | ||(out[0], out[1]) vv
+/----------\ | | /----------\ /-----------\
+| Module A |---+ +-->| Module B | | Master |
+| (sheet) | (out[0]) (in[0]) | (synth) | | (limiter) |
+\----------/ \----------/ \-----------/
+
+The global matrix manages the information about connections between units.
+Each unit can communicate to others through the global matrix.
+Each unit can have inputs and outputs for sheet and signal channels.
+
+To get data from a producing unit, the receiving unit will request the data from the global matrix using the input index.
+The global matrix will resolve the producing unit by input index, and request data from it.
+The evaluation startes from the master and gradually reaches all required units.
+
+
+Global modifiers
+
+Special units can affect all regular units, filtered by some criteria.
+This will allow to do some global changes, e.g. change the musical scale of the entire composition.
+
+
+Customization
+
+In the matrix mode, any inputs and outputs can be connected.
+A custom unit can be created with code editor and JIT-compilation.