From 742679c5adeb42a7b9a91461a3358cd7d7c4d8c1 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Wed, 13 Feb 2008 13:42:00 -0600 Subject: [PATCH] Actually mute notes outside of current mapping. --- instrument.C | 10 ++++++++-- instrument.H | 2 +- mapping.C | 4 +++- mapping.H | 2 +- pattern.C | 7 ++++--- scale.C | 8 +++++--- scale.H | 2 +- 7 files changed, 23 insertions(+), 12 deletions(-) diff --git a/instrument.C b/instrument.C index 62f636e..0c7f66e 100644 --- a/instrument.C +++ b/instrument.C @@ -113,11 +113,17 @@ Instrument::velocity ( int n, int v ) _dirty = true; } -/* Should only be passed NOTE ON/OFF events! */ -void +/** Translate event, should only be passed NOTE ON/OFF events, returns + true if note is valid for this mapping */ +bool Instrument::translate ( midievent *e ) const { + if ( ! note_name( e->note() ) ) + return false; + e->note_velocity( e->note_velocity() * _map[ e->note() ].velocity / 100 ); + + return true; } const char * diff --git a/instrument.H b/instrument.H index 24be761..b5d4079 100644 --- a/instrument.H +++ b/instrument.H @@ -55,7 +55,7 @@ public: void note_name ( int n, char *s ); /* inspection */ - void translate ( midievent *e ) const; + bool translate ( midievent *e ) const; const char * note_name ( int n ) const; int height ( void ) const; const char * name ( void ) const; diff --git a/mapping.C b/mapping.C index cd89406..a59262a 100644 --- a/mapping.C +++ b/mapping.C @@ -101,7 +101,7 @@ Mapping::key ( void ) const return _type == INSTRUMENT ? -1 : _key; } -void +bool Mapping::translate ( midievent *e ) const { switch ( _type ) @@ -111,6 +111,8 @@ Mapping::translate ( midievent *e ) const case SCALE: return _scale->translate( _key, e ); } + + return false; } int diff --git a/mapping.H b/mapping.H index 0654806..4723eaf 100644 --- a/mapping.H +++ b/mapping.H @@ -64,7 +64,7 @@ public: void key ( int n ); /* inspection */ - void translate ( midievent *e ) const; + bool translate ( midievent *e ) const; const char * note_name ( int n ) const; int velocity ( int n ) const; int key ( void ) const; diff --git a/pattern.C b/pattern.C index 6c7d5ff..ce75e87 100644 --- a/pattern.C +++ b/pattern.C @@ -454,12 +454,13 @@ try_again: if ( me.is_note_on() ) { - mapping.translate( &me ); - midi_output_event( _port, &me, 1 + e->note_duration() ); + if ( mapping.translate( &me ) ) + midi_output_event( _port, &me, 1 + e->note_duration() ); } else if ( me.is_note_off() ) - midi_output_event( _port, &me, 0 ); + if ( mapping.translate( &me ) ) + midi_output_event( _port, &me, 0 ); else /* any other event type */ midi_output_event( _port, &me ); diff --git a/scale.C b/scale.C index 338d300..81a6659 100644 --- a/scale.C +++ b/scale.C @@ -176,11 +176,13 @@ Scale::_degree ( int k, int n ) const } /* translate NOTE event. Behavior is undefined for other event types */ -void +bool Scale::translate ( int k, midievent *e ) const { - /* does nothing now... */ - /* TODO: invalidate events that are note on/offs for notes outside the scale. */ + if ( ! note_name( k, e->note() ) ) + return false; + else + return true; } const char * diff --git a/scale.H b/scale.H index dbb2220..c6411ff 100644 --- a/scale.H +++ b/scale.H @@ -41,7 +41,7 @@ public: static const char * chromatic_name ( int n ); static int octave ( int n ); - void translate ( int k, midievent *e ) const; + bool translate ( int k, midievent *e ) const; int note ( int k, int n ) const; const char * note_name ( int k, int n ) const; const char * name ( void ) const;