1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
TODO für den synth
x knistern bei aktivem frameskip
x tremolo und vibrato: phase nurnoch ++
x rettack im monomode abschalten (sondern einfach nur freq ändern)
x bei freqänderung: aufpassen, ob nicht das programm auch geändert
wurde. wenn ja: delete && new
x note-limit
x stereo: pan/balance
x envelopes on-the-fly ändern
x programs laden
x beim note-limit: statt abzuschneiden ausblenden
x einstellmöglichkeiten via MIDI-controller
x grund-controller bearbeiten
x ein port pro channel
x controllern einen defaultwert pro programm mitgeben
x monophoner modus
x reattack
x alwaysreattack setzen können
x portamento testen
x memcheck-clean!
x memcpy durch copy() plus operator= ersetzen?
x pitch-bend
x controller-reset
x key scale level, key scale rate
x akkurates note-on
x frameskip
x globale config-datei, oder alle programs in einem verz. einlesen etc.
x auf dateifehler reagieren!
x sampler-"oscs", d.h. laden von wav-dateien, die sich sonst
wie oscs verhalten (fm möglich usw.)
x analoge synthese auf den output jeder note anwenden
x tiefpass via def.datei setzen: trem, env, res
x tiefpass via controller setzen
x osc-sync
x bei genügend xruns noten töten
x filter knackst
x bei self-mod mit faktor 1 (auch ohne filter): segfault
x bei starken vibratos: segfault, weil fm zu extrem wird
x bei bug.prog: auch ohne filter: knacksen bei den meisten noten (z.B. C)
x per velocity statt lautstärke andere params steuern
x frameskip so implementieren, dass bufsize irrelevant ist
x lfo_update_frames einstellbar machen
sollte durch frameskip dividiert werden
x tremolo- und vibrato-arrays sind mit mehreren MB zu groß!
ein wert pro sample ist unnötig. könnte auch rechenzeit in
calc_foo sparen, da seltener aufgerufen
x sample-and-hold -> fm_strength, -> freq, -> VCF
* bei osc-envelopes ggf. auch nur alle n frames neu setzen? [verschoben]
* filter optimieren? (arbeiten momentan mit floats) [verschoben]
verstehen, optimieren und dann profilen
x stimmt die stereo-implementierung? [ja]
x BUG: bei Note::set_param sollte statt dem eigentlichen param
der orig gesetzt werden und dann neu berechnet werden!
x BUG: bei release und reattack: BEIDE male die filter-envelope beachten!
x wave auf int*[] mit wave[i]=new int[] umbauen
x oscval-nullen kann in get_sample() weggelassen werden
x in get_sample(), beim aufaddieren zum out (und vmtl auch fm-)wert:
erst nach dem addieren scalen, statt für jeden faktor einzeln
x filter_envelope könnte mit anderem ctor geinitet werden (weniger schreibarbeit)
x notes compilieren und als .so-datei laden
x parser-klasse durch parse-funktion ersetzen
x sostenuto-, halte-, legato-, soft-pedal
x programme on-the-fly (um)laden
x bei envelopes: releasephase abschalten (bei sustain bleiben)
x parser: programm nicht laden, wenn nonconst- oder nonzero-osc
eine envelope ohne release hat (wenn output!=0 und
wenn in der controller-formel-liste iwas über diesen
osc steht)
x im cli dürfen warnungen nicht mehr fatal sein
TODO fürs CLI
x filter_update_frames, lfo_update_frames in config, in sec (auch im CLI)
x max_port_time einstellen
x manuelle program -> datei - mappings
x automatische mappings ( xxxIGNORIERT.prg, xxx ist die programmnummer),
alle dateien eines verzeichnisses einlesen. bei nichtexistenz
auf normalen sinus zurückfallen
x konfigdateien lesen (inhalt wie CLI-optionen)
x vibrato- und tremolo-frequenzen einstellen
x cleanup-intervall setzen
x space-sicher machen
x fehlerbehandlung:
syntaxfehler sollten übergangen werden, sofern möglich
in parser: throw!, sonst: meckern und nächste zeile parsen
x automatisch an alle midi-outs hängen
x interface div-by-zero-sicher machen
x envelope_update_frames per CLI setzen
x .so unloaden!
* lfo-maxima getrennt regeln. [abgelehnt]
x on-the-fly panic, einzelne channels, einzelne instrumente, etc
TODO für den compiler
x wenn vel_influence für foo, aber foo ist konstant null, bleibt
foo trotzdem konstant.
x vel_influence ist IMMER gegeben für output, außer wenn anders
angegeben
x *1 bzw /2 optimierungen klappen nicht?
x pfactor nicht wegoptimieren, sondern immer verwenden
x wenn sync global aus ist, kann auch osc.sync genullt werden
|