summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Jung <flo@thinkpad.(none)>2011-01-12 12:06:35 +0100
committerFlorian Jung <flo@thinkpad.(none)>2011-01-12 12:06:35 +0100
commit105932305adf830ec8116827761a8a8c8aff4523 (patch)
tree6449fe3fc06bf438d10539c59c3de6cac2d3ec6c
parent528902f28af1bb430ba7c7f1bf4ebbc54fb7aaf6 (diff)
Non-releasing Envelopes now work
-rw-r--r--TODO4
-rw-r--r--TODO.done7
-rw-r--r--synth/envelope.cpp5
-rw-r--r--synth/parser.cpp19
-rw-r--r--synth/programs.h2
5 files changed, 31 insertions, 6 deletions
diff --git a/TODO b/TODO
index 4b10c50..32debfe 100644
--- a/TODO
+++ b/TODO
@@ -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?
diff --git a/TODO.done b/TODO.done
index f0e9552..7e0af0c 100644
--- a/TODO.done
+++ b/TODO.done
@@ -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;
};