diff options
-rw-r--r-- | TODO | 4 | ||||
-rw-r--r-- | TODO.done | 7 | ||||
-rw-r--r-- | synth/envelope.cpp | 5 | ||||
-rw-r--r-- | synth/parser.cpp | 19 | ||||
-rw-r--r-- | synth/programs.h | 2 |
5 files changed, 31 insertions, 6 deletions
@@ -2,7 +2,9 @@ wenn man danach die noten spielen will. nicht reproduzierbar TODO für den synth - o bei envelopes: releasephase abschalten (bei sustain bleiben) + o zu testen: funktionieren no-release-envs auch in compilierten noten? + o fehlerklassen für fatale fehler (von string abgeleitet) + o im cli dürfen warnungen nicht mehr fatal sein o on-the-fly die LFOs ändern (frequenz, wellenform) o RAM aufräumen? @@ -61,7 +61,12 @@ TODO für den synth 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) + TODO fürs CLI x filter_update_frames, lfo_update_frames in config, in sec (auch im CLI) diff --git a/synth/envelope.cpp b/synth/envelope.cpp index 5678fd3..2f06a4e 100644 --- a/synth/envelope.cpp +++ b/synth/envelope.cpp @@ -1,7 +1,5 @@ #include "envelope.h" -#include <iostream> - Envelope::Envelope(env_settings_t s, int frames) { level=0; @@ -14,6 +12,9 @@ Envelope::Envelope(env_settings_t s, int frames) set_ratefactor(1.0); has_release_phase=(s.release>=0); + + if (has_release_phase) + s.hold=false; set_attack(s.attack); set_decay(s.decay); diff --git a/synth/parser.cpp b/synth/parser.cpp index 5da2175..10accac 100644 --- a/synth/parser.cpp +++ b/synth/parser.cpp @@ -594,7 +594,24 @@ program_t parse(string fn) } } - + + bool neverending_tone=false; + + for (map< parameter_t, list<term_t> >::iterator it=formula.begin(); it!=formula.end(); it++) + if ((it->first.par==OUTPUT) && (env[it->first.osc].release<0)) + neverending_tone=true; + + for (int i=0;i<n_osc;i++) + if ((osc[i].output!=0) && (env[i].release<0)) + neverending_tone=true; + + if (neverending_tone) + throw string("you have an oscillator which\n" + " may output something but has a never-ending envelope.\n" + " this would result in a tone that will never end."); + + + program_t result; diff --git a/synth/programs.h b/synth/programs.h index 9d8d8cc..1ed9d6f 100644 --- a/synth/programs.h +++ b/synth/programs.h @@ -144,7 +144,7 @@ struct env_settings_t jack_nframes_t attack; jack_nframes_t decay; fixed_t sustain; - jack_nframes_t release; + signed int release; bool hold; }; |