summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Jung <flo@thinkpad.(none)>2011-01-08 15:00:30 +0100
committerFlorian Jung <flo@thinkpad.(none)>2011-01-08 15:04:02 +0100
commit05a7031fceee31330ef0c82be67e143af090f981 (patch)
treea39ed20474f0c5c4f96d9030ff5138b4b3f14ea7
parent43510e6fb436b7f4926c69e584861ec6f4936dc3 (diff)
Changed always_reattack (controller 3) to legato-pedal
When in monomode, not pressing the legato pedal will cause the note always being reattacked, while pressing it will cause it to be only reattacked if it's envelopes are done (i.e., past release phase) When in polymode, the legato pedal is ignored, notes will always be reattacked, because not doing so would cause interference between the two generated sounds.
-rw-r--r--synth/README.developer1
-rw-r--r--synth/channel.cpp20
-rw-r--r--synth/channel.h5
3 files changed, 15 insertions, 11 deletions
diff --git a/synth/README.developer b/synth/README.developer
index c2ee3a2..8957815 100644
--- a/synth/README.developer
+++ b/synth/README.developer
@@ -12,7 +12,6 @@ regeln: TODO für todos. DEBUG für debugging-outputs und -dinge.
FINDMICH nur für marker, die unmittelbar gebraucht werden.
Abweichungen von General MIDI:
- controller 3 steuert always_reattack im polymode
controller 1 muss von der config definiert werden, sonst wird er ignoriert
controller 119 steuert quick-release-zeit im falle eines voice-limits.
0 bedeutet: sofort abschalten
diff --git a/synth/channel.cpp b/synth/channel.cpp
index ef215c9..6446b0f 100644
--- a/synth/channel.cpp
+++ b/synth/channel.cpp
@@ -9,7 +9,6 @@ Channel::Channel()
set_program(0);
curr_prg.controller[NO_CONT]=1;
quick_release=0;
- always_reattack=false;
portamento_frames2=portamento_frames=0;
do_portamento=false;
pitchbend=ONE;
@@ -23,6 +22,7 @@ Channel::Channel()
held_keys.clear();
sostenuto_keys.clear();
hold_pedal_pressed=false;
+ legato_pedal_pressed=false;
}
Channel::~Channel()
@@ -94,7 +94,7 @@ void Channel::note_on(int note, int vel)
{
pressed_keys.insert(note);
- if ( (n_voices==1) && (!notes.empty()) )
+ if ( (n_voices==1) && (!notes.empty()) ) //we're in monomode
{
//no need to create a new note; reuse the existing
Note *n; //i'm lazy
@@ -119,15 +119,14 @@ void Channel::note_on(int note, int vel)
//if not still active, don't do portamento
n->set_note(note,n->still_active());
n->set_vel((float)vel/128.0);
- if (always_reattack || !n->still_active()) n->reattack();
+ if ((legato_pedal_pressed==false) || !n->still_active()) n->reattack();
//no need to push back. would become #1 instead of #1
}
}
- else
+ else //we're in polymode
{
bool neednewnote=true;
- if (always_reattack)
- {
+ //if (always_reattack) always_reattack is always true when in polymode
for (it=notes.begin(); it!=notes.end(); it++)
if ( ((*it)->get_note()==note) && ((*it)->get_program()==program) )
{
@@ -138,7 +137,7 @@ void Channel::note_on(int note, int vel)
notes.erase(it);
break;
}
- }
+
if (neednewnote)
notes.push_back( new Note(note,(float)vel/128.0,
curr_prg,
@@ -195,13 +194,13 @@ void Channel::set_controller(int con,int val)
{
switch (con)
{
- case 3: always_reattack=(val>=64);
case 5: set_portamento_time(val); break;
case 7: set_volume(val); break;
case 8: set_balance(val); break;
case 65: set_portamento(val); break;
case 64: set_hold_pedal(val>=64); break;
case 66: set_sostenuto_pedal(val>=64); break;
+ case 68: set_legato_pedal(val>=64); break;
case 119: set_quick_release(val);
case 120: panic(); break;
case 121: reset_controllers(); break;
@@ -368,6 +367,11 @@ void Channel::set_sostenuto_pedal(bool newstate)
}
}
+void Channel::set_legato_pedal(bool newstate)
+{
+ legato_pedal_pressed=newstate;
+}
+
void Channel::panic()
{
list<Note*>::iterator it;
diff --git a/synth/channel.h b/synth/channel.h
index 4ddcbb3..f673294 100644
--- a/synth/channel.h
+++ b/synth/channel.h
@@ -39,7 +39,7 @@ class Channel
void set_hold_pedal(bool newstate);
void set_sostenuto_pedal(bool newstate);
-
+ void set_legato_pedal(bool newstate);
float balL, balR;
private:
@@ -57,7 +57,6 @@ class Channel
std::list<Note*> notes;
- bool always_reattack;
bool do_portamento;
int n_voices;
@@ -70,6 +69,8 @@ class Channel
set<int> held_keys;
set<int> sostenuto_keys;
+
+ bool legato_pedal_pressed;
};
#endif