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-pedal 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] 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