summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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