diff options
-rw-r--r-- | TODO | 23 | ||||
-rw-r--r-- | TODO.done | 2 | ||||
-rw-r--r-- | synth/Makefile | 2 | ||||
-rw-r--r-- | synth/OPTIMIZATIONS | 13 | ||||
-rw-r--r-- | synth/in_synth_cli.cpp | 12 | ||||
-rw-r--r-- | synth/jack.cpp | 2 |
6 files changed, 28 insertions, 26 deletions
@@ -2,18 +2,17 @@ wenn man danach die noten spielen will. nicht reproduzierbar TODO für den synth + o im in-synth-cli: lfos- und snh-neusetzen ist falsch + es muss IMMER gelockt werden. + allerdings muss maybe_calc_lfos gelockt werden, die noten können + weiter bestehen o frameskip vlt nicht ++en? - o seltener cleanup rufen, stattdessen als inaktiv markieren - -> effekt: noten können wiederverwendet werden, seltenere ctor-aufrufe - + o chorus, reverb etc. + o max_pitchbend per controller setzen? + per RPN, NRPN + o nur auf bestimmte channels reagieren o RAM aufräumen? - o KSL mit powf und floats statt mit double umschreiben - o statt lfo-nummer direkten zugriff auf curr_lfo angeben? - o bei tremolo (und vibrato?): eventuell nicht prüfen, obs aktiviert - ist, sondern zur not einfach *1 rechnen? - o beim default_program vielleicht auch ein optimiertes objekt benutzen? - o jedes programm eigene LFOs? o andere wellenformen bei LFOs? @@ -24,14 +23,8 @@ TODO für den synth o attack und release ggf. auf niedrigen wert (<=0.01) initen, um knackser zu vermeiden? - o chorus, reverb etc. - o konnte-nicht-verbinden-warnung weniger schlimm machen - o max_pitchbend per controller setzen? - per RPN, NRPN - o nur auf bestimmte channels reagieren - (o)bei program change vielleicht nicht _ALLE_ controller resetten? (o)fehlerklassen für fatale fehler (von string abgeleitet) @@ -74,6 +74,8 @@ TODO für den synth x optimierung: foo++ durch ++foo ersetzen x optimierung: den relevanten iterationen: foo.end() cachen! x mehr wellen für wave[] + x wenn aufgehängt, kann er mit ctrl+c nicht mehr abgebrochen werden! + x ctrl+d führt zu bug TODO fürs CLI diff --git a/synth/Makefile b/synth/Makefile index 6258697..a9ec0a1 100644 --- a/synth/Makefile +++ b/synth/Makefile @@ -1,5 +1,5 @@ CXX=g++ -CFLAGS=-Wall -O2 +CFLAGS=-Wall -O2 -g CXXFLAGS=$(CFLAGS) LDFLAGS=-lm `pkg-config --cflags --libs jack` diff --git a/synth/OPTIMIZATIONS b/synth/OPTIMIZATIONS index 07cbcff..14d5f4f 100644 --- a/synth/OPTIMIZATIONS +++ b/synth/OPTIMIZATIONS @@ -14,6 +14,13 @@ Mögliche Optimierungen note->set_param wird unnötig pfactor-zeuch läuft extra: wird kopiert, und bei jeder pfactor-änderung mit dem pfactor verrechnet + o ??? seltener cleanup rufen, stattdessen als inaktiv markieren + -> effekt: noten können wiederverwendet werden, seltenere ctor-aufrufe + o ??? KSL mit powf und floats statt mit double umschreiben + o ??? statt lfo-nummer direkten zugriff auf curr_lfo angeben? + o ??? bei tremolo (und vibrato?): eventuell nicht prüfen, obs aktiviert + ist, sondern zur not einfach *1 rechnen? + o ??? beim default_program vielleicht auch ein optimiertes objekt benutzen? x 0% beim channel::get_sample: pro note immer mehrere samples auf einmal holen (iterator braucht recht viel leistung) wird von g++ automatisch wegoptimiert -> ok @@ -21,9 +28,3 @@ Mögliche Optimierungen Kein negativer Einfluss auf die Performance: o _virtual_ void Note::get_samples (mit time nicht erkennbar) -Mögliche Bugs und ihre Lösung: - o frequenz wird nicht genau eingehalten: phase um - foo*WAVE_RES erhöhen, entsprechend wave[][bar] ändern. - ABER: im testfall um bis zu 15% langsamer - - diff --git a/synth/in_synth_cli.cpp b/synth/in_synth_cli.cpp index fd1570d..7ca9c7d 100644 --- a/synth/in_synth_cli.cpp +++ b/synth/in_synth_cli.cpp @@ -85,12 +85,12 @@ void do_in_synth_cli() int num; if (signal(2,signal_handler)==SIG_ERR) - output_warning("WARNING: failed to set signal handler in the in-synth-cli. pressing enter will\n" + output_warning("WARNING: failed to set signal handler in the in-synth-cli. pressing ctrl+c will\n" " kill the synth, so be careful. this is not fatal"); fatal_warnings=false; - while (true) + while (cin.good()) { cout << PROMPT << flush; getline(cin,input); @@ -516,7 +516,9 @@ void do_in_synth_cli() if (freq>=0) { snh_freq_hz=freq; - init_snh(); //no uninit neccessary, as this only calculates an integer + init_snh(); //no uninit necessary, as this only calculates an integer + //no lock necessary, as a race-condition would only cause + // the snh be calculated some times more } else cout << "error: sample-and-hold-frequency must be greater than zero"<<endl; @@ -529,4 +531,8 @@ void do_in_synth_cli() cout << "error: unrecognized command '"<<command<<"'"<<endl; } } + + if (signal(2,SIG_DFL)==SIG_ERR) + output_warning("WARNING: failed to reset signal handler in the in-synth-cli. you will not be\n" + " able to kill the synth with ctrl+c, try sending SIGTERM instead"); } diff --git a/synth/jack.cpp b/synth/jack.cpp index 79c7b4a..c86cbce 100644 --- a/synth/jack.cpp +++ b/synth/jack.cpp @@ -459,7 +459,7 @@ int process_callback(jack_nframes_t nframes, void *notused) #endif // if the above changes, (1) must also change #ifdef FRAMESKIP - for (size_t k=i+frameskip-1;k>i;k--) + for (size_t k=i+frameskip-1;k>i;--k) { outbuf[j][k]=outbuf[j][i]; #ifdef STEREO |