NOOP, remove trailing tabs/whitespace.
[ardour.git] / libs / midi++2 / channel.cc
index ed8f4da5bc2b56c7910fd263f5aa7140a4d306ae..b3cb42f59322662c601bf83e9bd20fe2b9c689de 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 1998-99 Paul Barton-Davis 
+    Copyright (C) 1998-99 Paul Barton-Davis
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 
 using namespace MIDI;
 
-Channel::Channel (MIDI::byte channelnum, Port &p) 
+Channel::Channel (MIDI::byte channelnum, Port &p)
        : _port (p)
 {
        _channel_number = channelnum;
 
        reset (0, 1, false);
-}      
+}
 
 void
 Channel::connect_signals ()
@@ -66,7 +66,7 @@ Channel::reset (timestamp_t timestamp, framecnt_t /*nframes*/, bool notes_off)
        memset (_polypress, 0, sizeof (_polypress));
        memset (_controller_msb, 0, sizeof (_controller_msb));
        memset (_controller_lsb, 0, sizeof (_controller_lsb));
-       
+
        /* zero all controllers XXX not necessarily the right thing */
 
        memset (_controller_val, 0, sizeof (_controller_val));
@@ -87,7 +87,7 @@ Channel::reset (timestamp_t timestamp, framecnt_t /*nframes*/, bool notes_off)
 }
 
 void
-Channel::process_note_off (Parser & /*parser*/, EventTwoBytes *tb) 
+Channel::process_note_off (Parser & /*parser*/, EventTwoBytes *tb)
 {
        _last_note_off = tb->note_number;
        _last_off_velocity = tb->velocity;
@@ -98,7 +98,7 @@ Channel::process_note_off (Parser & /*parser*/, EventTwoBytes *tb)
 }
 
 void
-Channel::process_note_on (Parser & /*parser*/, EventTwoBytes *tb) 
+Channel::process_note_on (Parser & /*parser*/, EventTwoBytes *tb)
 {
        _last_note_on = tb->note_number;
        _last_on_velocity = tb->velocity;
@@ -106,7 +106,7 @@ Channel::process_note_on (Parser & /*parser*/, EventTwoBytes *tb)
 }
 
 void
-Channel::process_controller (Parser & /*parser*/, EventTwoBytes *tb) 
+Channel::process_controller (Parser & /*parser*/, EventTwoBytes *tb)
 {
        unsigned short cv;
 
@@ -115,10 +115,10 @@ Channel::process_controller (Parser & /*parser*/, EventTwoBytes *tb)
           all changes *are* atomic.
        */
 
-       if (tb->controller_number <= 31) { /* unsigned: no test for >= 0 */
+       if (tb->controller_number < 32) { /* unsigned: no test for >= 0 */
 
                /* if this controller is already known to use 14 bits,
-                  then treat this value as the MSB, and combine it 
+                  then treat this value as the MSB, and combine it
                   with the existing LSB.
 
                   otherwise, just treat it as a 7 bit value, and set
@@ -128,31 +128,32 @@ Channel::process_controller (Parser & /*parser*/, EventTwoBytes *tb)
                cv = (unsigned short) _controller_val[tb->controller_number];
 
                if (_controller_14bit[tb->controller_number]) {
-                       cv = ((tb->value << 7) | (cv & 0x7f));
+                       cv = ((tb->value & 0x7f) << 7) | (cv & 0x7f);
                } else {
                        cv = tb->value;
                }
 
                _controller_val[tb->controller_number] = (controller_value_t)cv;
 
-       } else if ((tb->controller_number >= 32 && 
+       } else if ((tb->controller_number >= 32 &&
                    tb->controller_number <= 63)) {
-                  
-               cv = (unsigned short) _controller_val[tb->controller_number];
 
-               /* LSB for CC 0-31 arrived. 
+               int cn = tb->controller_number - 32;
+
+               cv = (unsigned short) _controller_val[cn];
+
+               /* LSB for CC 0-31 arrived.
 
                   If this is the first time (i.e. its currently
                   flagged as a 7 bit controller), mark the
                   controller as 14 bit, adjust the existing value
-                  to be the MSB, and OR-in the new LSB value. 
+                  to be the MSB, and OR-in the new LSB value.
 
                   otherwise, OR-in the new low 7bits with the old
                   high 7.
                */
 
-               int cn = tb->controller_number - 32;
-                  
+
                if (_controller_14bit[cn] == false) {
                        _controller_14bit[cn] = true;
                        cv = (cv << 7) | (tb->value & 0x7f);
@@ -160,53 +161,58 @@ Channel::process_controller (Parser & /*parser*/, EventTwoBytes *tb)
                        cv = (cv & 0x3f80) | (tb->value & 0x7f);
                }
 
-               _controller_val[tb->controller_number] = 
-                       (controller_value_t) cv;
+               /* update the 14 bit value */
+               _controller_val[cn] = (controller_value_t) cv;
+
+               /* also store the "raw" 7 bit value in the incoming controller
+                  value store
+               */
+               _controller_val[tb->controller_number] = (controller_value_t) tb->value;
+
        } else {
 
                /* controller can only take 7 bit values */
-               
-               _controller_val[tb->controller_number] = 
+
+               _controller_val[tb->controller_number] =
                        (controller_value_t) tb->value;
        }
 
        /* bank numbers are special, in that they have their own signal
         */
 
-       if (tb->controller_number == 0) {
-               _bank_number = (unsigned short) _controller_val[0];
+       if (tb->controller_number == 0 || tb->controller_number == 0x20) {
+               _bank_number = _controller_val[0];
                _port.parser()->bank_change (*_port.parser(), _bank_number);
                _port.parser()->channel_bank_change[_channel_number] (*_port.parser(), _bank_number);
        }
-
 }
 
 void
-Channel::process_program_change (Parser & /*parser*/, MIDI::byte val) 
+Channel::process_program_change (Parser & /*parser*/, MIDI::byte val)
 {
        _program_number = val;
 }
 
 void
-Channel::process_chanpress (Parser & /*parser*/, MIDI::byte val) 
+Channel::process_chanpress (Parser & /*parser*/, MIDI::byte val)
 {
        _chanpress = val;
 }
 
 void
-Channel::process_polypress (Parser & /*parser*/, EventTwoBytes *tb) 
+Channel::process_polypress (Parser & /*parser*/, EventTwoBytes *tb)
 {
        _polypress[tb->note_number] = tb->value;
 }
 
 void
-Channel::process_pitchbend (Parser & /*parser*/, pitchbend_t val) 
+Channel::process_pitchbend (Parser & /*parser*/, pitchbend_t val)
 {
        _pitch_bend = val;
 }
 
 void
-Channel::process_reset (Parser & /*parser*/) 
+Channel::process_reset (Parser & /*parser*/)
 {
        reset (0, 1);
 }