From 96384d65a67648fcbf617d2cea1fdd47b907c112 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 21 May 2008 18:07:31 +0000 Subject: More petty clean ups of MIDI stuff. Use more complete header I had laying around for MIDI controller names / depollute Automatable. git-svn-id: svn://localhost/ardour2/branches/3.0@3378 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/automatable.h | 1 - libs/ardour/ardour/midi_ring_buffer.h | 3 +- libs/ardour/ardour/smf_reader.h | 2 - libs/ardour/automatable.cc | 189 +--------------------------- libs/ardour/smf_reader.cc | 17 +-- libs/midi++2/midi++/events.h | 7 +- libs/midi++2/midi++/names.h | 228 ++++++++++++++++++++++++++++++++++ 7 files changed, 238 insertions(+), 209 deletions(-) create mode 100644 libs/midi++2/midi++/names.h (limited to 'libs') diff --git a/libs/ardour/ardour/automatable.h b/libs/ardour/ardour/automatable.h index 5efa4f7b8d..a2c1d98ae7 100644 --- a/libs/ardour/ardour/automatable.h +++ b/libs/ardour/ardour/automatable.h @@ -66,7 +66,6 @@ public: virtual bool find_next_event(nframes_t start, nframes_t end, ControlEvent& ev) const; virtual string describe_parameter(Parameter param); - static string get_name_for_cc_number (uint32_t cc_number); virtual float default_parameter_value(Parameter param) { return 1.0f; } virtual void clear_automation(); diff --git a/libs/ardour/ardour/midi_ring_buffer.h b/libs/ardour/ardour/midi_ring_buffer.h index 76cefd57a1..2a1d771792 100644 --- a/libs/ardour/ardour/midi_ring_buffer.h +++ b/libs/ardour/ardour/midi_ring_buffer.h @@ -172,7 +172,7 @@ MidiRingBufferBase::read(size_t size, T* dst) : _size - priv_read_ptr; memcpy(dst, &_buf[priv_read_ptr], read_size); - + g_atomic_int_set(&_read_ptr, (priv_read_ptr + read_size) % _size); return read_size; @@ -213,7 +213,6 @@ MidiRingBufferBase::skip(size_t size) } - template inline void MidiRingBufferBase::write(size_t size, const T* src) diff --git a/libs/ardour/ardour/smf_reader.h b/libs/ardour/ardour/smf_reader.h index a96ef6bf7f..e41dcc3bc4 100644 --- a/libs/ardour/ardour/smf_reader.h +++ b/libs/ardour/ardour/smf_reader.h @@ -53,7 +53,6 @@ public: const std::string& filename() const { return _filename; }; - //TimeUnit unit() const { return _unit; } uint16_t type() const { return _type; } uint16_t ppqn() const { return _ppqn; } uint16_t num_tracks() const { return _num_tracks; } @@ -74,7 +73,6 @@ protected: std::string _filename; FILE* _fd; - //TimeUnit _unit; uint16_t _type; uint16_t _ppqn; uint16_t _num_tracks; diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index 067e64a870..3c076c371a 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -192,7 +193,6 @@ Automatable::control (Parameter parameter) const } } - string Automatable::describe_parameter (Parameter param) { @@ -203,12 +203,8 @@ Automatable::describe_parameter (Parameter param) } else if (param.type() == PanAutomation) { return (string_compose(_("Pan %1"), param.id())); } else if (param.type() == MidiCCAutomation) { - string name = get_name_for_cc_number(param.id()); - if(name.length() != 0) { - return string_compose("%1 [%2]", name, int(param.channel()) + 1); - } else { - return string_compose("CC %1 [%2]", param.id(), int(param.channel()) + 1); - } + return string_compose("CC %1 (%2) [%3]", + param.id(), midi_name(param.id()), int(param.channel()) + 1); } else if (param.type() == MidiPgmChangeAutomation) { return string_compose("Program [%1]", int(param.channel()) + 1); } else if (param.type() == MidiPitchBenderAutomation) { @@ -220,185 +216,6 @@ Automatable::describe_parameter (Parameter param) } } -string -Automatable::get_name_for_cc_number (uint32_t cc_number) -{ - string name; - - switch (cc_number) { - case 0: - name = "Upper Bank"; - break; - - case 32: - name = "Lower Bank"; - break; - - case 1: - name = "Modulation MSB"; - break; - - case 2: - name = "Breath Controller"; - break; - - case 4: - name = "Foot Controller"; - break; - - case 5: - name = "Portamento Time"; - break; - - case 6: - name = "RPN Controller"; - break; - - case 7: - name = "Main Volume"; - break; - - case 8: - name = "Balance"; - break; - - case 10: - name = "Panorama"; - break; - - case 11: - name = "Expression"; - break; - - case 12: - name = "Effect 1"; - break; - - case 13: - name = "Effect 2"; - break; - - case 16: - case 17: - case 18: - case 19: - name = string_compose("General Purpose %1", cc_number - 15); - break; - - case 64: - name = "Sustain Pedal"; - break; - - case 65: - name = "Portamento"; - break; - - case 66: - name = "Sostenuto"; - break; - - case 67: - name = "Soft Pedal"; - break; - - case 68: - name = "Legato Footswitch"; - break; - - case 69: - name = "Hold 2"; - break; - - case 70: - case 71: - case 72: - case 73: - case 74: - name = string_compose("Sound Controller %1", cc_number - 69); - break; - - case 80: - case 81: - case 82: - case 83: - name = string_compose("General Purpose %1", cc_number - 75); - break; - - case 84: - name = "Portamento Control"; - break; - - case 91: - case 92: - case 93: - case 94: - case 95: - name = string_compose("Effects %1 Depth", cc_number - 90); - break; - - case 96: - name = "Data Increment RPN/NRPN"; - break; - - case 97: - name = "Data Decrement RPN/NRPN"; - break; - - case 98: - name = "NRPN LSB"; - break; - - case 99: - name = "NRPN MSB"; - break; - - case 100: - name = "RPN LSB"; - break; - - case 101: - name = "RPN MSB"; - break; - - case 120: - name = "all sounds off"; - break; - - case 121: - name = "Controller Reset"; - break; - - case 122: - name = "Local Control on/off"; - break; - - case 123: - name = "all notes off"; - break; - - case 124: - name = "omni off"; - break; - - case 125: - name = "omni on"; - break; - - case 126: - name = "mono on / poly off"; - break; - - case 127: - name = "poly on / mono off"; - break; - - default: - break; - } - - return name; -} - void Automatable::can_automate (Parameter what) { diff --git a/libs/ardour/smf_reader.cc b/libs/ardour/smf_reader.cc index c5e715c2ce..48ec3dc386 100644 --- a/libs/ardour/smf_reader.cc +++ b/libs/ardour/smf_reader.cc @@ -32,9 +32,8 @@ using namespace std; namespace ARDOUR { -SMFReader::SMFReader(const std::string filename) +SMFReader::SMFReader(const string filename) : _fd(NULL) - //, _unit(TimeUnit::BEATS, 192) , _ppqn(0) , _track(0) , _track_size(0) @@ -87,7 +86,6 @@ SMFReader::open(const string& filename) throw (logic_error, UnsupportedTime) _num_tracks = GUINT16_FROM_BE(num_tracks_be); // Read PPQN (bytes 12..13) - uint16_t ppqn_be = 0; fread(&ppqn_be, 2, 1, _fd); _ppqn = GUINT16_FROM_BE(ppqn_be); @@ -96,8 +94,6 @@ SMFReader::open(const string& filename) throw (logic_error, UnsupportedTime) if ((_ppqn & 0x8000) != 0) throw UnsupportedTime(); - //_unit = TimeUnit::beats(_ppqn); - seek_to_track(1); return true; @@ -131,7 +127,6 @@ SMFReader::seek_to_track(unsigned track) throw (std::logic_error) if (!strcmp(id, "MTrk")) { ++track_pos; - //std::cerr << "Found track " << track_pos << endl; } else { std::cerr << "Unknown chunk ID " << id << endl; } @@ -188,10 +183,6 @@ SMFReader::read_event(size_t buf_len, assert(ev_size); assert(delta_time); - //cerr.flags(ios::hex); - //cerr << "SMF - Reading event at offset 0x" << ftell(_fd) << endl; - //cerr.flags(ios::dec); - // Running status state static uint8_t last_status = 0; static uint32_t last_size = 0; @@ -209,12 +200,10 @@ SMFReader::read_event(size_t buf_len, status = last_status; *ev_size = last_size; fseek(_fd, -1, SEEK_CUR); - //cerr << "RUNNING STATUS, size = " << *ev_size << endl; } else { last_status = status; *ev_size = midi_event_size(status) + 1; last_size = *ev_size; - //cerr << "NORMAL STATUS, size = " << *ev_size << endl; } buf[0] = (uint8_t)status; @@ -231,7 +220,6 @@ SMFReader::read_event(size_t buf_len, cerr << size << endl;*/ if ((uint8_t)type == 0x2F) { - //cerr << "SMF - hit EOT" << endl; return -1; // we hit the logical EOF anyway... } else { fseek(_fd, size, SEEK_CUR); @@ -240,7 +228,7 @@ SMFReader::read_event(size_t buf_len, } if (*ev_size > buf_len || *ev_size == 0 || feof(_fd)) { - //cerr << "Skipping event" << endl; + //cerr << "SMF - Skipping event" << endl; // Skip event, return 0 fseek(_fd, *ev_size - 1, SEEK_CUR); return 0; @@ -248,6 +236,7 @@ SMFReader::read_event(size_t buf_len, // Read event, return size if (ferror(_fd)) throw CorruptFile(); + fread(buf+1, 1, *ev_size - 1, _fd); if ((buf[0] & 0xF0) == 0x90 && buf[2] == 0) { diff --git a/libs/midi++2/midi++/events.h b/libs/midi++2/midi++/events.h index f7e2442109..1f8e63eea2 100644 --- a/libs/midi++2/midi++/events.h +++ b/libs/midi++2/midi++/events.h @@ -18,9 +18,8 @@ * */ -#ifndef MIDI_H -#define MIDI_H - +#ifndef __midievents_h__ +#define __midievents_h__ /** * \defgroup midi MIDI Definitions @@ -133,4 +132,4 @@ /** \} */ -#endif /* MIDI_H */ +#endif /* __midievents_h__ */ diff --git a/libs/midi++2/midi++/names.h b/libs/midi++2/midi++/names.h new file mode 100644 index 0000000000..a02fed8a3d --- /dev/null +++ b/libs/midi++2/midi++/names.h @@ -0,0 +1,228 @@ +/* Names of standard MIDI events and controllers. + * Copyright (C) 2007-2008 Dave Robillard + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __midinames_h__ +#define __midinames_h__ + +#include "events.h" + + +/** \group midi + */ + +/** Pass this a symbol defined in events.h (e.g. MIDI_CTL_PAN) to get the + * short name of a MIDI event/controller according to General MIDI. + */ +inline static const char* midi_name(uint8_t status) +{ + switch (status) { + + case MIDI_CMD_NOTE_OFF: + return "Note Off"; break; + case MIDI_CMD_NOTE_ON: + return "Note On"; break; + case MIDI_CMD_NOTE_PRESSURE: + return "Key Pressure"; break; + case MIDI_CMD_CONTROL: + return "Control Change"; break; + case MIDI_CMD_PGM_CHANGE: + return "Program Change"; break; + case MIDI_CMD_CHANNEL_PRESSURE: + return "Channel Pressure"; break; + case MIDI_CMD_BENDER: + return "Pitch Bender"; break; + + case MIDI_CMD_COMMON_SYSEX: + return "Sysex (System Exclusive) Begin"; break; + case MIDI_CMD_COMMON_MTC_QUARTER: + return "MTC Quarter Frame"; break; + case MIDI_CMD_COMMON_SONG_POS: + return "Song Position"; break; + case MIDI_CMD_COMMON_SONG_SELECT: + return "Song Select"; break; + case MIDI_CMD_COMMON_TUNE_REQUEST: + return "Tune Request"; break; + case MIDI_CMD_COMMON_SYSEX_END: + return "End of Sysex"; break; + case MIDI_CMD_COMMON_CLOCK: + return "Clock"; break; + case MIDI_CMD_COMMON_TICK: + return "Tick"; break; + case MIDI_CMD_COMMON_START: + return "Start"; break; + case MIDI_CMD_COMMON_CONTINUE: + return "Continue"; break; + case MIDI_CMD_COMMON_STOP: + return "Stop"; break; + case MIDI_CMD_COMMON_SENSING: + return "Active Sensing"; break; + case MIDI_CMD_COMMON_RESET: + return "Reset"; break; + + case MIDI_CTL_MSB_BANK: + return "Bank Select (Coarse)"; break; + case MIDI_CTL_MSB_MODWHEEL: + return "Modulation (Coarse)"; break; + case MIDI_CTL_MSB_BREATH: + return "Breath (Coarse)"; break; + case MIDI_CTL_MSB_FOOT: + return "Foot (Coarse)"; break; + case MIDI_CTL_MSB_PORTAMENTO_TIME: + return "Portamento Time (Coarse)"; break; + case MIDI_CTL_MSB_DATA_ENTRY: + return "Data Entry (Coarse)"; break; + case MIDI_CTL_MSB_MAIN_VOLUME: + return "Main Volume (Coarse)"; break; + case MIDI_CTL_MSB_BALANCE: + return "Balance (Coarse)"; break; + case MIDI_CTL_MSB_PAN: + return "Pan (Coarse)"; break; + case MIDI_CTL_MSB_EXPRESSION: + return "Expression (Coarse)"; break; + case MIDI_CTL_MSB_EFFECT1: + return "Effect 1 (Coarse)"; break; + case MIDI_CTL_MSB_EFFECT2: + return "Effect 2 (Coarse)"; break; + case MIDI_CTL_MSB_GENERAL_PURPOSE1: + return "General Purpose 1 (Coarse)"; break; + case MIDI_CTL_MSB_GENERAL_PURPOSE2: + return "General Purpose 2 (Coarse)"; break; + case MIDI_CTL_MSB_GENERAL_PURPOSE3: + return "General Purpose 3 (Coarse)"; break; + case MIDI_CTL_MSB_GENERAL_PURPOSE4: + return "General Purpose 4 (Coarse)"; break; + case MIDI_CTL_LSB_BANK: + return "Bank Select (Fine)"; break; + case MIDI_CTL_LSB_MODWHEEL: + return "Modulation (Fine)"; break; + case MIDI_CTL_LSB_BREATH: + return "Breath (Fine)"; break; + case MIDI_CTL_LSB_FOOT: + return "Foot (Fine)"; break; + case MIDI_CTL_LSB_PORTAMENTO_TIME: + return "Portamento Time (Fine)"; break; + case MIDI_CTL_LSB_DATA_ENTRY: + return "Data Entry (Fine)"; break; + case MIDI_CTL_LSB_MAIN_VOLUME: + return "Main Volume (Fine)"; break; + case MIDI_CTL_LSB_BALANCE: + return "Balance (Fine)"; break; + case MIDI_CTL_LSB_PAN: + return "Pan (Fine)"; break; + case MIDI_CTL_LSB_EXPRESSION: + return "Expression (Fine)"; break; + case MIDI_CTL_LSB_EFFECT1: + return "Effect 1 (Fine)"; break; + case MIDI_CTL_LSB_EFFECT2: + return "Effect 2 (Fine)"; break; + case MIDI_CTL_LSB_GENERAL_PURPOSE1: + return "General Purpose 1 (Fine)"; break; + case MIDI_CTL_LSB_GENERAL_PURPOSE2: + return "General Purpose 2 (Fine)"; break; + case MIDI_CTL_LSB_GENERAL_PURPOSE3: + return "General Purpose 3 (Fine)"; break; + case MIDI_CTL_LSB_GENERAL_PURPOSE4: + return "General Purpose 4 (Fine)"; break; + case MIDI_CTL_SUSTAIN: + return "Sustain Pedal"; break; + case MIDI_CTL_PORTAMENTO: + return "Portamento"; break; + case MIDI_CTL_SOSTENUTO: + return "Sostenuto"; break; + case MIDI_CTL_SOFT_PEDAL: + return "Soft Pedal"; break; + case MIDI_CTL_LEGATO_FOOTSWITCH: + return "Legato Foot Switch"; break; + case MIDI_CTL_HOLD2: + return "Hold2"; break; + case MIDI_CTL_SC1_SOUND_VARIATION: + return "Sound Variation"; break; + case MIDI_CTL_SC2_TIMBRE: + return "Sound Timbre"; break; + case MIDI_CTL_SC3_RELEASE_TIME: + return "Sound Release Time"; break; + case MIDI_CTL_SC4_ATTACK_TIME: + return "Sound Attack Time"; break; + case MIDI_CTL_SC5_BRIGHTNESS: + return "Sound Brightness"; break; + case MIDI_CTL_SC6: + return "Sound Control 6"; break; + case MIDI_CTL_SC7: + return "Sound Control 7"; break; + case MIDI_CTL_SC8: + return "Sound Control 8"; break; + case MIDI_CTL_SC9: + return "Sound Control 9"; break; + case MIDI_CTL_SC10: + return "Sound Control 10"; break; + case MIDI_CTL_GENERAL_PURPOSE5: + return "General Purpose 5"; break; + case MIDI_CTL_GENERAL_PURPOSE6: + return "General Purpose 6"; break; + case MIDI_CTL_GENERAL_PURPOSE7: + return "General Purpose 7"; break; + case MIDI_CTL_GENERAL_PURPOSE8: + return "General Purpose 8"; break; + case MIDI_CTL_PORTAMENTO_CONTROL: + return "Portamento Control"; break; + case MIDI_CTL_E1_REVERB_DEPTH: + return "Reverb Depth"; break; + case MIDI_CTL_E2_TREMOLO_DEPTH: + return "Tremolo Depth"; break; + case MIDI_CTL_E3_CHORUS_DEPTH: + return "Chorus Depth"; break; + case MIDI_CTL_E4_DETUNE_DEPTH: + return "Detune Depth"; break; + case MIDI_CTL_E5_PHASER_DEPTH: + return "Phaser Depth"; break; + case MIDI_CTL_DATA_INCREMENT: + return "Data Increment"; break; + case MIDI_CTL_DATA_DECREMENT: + return "Data Decrement"; break; + case MIDI_CTL_NONREG_PARM_NUM_LSB: + return "Non-registered Parameter Number"; break; + case MIDI_CTL_NONREG_PARM_NUM_MSB: + return "Non-registered Narameter Number"; break; + case MIDI_CTL_REGIST_PARM_NUM_LSB: + return "Registered Parameter Number"; break; + case MIDI_CTL_REGIST_PARM_NUM_MSB: + return "Registered Parameter Number"; break; + case MIDI_CTL_ALL_SOUNDS_OFF: + return "All Sounds Off"; break; + case MIDI_CTL_RESET_CONTROLLERS: + return "Reset Controllers"; break; + case MIDI_CTL_LOCAL_CONTROL_SWITCH: + return "Local Control Switch"; break; + case MIDI_CTL_ALL_NOTES_OFF: + return "All Notes Off"; break; + case MIDI_CTL_OMNI_OFF: + return "Omni Off"; break; + case MIDI_CTL_OMNI_ON: + return "Omni On"; break; + case MIDI_CTL_MONO1: + return "Mono 1"; break; + case MIDI_CTL_MONO2: + return "Mono 2"; break; + default: + return "Unnamed"; break; + } +} + +#endif /* __midinames_h__ */ + -- cgit v1.2.3