summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Jung <flo@thinkpad.(none)>2011-02-04 16:20:12 +0100
committerFlorian Jung <flo@thinkpad.(none)>2011-02-04 16:20:12 +0100
commit6ea25018546ebc099845158de7fef29c1c4fb28d (patch)
tree8e99e35949f462b5fea95411a77757e46117f096
parent12f20783b7ec8804825282fd04d9333ec83e31eb (diff)
Tiny bugfix in in-synth-cli, updated TODO and stuff
-rw-r--r--TODO23
-rw-r--r--TODO.done2
-rw-r--r--synth/Makefile2
-rw-r--r--synth/OPTIMIZATIONS13
-rw-r--r--synth/in_synth_cli.cpp12
-rw-r--r--synth/jack.cpp2
6 files changed, 28 insertions, 26 deletions
diff --git a/TODO b/TODO
index 6de4cb8..587f253 100644
--- a/TODO
+++ b/TODO
@@ -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)
diff --git a/TODO.done b/TODO.done
index 26e7e06..e354909 100644
--- a/TODO.done
+++ b/TODO.done
@@ -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