diff options
author | Robin Gareus <robin@gareus.org> | 2014-09-24 01:04:19 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-09-24 01:26:51 +0200 |
commit | b355f01aa56e29365b228bd3b151a62e89ed938f (patch) | |
tree | c64a1c855351f12f8b52a77b7c61d84d00c1326b /libs | |
parent | 99a484f1939a685cbfde14dfe90fddeccbacdbf6 (diff) |
DummyBackend: MIDI Event Generators
Diffstat (limited to 'libs')
-rw-r--r-- | libs/backends/dummy/dummy_audiobackend.cc | 165 | ||||
-rw-r--r-- | libs/backends/dummy/dummy_audiobackend.h | 39 | ||||
-rw-r--r-- | libs/backends/dummy/dummy_midi_seq.h | 726 |
3 files changed, 884 insertions, 46 deletions
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc index ce78c96321..9ec8f8e00e 100644 --- a/libs/backends/dummy/dummy_audiobackend.cc +++ b/libs/backends/dummy/dummy_audiobackend.cc @@ -24,6 +24,7 @@ #include <glibmm.h> #include "dummy_audiobackend.h" +#include "dummy_midi_seq.h" #include "pbd/error.h" #include "ardour/port_manager.h" @@ -48,6 +49,7 @@ DummyAudioBackend::DummyAudioBackend (AudioEngine& e, AudioBackendInfo& info) , _n_outputs (0) , _n_midi_inputs (0) , _n_midi_outputs (0) + , _enable_midi_generators (false) , _systemic_input_latency (0) , _systemic_output_latency (0) , _processed_samples (0) @@ -267,9 +269,11 @@ std::vector<std::string> DummyAudioBackend::enumerate_midi_options () const { if (_midi_options.empty()) { - _midi_options.push_back (_("1 in, 1 out")); - _midi_options.push_back (_("2 in, 2 out")); - _midi_options.push_back (_("8 in, 8 out")); + _midi_options.push_back (_("No MIDI I/O")); + _midi_options.push_back (_("1 in, 1 out, Silence")); + _midi_options.push_back (_("2 in, 2 out, Silence")); + _midi_options.push_back (_("8 in, 8 out, Silence")); + _midi_options.push_back (_("Midi Event Generators")); } return _midi_options; } @@ -277,15 +281,20 @@ DummyAudioBackend::enumerate_midi_options () const int DummyAudioBackend::set_midi_option (const std::string& opt) { - if (opt == _("1 in, 1 out")) { + _enable_midi_generators = false; + if (opt == _("1 in, 1 out, Silence")) { _n_midi_inputs = _n_midi_outputs = 1; } - else if (opt == _("2 in, 2 out")) { + else if (opt == _("2 in, 2 out, Silence")) { _n_midi_inputs = _n_midi_outputs = 2; } - else if (opt == _("8 in, 8 out")) { + else if (opt == _("8 in, 8 out, Silence")) { _n_midi_inputs = _n_midi_outputs = 8; } + else if (opt == _("Midi Event Generators")) { + _n_midi_inputs = _n_midi_outputs = NUM_MIDI_EVENT_GENERATORS; + _enable_midi_generators = true; + } else { _n_midi_inputs = _n_midi_outputs = 0; } @@ -322,6 +331,7 @@ DummyAudioBackend::_start (bool /*for_latency_measurement*/) PBD::info << _("DummyAudioBackend: port '") << (*it)->name () << "' exists." << endmsg; } _system_inputs.clear(); + _system_midi_in.clear(); _ports.clear(); } @@ -672,8 +682,8 @@ DummyAudioBackend::register_system_ports() const int a_ins = _n_inputs > 0 ? _n_inputs : 8; const int a_out = _n_outputs > 0 ? _n_outputs : 8; - const int m_ins = _n_midi_inputs > 0 ? _n_midi_inputs : 2; - const int m_out = _n_midi_outputs > 0 ? _n_midi_outputs : 2; + const int m_ins = _n_midi_inputs; + const int m_out = _n_midi_outputs; /* audio ports */ lr.min = lr.max = _samples_per_period + _systemic_input_latency; @@ -704,6 +714,10 @@ DummyAudioBackend::register_system_ports() PortHandle p = add_port(std::string(tmp), DataType::MIDI, static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal)); if (!p) return -1; set_latency_range (p, false, lr); + _system_midi_in.push_back (static_cast<DummyMidiPort*>(p)); + if (_enable_midi_generators) { + static_cast<DummyMidiPort*>(p)->setup_generator (i % NUM_MIDI_EVENT_GENERATORS, _samplerate); + } } lr.min = lr.max = _samples_per_period + _systemic_output_latency; @@ -722,6 +736,7 @@ DummyAudioBackend::unregister_ports (bool system_only) { size_t i = 0; _system_inputs.clear(); + _system_midi_in.clear(); while (i < _ports.size ()) { DummyPort* port = _ports[i]; if (! system_only || (port->is_physical () && port->is_terminal ())) { @@ -1061,6 +1076,9 @@ DummyAudioBackend::main_process_thread () for (std::vector<DummyAudioPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it) { (*it)->next_period(); } + for (std::vector<DummyMidiPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it) { + (*it)->next_period(); + } if (engine.process_callback (_samples_per_period)) { return 0; @@ -1174,6 +1192,8 @@ DummyPort::DummyPort (DummyAudioBackend &b, const std::string& name, PortFlags f : _dummy_backend (b) , _name (name) , _flags (flags) + , _rseed (0) + , _gen_cycle (false) { _capture_latency_range.min = 0; _capture_latency_range.max = 0; @@ -1295,12 +1315,41 @@ bool DummyPort::is_physically_connected () const return false; } +void DummyPort::setup_random_number_generator () +{ + _rseed = g_get_monotonic_time() % UINT_MAX; +} + +inline uint32_t +DummyPort::randi () +{ + // 31bit Park-Miller-Carta Pseudo-Random Number Generator + // http://www.firstpr.com.au/dsp/rand31/ + uint32_t hi, lo; + lo = 16807 * (_rseed & 0xffff); + hi = 16807 * (_rseed >> 16); + + lo += (hi & 0x7fff) << 16; + lo += hi >> 15; +#if 1 + lo = (lo & 0x7fffffff) + (lo >> 31); +#else + if (lo > 0x7fffffff) { lo -= 0x7fffffff; } +#endif + return (_rseed = lo); +} + +inline float +DummyPort::randf () +{ + return (randi() / 1073741824.f) - 1.f; +} + /******************************************************************************/ DummyAudioPort::DummyAudioPort (DummyAudioBackend &b, const std::string& name, PortFlags flags) : DummyPort (b, name, flags) , _gen_type (Silence) - , _gen_cycle (false) , _b0 (0) , _b1 (0) , _b2 (0) @@ -1324,8 +1373,8 @@ DummyAudioPort::~DummyAudioPort () { void DummyAudioPort::setup_generator (GeneratorType const g, float const samplerate) { + DummyPort::setup_random_number_generator(); _gen_type = g; - _rseed = g_get_monotonic_time() % UINT_MAX; switch (_gen_type) { case PinkNoise: @@ -1346,31 +1395,6 @@ void DummyAudioPort::setup_generator (GeneratorType const g, float const sampler } } -inline uint32_t -DummyAudioPort::randi () -{ - // 31bit Park-Miller-Carta Pseudo-Random Number Generator - // http://www.firstpr.com.au/dsp/rand31/ - uint32_t hi, lo; - lo = 16807 * (_rseed & 0xffff); - hi = 16807 * (_rseed >> 16); - - lo += (hi & 0x7fff) << 16; - lo += hi >> 15; -#if 1 - lo = (lo & 0x7fffffff) + (lo >> 31); -#else - if (lo > 0x7fffffff) { lo -= 0x7fffffff; } -#endif - return (_rseed = lo); -} - -inline float -DummyAudioPort::randf () -{ - return (randi() / 1073741824.f) - 1.f; -} - float DummyAudioPort::grandf () { // Gaussian White Noise @@ -1500,6 +1524,9 @@ void* DummyAudioPort::get_buffer (pframes_t n_samples) DummyMidiPort::DummyMidiPort (DummyAudioBackend &b, const std::string& name, PortFlags flags) : DummyPort (b, name, flags) + , _midi_seq_spb (0) + , _midi_seq_time (0) + , _midi_seq_pos (0) { _buffer.clear (); } @@ -1512,13 +1539,75 @@ struct MidiEventSorter { } }; -void* DummyMidiPort::get_buffer (pframes_t /* nframes */) +void DummyMidiPort::setup_generator (int seq_id, const float sr) +{ + DummyPort::setup_random_number_generator(); + switch (seq_id) { + case 1: + _midi_seq_dat = DummyMidiData::s1; + break; + case 2: + _midi_seq_dat = DummyMidiData::s2; + break; + case 3: + _midi_seq_dat = DummyMidiData::s3; + break; + default: + _midi_seq_dat = DummyMidiData::s0; + break; + } + _midi_seq_spb = sr * .5; // 120 BPM, beat_time 1.0 per beat. + _midi_seq_pos = 0; + _midi_seq_time = 0; +} + +void DummyMidiPort::midi_generate (const pframes_t n_samples) +{ + Glib::Threads::Mutex::Lock lm (generator_lock); + if (_gen_cycle) { + return; + } + + _buffer.clear (); + _gen_cycle = true; + + if (_midi_seq_spb == 0 || !_midi_seq_dat) { + return; + } + + while (1) { + const int32_t ev_beat_time = _midi_seq_dat[_midi_seq_pos].beat_time * _midi_seq_spb - _midi_seq_time; + if (ev_beat_time < 0) { + break; + } + if ((pframes_t) ev_beat_time >= n_samples) { + break; + } + _buffer.push_back (boost::shared_ptr<DummyMidiEvent>(new DummyMidiEvent ( + ev_beat_time, _midi_seq_dat[_midi_seq_pos].event, 3 + ))); + ++_midi_seq_pos; + + if (_midi_seq_dat[_midi_seq_pos].event[0] == 0xff && _midi_seq_dat[_midi_seq_pos].event[1] == 0xff) { + _midi_seq_time -= _midi_seq_dat[_midi_seq_pos].beat_time * _midi_seq_spb; + _midi_seq_pos = 0; + } + } + _midi_seq_time += n_samples; +} + + +void* DummyMidiPort::get_buffer (pframes_t n_samples) { if (is_input ()) { _buffer.clear (); for (std::vector<DummyPort*>::const_iterator i = get_connections ().begin (); i != get_connections ().end (); ++i) { + DummyMidiPort * source = static_cast<DummyMidiPort*>(*i); + if (source->is_physical() && source->is_terminal()) { + source->get_buffer(n_samples); // generate signal. + } const DummyMidiBuffer src = static_cast<const DummyMidiPort*>(*i)->const_buffer (); for (DummyMidiBuffer::const_iterator it = src.begin (); it != src.end (); ++it) { _buffer.push_back (boost::shared_ptr<DummyMidiEvent>(new DummyMidiEvent (**it))); @@ -1526,7 +1615,9 @@ void* DummyMidiPort::get_buffer (pframes_t /* nframes */) } std::sort (_buffer.begin (), _buffer.end (), MidiEventSorter()); } else if (is_output () && is_physical () && is_terminal()) { - _buffer.clear (); + if (!_gen_cycle) { + midi_generate(n_samples); + } } return &_buffer; } diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h index b28a464e3c..04a9cf4348 100644 --- a/libs/backends/dummy/dummy_audiobackend.h +++ b/libs/backends/dummy/dummy_audiobackend.h @@ -37,6 +37,13 @@ namespace ARDOUR { class DummyAudioBackend; +namespace DummyMidiData { + typedef struct _MIDISequence { + float beat_time; + uint8_t event[3]; + } MIDISequence; +}; + class DummyMidiEvent { public: DummyMidiEvent (const pframes_t timestamp, const uint8_t* data, size_t size); @@ -83,6 +90,7 @@ class DummyPort { void disconnect_all (); virtual void* get_buffer (pframes_t nframes) = 0; + void next_period () { _gen_cycle = false; } const LatencyRange& latency_range (bool for_playback) const { @@ -112,6 +120,17 @@ class DummyPort { void _connect (DummyPort* , bool); void _disconnect (DummyPort* , bool); + protected: + // random number generator + void setup_random_number_generator (); + inline float randf (); + inline uint32_t randi (); + uint32_t _rseed; + + // signal generator + volatile bool _gen_cycle; + Glib::Threads::Mutex generator_lock; + }; // class DummyPort class DummyAudioPort : public DummyPort { @@ -133,7 +152,6 @@ class DummyAudioPort : public DummyPort { PonyNoise, SineWave, }; - void next_period () { _gen_cycle = false; } void setup_generator (GeneratorType const, float const); private: @@ -142,8 +160,6 @@ class DummyAudioPort : public DummyPort { // signal generator ('fake' physical inputs) void generate (const pframes_t n_samples); GeneratorType _gen_type; - Glib::Threads::Mutex generator_lock; - volatile bool _gen_cycle; // generator buffers // pink-noise filters @@ -153,11 +169,6 @@ class DummyAudioPort : public DummyPort { uint32_t _tbl_length; uint32_t _tbl_offset; - // random number generator - inline float randf (); - inline uint32_t randi (); - uint32_t _rseed; - // gaussian noise generator float grandf (); bool _pass; @@ -175,8 +186,17 @@ class DummyMidiPort : public DummyPort { void* get_buffer (pframes_t nframes); const DummyMidiBuffer const_buffer () const { return _buffer; } + void setup_generator (int, float const); + private: DummyMidiBuffer _buffer; + + // midi event generator ('fake' physical inputs) + void midi_generate (const pframes_t n_samples); + float _midi_seq_spb; // samples per beat + int32_t _midi_seq_time; + uint32_t _midi_seq_pos; + DummyMidiData::MIDISequence const * _midi_seq_dat; }; // class DummyMidiPort class DummyAudioBackend : public AudioBackend { @@ -346,6 +366,7 @@ class DummyAudioBackend : public AudioBackend { uint32_t _n_midi_inputs; uint32_t _n_midi_outputs; + bool _enable_midi_generators; uint32_t _systemic_input_latency; uint32_t _systemic_output_latency; @@ -373,9 +394,9 @@ class DummyAudioBackend : public AudioBackend { void unregister_ports (bool system_only = false); std::vector<DummyAudioPort *> _system_inputs; + std::vector<DummyMidiPort *> _system_midi_in; std::vector<DummyPort *> _ports; - struct PortConnectData { std::string a; std::string b; diff --git a/libs/backends/dummy/dummy_midi_seq.h b/libs/backends/dummy/dummy_midi_seq.h new file mode 100644 index 0000000000..1ca27b87fa --- /dev/null +++ b/libs/backends/dummy/dummy_midi_seq.h @@ -0,0 +1,726 @@ +/* + * Copyright (C) 2014 Robin Gareus <robin@gareus.org> + * + * 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 + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __libbackend_dummy_midi_seq_h__ +#define __libbackend_dummy_midi_seq_h__ + +#include "dummy_audiobackend.h" + +namespace ARDOUR { namespace DummyMidiData { + +#define NUM_MIDI_EVENT_GENERATORS 4 + +const MIDISequence s0[] = { // some arbitrary short sequence + { 0.00, {0x90, 64, 0x7f} }, + { 0.50, {0x80, 64, 0x00} }, + { 1.00, {0x90, 66, 0x7f} }, + { 1.50, {0x80, 66, 0x00} }, + { 2.00, {0x90, 68, 0x7f} }, + { 3.50, {0x80, 68, 0x00} }, + { 3.75, {0x90, 71, 0x7f} }, + { 4.00, {0x80, 71, 0x00} }, + { 4.00, {0xff, 255, 0xff} }, // sentinel +}; + +const MIDISequence s1[] = { // Cmaj7 - iterate all channels + { 0.00, {0x90, 60, 0x7f} }, + { 0.25, {0x90, 64, 0x7f} }, + { 0.50, {0x90, 67, 0x7f} }, + { 0.75, {0x90, 71, 0x7f} }, + { 1.00, {0x90, 72, 0x7f} }, + { 1.00, {0x80, 60, 0x00} }, + { 1.25, {0x80, 64, 0x00} }, + { 1.50, {0x80, 67, 0x00} }, + { 1.75, {0x80, 71, 0x00} }, + { 2.00, {0x80, 72, 0x00} }, + { 2.00, {0x91, 60, 0x7f} }, + { 2.25, {0x91, 64, 0x7f} }, + { 2.50, {0x91, 67, 0x7f} }, + { 2.75, {0x91, 71, 0x7f} }, + { 3.00, {0x91, 72, 0x7f} }, + { 3.00, {0x81, 60, 0x00} }, + { 3.25, {0x81, 64, 0x00} }, + { 3.50, {0x81, 67, 0x00} }, + { 3.75, {0x81, 71, 0x00} }, + { 4.00, {0x81, 72, 0x00} }, + { 4.00, {0x92, 60, 0x7f} }, + { 4.25, {0x92, 64, 0x7f} }, + { 4.50, {0x92, 67, 0x7f} }, + { 4.75, {0x92, 71, 0x7f} }, + { 5.00, {0x92, 72, 0x7f} }, + { 5.00, {0x82, 60, 0x00} }, + { 5.25, {0x82, 64, 0x00} }, + { 5.50, {0x82, 67, 0x00} }, + { 5.75, {0x82, 71, 0x00} }, + { 6.00, {0x82, 72, 0x00} }, + { 6.00, {0x93, 60, 0x7f} }, + { 6.25, {0x93, 64, 0x7f} }, + { 6.50, {0x93, 67, 0x7f} }, + { 6.75, {0x93, 71, 0x7f} }, + { 7.00, {0x93, 72, 0x7f} }, + { 7.00, {0x83, 60, 0x00} }, + { 7.25, {0x83, 64, 0x00} }, + { 7.50, {0x83, 67, 0x00} }, + { 7.75, {0x83, 71, 0x00} }, + { 8.00, {0x83, 72, 0x00} }, + { 8.00, {0x94, 60, 0x7f} }, + { 8.25, {0x94, 64, 0x7f} }, + { 8.50, {0x94, 67, 0x7f} }, + { 8.75, {0x94, 71, 0x7f} }, + { 9.00, {0x94, 72, 0x7f} }, + { 9.00, {0x84, 60, 0x00} }, + { 9.25, {0x84, 64, 0x00} }, + { 9.50, {0x84, 67, 0x00} }, + { 9.75, {0x84, 71, 0x00} }, + {10.00, {0x84, 72, 0x00} }, + {10.00, {0x95, 60, 0x7f} }, + {10.25, {0x95, 64, 0x7f} }, + {10.50, {0x95, 67, 0x7f} }, + {10.75, {0x95, 71, 0x7f} }, + {11.00, {0x95, 72, 0x7f} }, + {11.00, {0x85, 60, 0x00} }, + {11.25, {0x85, 64, 0x00} }, + {11.50, {0x85, 67, 0x00} }, + {11.75, {0x85, 71, 0x00} }, + {12.00, {0x85, 72, 0x00} }, + {12.00, {0x96, 60, 0x7f} }, + {12.25, {0x96, 64, 0x7f} }, + {12.50, {0x96, 67, 0x7f} }, + {12.75, {0x96, 71, 0x7f} }, + {13.00, {0x96, 72, 0x7f} }, + {13.00, {0x86, 60, 0x00} }, + {13.25, {0x86, 64, 0x00} }, + {13.50, {0x86, 67, 0x00} }, + {13.75, {0x86, 71, 0x00} }, + {14.00, {0x86, 72, 0x00} }, + {14.00, {0x97, 60, 0x7f} }, + {14.25, {0x97, 64, 0x7f} }, + {14.50, {0x97, 67, 0x7f} }, + {14.75, {0x97, 71, 0x7f} }, + {15.00, {0x97, 72, 0x7f} }, + {15.00, {0x87, 60, 0x00} }, + {15.25, {0x87, 64, 0x00} }, + {15.50, {0x87, 67, 0x00} }, + {15.75, {0x87, 71, 0x00} }, + {16.00, {0x87, 72, 0x00} }, + {16.00, {0x98, 60, 0x7f} }, + {16.25, {0x98, 64, 0x7f} }, + {16.50, {0x98, 67, 0x7f} }, + {16.75, {0x98, 71, 0x7f} }, + {17.00, {0x98, 72, 0x7f} }, + {17.00, {0x88, 60, 0x00} }, + {17.25, {0x88, 64, 0x00} }, + {17.50, {0x88, 67, 0x00} }, + {17.75, {0x88, 71, 0x00} }, + {18.00, {0x88, 72, 0x00} }, + {18.00, {0x99, 60, 0x7f} }, + {18.25, {0x99, 64, 0x7f} }, + {18.50, {0x99, 67, 0x7f} }, + {18.75, {0x99, 71, 0x7f} }, + {19.00, {0x99, 72, 0x7f} }, + {19.00, {0x89, 60, 0x00} }, + {19.25, {0x89, 64, 0x00} }, + {19.50, {0x89, 67, 0x00} }, + {19.75, {0x89, 71, 0x00} }, + {20.00, {0x89, 72, 0x00} }, + {20.00, {0x9a, 60, 0x7f} }, + {20.25, {0x9a, 64, 0x7f} }, + {20.50, {0x9a, 67, 0x7f} }, + {20.75, {0x9a, 71, 0x7f} }, + {21.00, {0x9a, 72, 0x7f} }, + {21.00, {0x8a, 60, 0x00} }, + {21.25, {0x8a, 64, 0x00} }, + {21.50, {0x8a, 67, 0x00} }, + {21.75, {0x8a, 71, 0x00} }, + {22.00, {0x8a, 72, 0x00} }, + {22.00, {0x9b, 60, 0x7f} }, + {22.25, {0x9b, 64, 0x7f} }, + {22.50, {0x9b, 67, 0x7f} }, + {22.75, {0x9b, 71, 0x7f} }, + {23.00, {0x9b, 72, 0x7f} }, + {23.00, {0x8b, 60, 0x00} }, + {23.25, {0x8b, 64, 0x00} }, + {23.50, {0x8b, 67, 0x00} }, + {23.75, {0x8b, 71, 0x00} }, + {24.00, {0x8b, 72, 0x00} }, + {24.00, {0x9c, 60, 0x7f} }, + {24.25, {0x9c, 64, 0x7f} }, + {24.50, {0x9c, 67, 0x7f} }, + {24.75, {0x9c, 71, 0x7f} }, + {25.00, {0x9c, 72, 0x7f} }, + {25.00, {0x8c, 60, 0x00} }, + {25.25, {0x8c, 64, 0x00} }, + {25.50, {0x8c, 67, 0x00} }, + {25.75, {0x8c, 71, 0x00} }, + {26.00, {0x8c, 72, 0x00} }, + {26.00, {0x9d, 60, 0x7f} }, + {26.25, {0x9d, 64, 0x7f} }, + {26.50, {0x9d, 67, 0x7f} }, + {26.75, {0x9d, 71, 0x7f} }, + {27.00, {0x9d, 72, 0x7f} }, + {27.00, {0x8d, 60, 0x00} }, + {27.25, {0x8d, 64, 0x00} }, + {27.50, {0x8d, 67, 0x00} }, + {27.75, {0x8d, 71, 0x00} }, + {28.00, {0x8d, 72, 0x00} }, + {28.00, {0x9e, 60, 0x7f} }, + {28.25, {0x9e, 64, 0x7f} }, + {28.50, {0x9e, 67, 0x7f} }, + {28.75, {0x9e, 71, 0x7f} }, + {29.00, {0x9e, 72, 0x7f} }, + {29.00, {0x8e, 60, 0x00} }, + {29.25, {0x8e, 64, 0x00} }, + {29.50, {0x8e, 67, 0x00} }, + {29.75, {0x8e, 71, 0x00} }, + {30.00, {0x8e, 72, 0x00} }, + {30.00, {0x9f, 60, 0x7f} }, + {30.25, {0x9f, 64, 0x7f} }, + {30.50, {0x9f, 67, 0x7f} }, + {30.75, {0x9f, 71, 0x7f} }, + {31.00, {0x9f, 72, 0x7f} }, + {31.00, {0x8f, 60, 0x00} }, + {31.25, {0x8f, 64, 0x00} }, + {31.50, {0x8f, 67, 0x00} }, + {31.75, {0x8f, 71, 0x00} }, + {32.00, {0x8f, 72, 0x00} }, + {32.00, {0xff, 255, 0xff} }, // sentinel +}; + +const MIDISequence s2[] = { // channel 1, sweep all notes + { 0.00, {0x90, 0, 0x7f} }, + { 0.25, {0x80, 0, 0x00} }, + { 0.25, {0x90, 1, 0x7f} }, + { 0.50, {0x80, 1, 0x00} }, + { 0.50, {0x90, 2, 0x7f} }, + { 0.75, {0x80, 2, 0x00} }, + { 0.75, {0x90, 3, 0x7f} }, + { 1.00, {0x80, 3, 0x00} }, + { 1.00, {0x90, 4, 0x7f} }, + { 1.25, {0x80, 4, 0x00} }, + { 1.25, {0x90, 5, 0x7f} }, + { 1.50, {0x80, 5, 0x00} }, + { 1.50, {0x90, 6, 0x7f} }, + { 1.75, {0x80, 6, 0x00} }, + { 1.75, {0x90, 7, 0x7f} }, + { 2.00, {0x80, 7, 0x00} }, + { 2.00, {0x90, 8, 0x7f} }, + { 2.25, {0x80, 8, 0x00} }, + { 2.25, {0x90, 9, 0x7f} }, + { 2.50, {0x80, 9, 0x00} }, + { 2.50, {0x90, 10, 0x7f} }, + { 2.75, {0x80, 10, 0x00} }, + { 2.75, {0x90, 11, 0x7f} }, + { 3.00, {0x80, 11, 0x00} }, + { 3.00, {0x90, 12, 0x7f} }, + { 3.25, {0x80, 12, 0x00} }, + { 3.25, {0x90, 13, 0x7f} }, + { 3.50, {0x80, 13, 0x00} }, + { 3.50, {0x90, 14, 0x7f} }, + { 3.75, {0x80, 14, 0x00} }, + { 3.75, {0x90, 15, 0x7f} }, + { 4.00, {0x80, 15, 0x00} }, + { 4.00, {0x90, 16, 0x7f} }, + { 4.25, {0x80, 16, 0x00} }, + { 4.25, {0x90, 17, 0x7f} }, + { 4.50, {0x80, 17, 0x00} }, + { 4.50, {0x90, 18, 0x7f} }, + { 4.75, {0x80, 18, 0x00} }, + { 4.75, {0x90, 19, 0x7f} }, + { 5.00, {0x80, 19, 0x00} }, + { 5.00, {0x90, 20, 0x7f} }, + { 5.25, {0x80, 20, 0x00} }, + { 5.25, {0x90, 21, 0x7f} }, + { 5.50, {0x80, 21, 0x00} }, + { 5.50, {0x90, 22, 0x7f} }, + { 5.75, {0x80, 22, 0x00} }, + { 5.75, {0x90, 23, 0x7f} }, + { 6.00, {0x80, 23, 0x00} }, + { 6.00, {0x90, 24, 0x7f} }, + { 6.25, {0x80, 24, 0x00} }, + { 6.25, {0x90, 25, 0x7f} }, + { 6.50, {0x80, 25, 0x00} }, + { 6.50, {0x90, 26, 0x7f} }, + { 6.75, {0x80, 26, 0x00} }, + { 6.75, {0x90, 27, 0x7f} }, + { 7.00, {0x80, 27, 0x00} }, + { 7.00, {0x90, 28, 0x7f} }, + { 7.25, {0x80, 28, 0x00} }, + { 7.25, {0x90, 29, 0x7f} }, + { 7.50, {0x80, 29, 0x00} }, + { 7.50, {0x90, 30, 0x7f} }, + { 7.75, {0x80, 30, 0x00} }, + { 7.75, {0x90, 31, 0x7f} }, + { 8.00, {0x80, 31, 0x00} }, + { 8.00, {0x90, 32, 0x7f} }, + { 8.25, {0x80, 32, 0x00} }, + { 8.25, {0x90, 33, 0x7f} }, + { 8.50, {0x80, 33, 0x00} }, + { 8.50, {0x90, 34, 0x7f} }, + { 8.75, {0x80, 34, 0x00} }, + { 8.75, {0x90, 35, 0x7f} }, + { 9.00, {0x80, 35, 0x00} }, + { 9.00, {0x90, 36, 0x7f} }, + { 9.25, {0x80, 36, 0x00} }, + { 9.25, {0x90, 37, 0x7f} }, + { 9.50, {0x80, 37, 0x00} }, + { 9.50, {0x90, 38, 0x7f} }, + { 9.75, {0x80, 38, 0x00} }, + { 9.75, {0x90, 39, 0x7f} }, + {10.00, {0x80, 39, 0x00} }, + {10.00, {0x90, 40, 0x7f} }, + {10.25, {0x80, 40, 0x00} }, + {10.25, {0x90, 41, 0x7f} }, + {10.50, {0x80, 41, 0x00} }, + {10.50, {0x90, 42, 0x7f} }, + {10.75, {0x80, 42, 0x00} }, + {10.75, {0x90, 43, 0x7f} }, + {11.00, {0x80, 43, 0x00} }, + {11.00, {0x90, 44, 0x7f} }, + {11.25, {0x80, 44, 0x00} }, + {11.25, {0x90, 45, 0x7f} }, + {11.50, {0x80, 45, 0x00} }, + {11.50, {0x90, 46, 0x7f} }, + {11.75, {0x80, 46, 0x00} }, + {11.75, {0x90, 47, 0x7f} }, + {12.00, {0x80, 47, 0x00} }, + {12.00, {0x90, 48, 0x7f} }, + {12.25, {0x80, 48, 0x00} }, + {12.25, {0x90, 49, 0x7f} }, + {12.50, {0x80, 49, 0x00} }, + {12.50, {0x90, 50, 0x7f} }, + {12.75, {0x80, 50, 0x00} }, + {12.75, {0x90, 51, 0x7f} }, + {13.00, {0x80, 51, 0x00} }, + {13.00, {0x90, 52, 0x7f} }, + {13.25, {0x80, 52, 0x00} }, + {13.25, {0x90, 53, 0x7f} }, + {13.50, {0x80, 53, 0x00} }, + {13.50, {0x90, 54, 0x7f} }, + {13.75, {0x80, 54, 0x00} }, + {13.75, {0x90, 55, 0x7f} }, + {14.00, {0x80, 55, 0x00} }, + {14.00, {0x90, 56, 0x7f} }, + {14.25, {0x80, 56, 0x00} }, + {14.25, {0x90, 57, 0x7f} }, + {14.50, {0x80, 57, 0x00} }, + {14.50, {0x90, 58, 0x7f} }, + {14.75, {0x80, 58, 0x00} }, + {14.75, {0x90, 59, 0x7f} }, + {15.00, {0x80, 59, 0x00} }, + {15.00, {0x90, 60, 0x7f} }, + {15.25, {0x80, 60, 0x00} }, + {15.25, {0x90, 61, 0x7f} }, + {15.50, {0x80, 61, 0x00} }, + {15.50, {0x90, 62, 0x7f} }, + {15.75, {0x80, 62, 0x00} }, + {15.75, {0x90, 63, 0x7f} }, + {16.00, {0x80, 63, 0x00} }, + {16.00, {0x90, 64, 0x7f} }, + {16.25, {0x80, 64, 0x00} }, + {16.25, {0x90, 65, 0x7f} }, + {16.50, {0x80, 65, 0x00} }, + {16.50, {0x90, 66, 0x7f} }, + {16.75, {0x80, 66, 0x00} }, + {16.75, {0x90, 67, 0x7f} }, + {17.00, {0x80, 67, 0x00} }, + {17.00, {0x90, 68, 0x7f} }, + {17.25, {0x80, 68, 0x00} }, + {17.25, {0x90, 69, 0x7f} }, + {17.50, {0x80, 69, 0x00} }, + {17.50, {0x90, 70, 0x7f} }, + {17.75, {0x80, 70, 0x00} }, + {17.75, {0x90, 71, 0x7f} }, + {18.00, {0x80, 71, 0x00} }, + {18.00, {0x90, 72, 0x7f} }, + {18.25, {0x80, 72, 0x00} }, + {18.25, {0x90, 73, 0x7f} }, + {18.50, {0x80, 73, 0x00} }, + {18.50, {0x90, 74, 0x7f} }, + {18.75, {0x80, 74, 0x00} }, + {18.75, {0x90, 75, 0x7f} }, + {19.00, {0x80, 75, 0x00} }, + {19.00, {0x90, 76, 0x7f} }, + {19.25, {0x80, 76, 0x00} }, + {19.25, {0x90, 77, 0x7f} }, + {19.50, {0x80, 77, 0x00} }, + {19.50, {0x90, 78, 0x7f} }, + {19.75, {0x80, 78, 0x00} }, + {19.75, {0x90, 79, 0x7f} }, + {20.00, {0x80, 79, 0x00} }, + {20.00, {0x90, 80, 0x7f} }, + {20.25, {0x80, 80, 0x00} }, + {20.25, {0x90, 81, 0x7f} }, + {20.50, {0x80, 81, 0x00} }, + {20.50, {0x90, 82, 0x7f} }, + {20.75, {0x80, 82, 0x00} }, + {20.75, {0x90, 83, 0x7f} }, + {21.00, {0x80, 83, 0x00} }, + {21.00, {0x90, 84, 0x7f} }, + {21.25, {0x80, 84, 0x00} }, + {21.25, {0x90, 85, 0x7f} }, + {21.50, {0x80, 85, 0x00} }, + {21.50, {0x90, 86, 0x7f} }, + {21.75, {0x80, 86, 0x00} }, + {21.75, {0x90, 87, 0x7f} }, + {22.00, {0x80, 87, 0x00} }, + {22.00, {0x90, 88, 0x7f} }, + {22.25, {0x80, 88, 0x00} }, + {22.25, {0x90, 89, 0x7f} }, + {22.50, {0x80, 89, 0x00} }, + {22.50, {0x90, 90, 0x7f} }, + {22.75, {0x80, 90, 0x00} }, + {22.75, {0x90, 91, 0x7f} }, + {23.00, {0x80, 91, 0x00} }, + {23.00, {0x90, 92, 0x7f} }, + {23.25, {0x80, 92, 0x00} }, + {23.25, {0x90, 93, 0x7f} }, + {23.50, {0x80, 93, 0x00} }, + {23.50, {0x90, 94, 0x7f} }, + {23.75, {0x80, 94, 0x00} }, + {23.75, {0x90, 95, 0x7f} }, + {24.00, {0x80, 95, 0x00} }, + {24.00, {0x90, 96, 0x7f} }, + {24.25, {0x80, 96, 0x00} }, + {24.25, {0x90, 97, 0x7f} }, + {24.50, {0x80, 97, 0x00} }, + {24.50, {0x90, 98, 0x7f} }, + {24.75, {0x80, 98, 0x00} }, + {24.75, {0x90, 99, 0x7f} }, + {25.00, {0x80, 99, 0x00} }, + {25.00, {0x90, 100, 0x7f} }, + {25.25, {0x80, 100, 0x00} }, + {25.25, {0x90, 101, 0x7f} }, + {25.50, {0x80, 101, 0x00} }, + {25.50, {0x90, 102, 0x7f} }, + {25.75, {0x80, 102, 0x00} }, + {25.75, {0x90, 103, 0x7f} }, + {26.00, {0x80, 103, 0x00} }, + {26.00, {0x90, 104, 0x7f} }, + {26.25, {0x80, 104, 0x00} }, + {26.25, {0x90, 105, 0x7f} }, + {26.50, {0x80, 105, 0x00} }, + {26.50, {0x90, 106, 0x7f} }, + {26.75, {0x80, 106, 0x00} }, + {26.75, {0x90, 107, 0x7f} }, + {27.00, {0x80, 107, 0x00} }, + {27.00, {0x90, 108, 0x7f} }, + {27.25, {0x80, 108, 0x00} }, + {27.25, {0x90, 109, 0x7f} }, + {27.50, {0x80, 109, 0x00} }, + {27.50, {0x90, 110, 0x7f} }, + {27.75, {0x80, 110, 0x00} }, + {27.75, {0x90, 111, 0x7f} }, + {28.00, {0x80, 111, 0x00} }, + {28.00, {0x90, 112, 0x7f} }, + {28.25, {0x80, 112, 0x00} }, + {28.25, {0x90, 113, 0x7f} }, + {28.50, {0x80, 113, 0x00} }, + {28.50, {0x90, 114, 0x7f} }, + {28.75, {0x80, 114, 0x00} }, + {28.75, {0x90, 115, 0x7f} }, + {29.00, {0x80, 115, 0x00} }, + {29.00, {0x90, 116, 0x7f} }, + {29.25, {0x80, 116, 0x00} }, + {29.25, {0x90, 117, 0x7f} }, + {29.50, {0x80, 117, 0x00} }, + {29.50, {0x90, 118, 0x7f} }, + {29.75, {0x80, 118, 0x00} }, + {29.75, {0x90, 119, 0x7f} }, + {30.00, {0x80, 119, 0x00} }, + {30.00, {0x90, 120, 0x7f} }, + {30.25, {0x80, 120, 0x00} }, + {30.25, {0x90, 121, 0x7f} }, + {30.50, {0x80, 121, 0x00} }, + {30.50, {0x90, 122, 0x7f} }, + {30.75, {0x80, 122, 0x00} }, + {30.75, {0x90, 123, 0x7f} }, + {31.00, {0x80, 123, 0x00} }, + {31.00, {0x90, 124, 0x7f} }, + {31.25, {0x80, 124, 0x00} }, + {31.25, {0x90, 125, 0x7f} }, + {31.50, {0x80, 125, 0x00} }, + {31.50, {0x90, 126, 0x7f} }, + {31.75, {0x80, 126, 0x00} }, + {31.75, {0x90, 127, 0x7f} }, + {32.00, {0x80, 127, 0x00} }, + {32.00, {0xff, 255, 0xff} }, // sentinel +}; + +const MIDISequence s3[] = { // velocity sweep + { 0.000, {0x90, 60, 0x00} }, + { 0.125, {0x80, 60, 0x00} }, + { 0.125, {0x90, 61, 0x01} }, + { 0.250, {0x80, 61, 0x00} }, + { 0.250, {0x90, 60, 0x02} }, + { 0.375, {0x80, 60, 0x00} }, + { 0.375, {0x90, 61, 0x03} }, + { 0.500, {0x80, 61, 0x00} }, + { 0.500, {0x90, 60, 0x04} }, + { 0.625, {0x80, 60, 0x00} }, + { 0.625, {0x90, 61, 0x05} }, + { 0.750, {0x80, 61, 0x00} }, + { 0.750, {0x90, 60, 0x06} }, + { 0.875, {0x80, 60, 0x00} }, + { 0.875, {0x90, 61, 0x07} }, + { 1.000, {0x80, 61, 0x00} }, + { 1.000, {0x90, 60, 0x08} }, + { 1.125, {0x80, 60, 0x00} }, + { 1.125, {0x90, 61, 0x09} }, + { 1.250, {0x80, 61, 0x00} }, + { 1.250, {0x90, 60, 0x0a} }, + { 1.375, {0x80, 60, 0x00} }, + { 1.375, {0x90, 61, 0x0b} }, + { 1.500, {0x80, 61, 0x00} }, + { 1.500, {0x90, 60, 0x0c} }, + { 1.625, {0x80, 60, 0x00} }, + { 1.625, {0x90, 61, 0x0d} }, + { 1.750, {0x80, 61, 0x00} }, + { 1.750, {0x90, 60, 0x0e} }, + { 1.875, {0x80, 60, 0x00} }, + { 1.875, {0x90, 61, 0x0f} }, + { 2.000, {0x80, 61, 0x00} }, + { 2.000, {0x90, 60, 0x10} }, + { 2.125, {0x80, 60, 0x00} }, + { 2.125, {0x90, 61, 0x11} }, + { 2.250, {0x80, 61, 0x00} }, + { 2.250, {0x90, 60, 0x12} }, + { 2.375, {0x80, 60, 0x00} }, + { 2.375, {0x90, 61, 0x13} }, + { 2.500, {0x80, 61, 0x00} }, + { 2.500, {0x90, 60, 0x14} }, + { 2.625, {0x80, 60, 0x00} }, + { 2.625, {0x90, 61, 0x15} }, + { 2.750, {0x80, 61, 0x00} }, + { 2.750, {0x90, 60, 0x16} }, + { 2.875, {0x80, 60, 0x00} }, + { 2.875, {0x90, 61, 0x17} }, + { 3.000, {0x80, 61, 0x00} }, + { 3.000, {0x90, 60, 0x18} }, + { 3.125, {0x80, 60, 0x00} }, + { 3.125, {0x90, 61, 0x19} }, + { 3.250, {0x80, 61, 0x00} }, + { 3.250, {0x90, 60, 0x1a} }, + { 3.375, {0x80, 60, 0x00} }, + { 3.375, {0x90, 61, 0x1b} }, + { 3.500, {0x80, 61, 0x00} }, + { 3.500, {0x90, 60, 0x1c} }, + { 3.625, {0x80, 60, 0x00} }, + { 3.625, {0x90, 61, 0x1d} }, + { 3.750, {0x80, 61, 0x00} }, + { 3.750, {0x90, 60, 0x1e} }, + { 3.875, {0x80, 60, 0x00} }, + { 3.875, {0x90, 61, 0x1f} }, + { 4.000, {0x80, 61, 0x00} }, + { 4.000, {0x90, 60, 0x20} }, + { 4.125, {0x80, 60, 0x00} }, + { 4.125, {0x90, 61, 0x21} }, + { 4.250, {0x80, 61, 0x00} }, + { 4.250, {0x90, 60, 0x22} }, + { 4.375, {0x80, 60, 0x00} }, + { 4.375, {0x90, 61, 0x23} }, + { 4.500, {0x80, 61, 0x00} }, + { 4.500, {0x90, 60, 0x24} }, + { 4.625, {0x80, 60, 0x00} }, + { 4.625, {0x90, 61, 0x25} }, + { 4.750, {0x80, 61, 0x00} }, + { 4.750, {0x90, 60, 0x26} }, + { 4.875, {0x80, 60, 0x00} }, + { 4.875, {0x90, 61, 0x27} }, + { 5.000, {0x80, 61, 0x00} }, + { 5.000, {0x90, 60, 0x28} }, + { 5.125, {0x80, 60, 0x00} }, + { 5.125, {0x90, 61, 0x29} }, + { 5.250, {0x80, 61, 0x00} }, + { 5.250, {0x90, 60, 0x2a} }, + { 5.375, {0x80, 60, 0x00} }, + { 5.375, {0x90, 61, 0x2b} }, + { 5.500, {0x80, 61, 0x00} }, + { 5.500, {0x90, 60, 0x2c} }, + { 5.625, {0x80, 60, 0x00} }, + { 5.625, {0x90, 61, 0x2d} }, + { 5.750, {0x80, 61, 0x00} }, + { 5.750, {0x90, 60, 0x2e} }, + { 5.875, {0x80, 60, 0x00} }, + { 5.875, {0x90, 61, 0x2f} }, + { 6.000, {0x80, 61, 0x00} }, + { 6.000, {0x90, 60, 0x30} }, + { 6.125, {0x80, 60, 0x00} }, + { 6.125, {0x90, 61, 0x31} }, + { 6.250, {0x80, 61, 0x00} }, + { 6.250, {0x90, 60, 0x32} }, + { 6.375, {0x80, 60, 0x00} }, + { 6.375, {0x90, 61, 0x33} }, + { 6.500, {0x80, 61, 0x00} }, + { 6.500, {0x90, 60, 0x34} }, + { 6.625, {0x80, 60, 0x00} }, + { 6.625, {0x90, 61, 0x35} }, + { 6.750, {0x80, 61, 0x00} }, + { 6.750, {0x90, 60, 0x36} }, + { 6.875, {0x80, 60, 0x00} }, + { 6.875, {0x90, 61, 0x37} }, + { 7.000, {0x80, 61, 0x00} }, + { 7.000, {0x90, 60, 0x38} }, + { 7.125, {0x80, 60, 0x00} }, + { 7.125, {0x90, 61, 0x39} }, + { 7.250, {0x80, 61, 0x00} }, + { 7.250, {0x90, 60, 0x3a} }, + { 7.375, {0x80, 60, 0x00} }, + { 7.375, {0x90, 61, 0x3b} }, + { 7.500, {0x80, 61, 0x00} }, + { 7.500, {0x90, 60, 0x3c} }, + { 7.625, {0x80, 60, 0x00} }, + { 7.625, {0x90, 61, 0x3d} }, + { 7.750, {0x80, 61, 0x00} }, + { 7.750, {0x90, 60, 0x3e} }, + { 7.875, {0x80, 60, 0x00} }, + { 7.875, {0x90, 61, 0x3f} }, + { 8.000, {0x80, 61, 0x00} }, + { 8.000, {0x90, 60, 0x40} }, + { 8.125, {0x80, 60, 0x00} }, + { 8.125, {0x90, 61, 0x41} }, + { 8.250, {0x80, 61, 0x00} }, + { 8.250, {0x90, 60, 0x42} }, + { 8.375, {0x80, 60, 0x00} }, + { 8.375, {0x90, 61, 0x43} }, + { 8.500, {0x80, 61, 0x00} }, + { 8.500, {0x90, 60, 0x44} }, + { 8.625, {0x80, 60, 0x00} }, + { 8.625, {0x90, 61, 0x45} }, + { 8.750, {0x80, 61, 0x00} }, + { 8.750, {0x90, 60, 0x46} }, + { 8.875, {0x80, 60, 0x00} }, + { 8.875, {0x90, 61, 0x47} }, + { 9.000, {0x80, 61, 0x00} }, + { 9.000, {0x90, 60, 0x48} }, + { 9.125, {0x80, 60, 0x00} }, + { 9.125, {0x90, 61, 0x49} }, + { 9.250, {0x80, 61, 0x00} }, + { 9.250, {0x90, 60, 0x4a} }, + { 9.375, {0x80, 60, 0x00} }, + { 9.375, {0x90, 61, 0x4b} }, + { 9.500, {0x80, 61, 0x00} }, + { 9.500, {0x90, 60, 0x4c} }, + { 9.625, {0x80, 60, 0x00} }, + { 9.625, {0x90, 61, 0x4d} }, + { 9.750, {0x80, 61, 0x00} }, + { 9.750, {0x90, 60, 0x4e} }, + { 9.875, {0x80, 60, 0x00} }, + { 9.875, {0x90, 61, 0x4f} }, + {10.000, {0x80, 61, 0x00} }, + {10.000, {0x90, 60, 0x50} }, + {10.125, {0x80, 60, 0x00} }, + {10.125, {0x90, 61, 0x51} }, + {10.250, {0x80, 61, 0x00} }, + {10.250, {0x90, 60, 0x52} }, + {10.375, {0x80, 60, 0x00} }, + {10.375, {0x90, 61, 0x53} }, + {10.500, {0x80, 61, 0x00} }, + {10.500, {0x90, 60, 0x54} }, + {10.625, {0x80, 60, 0x00} }, + {10.625, {0x90, 61, 0x55} }, + {10.750, {0x80, 61, 0x00} }, + {10.750, {0x90, 60, 0x56} }, + {10.875, {0x80, 60, 0x00} }, + {10.875, {0x90, 61, 0x57} }, + {11.000, {0x80, 61, 0x00} }, + {11.000, {0x90, 60, 0x58} }, + {11.125, {0x80, 60, 0x00} }, + {11.125, {0x90, 61, 0x59} }, + {11.250, {0x80, 61, 0x00} }, + {11.250, {0x90, 60, 0x5a} }, + {11.375, {0x80, 60, 0x00} }, + {11.375, {0x90, 61, 0x5b} }, + {11.500, {0x80, 61, 0x00} }, + {11.500, {0x90, 60, 0x5c} }, + {11.625, {0x80, 60, 0x00} }, + {11.625, {0x90, 61, 0x5d} }, + {11.750, {0x80, 61, 0x00} }, + {11.750, {0x90, 60, 0x5e} }, + {11.875, {0x80, 60, 0x00} }, + {11.875, {0x90, 61, 0x5f} }, + {12.000, {0x80, 61, 0x00} }, + {12.000, {0x90, 60, 0x60} }, + {12.125, {0x80, 60, 0x00} }, + {12.125, {0x90, 61, 0x61} }, + {12.250, {0x80, 61, 0x00} }, + {12.250, {0x90, 60, 0x62} }, + {12.375, {0x80, 60, 0x00} }, + {12.375, {0x90, 61, 0x63} }, + {12.500, {0x80, 61, 0x00} }, + {12.500, {0x90, 60, 0x64} }, + {12.625, {0x80, 60, 0x00} }, + {12.625, {0x90, 61, 0x65} }, + {12.750, {0x80, 61, 0x00} }, + {12.750, {0x90, 60, 0x66} }, + {12.875, {0x80, 60, 0x00} }, + {12.875, {0x90, 61, 0x67} }, + {13.000, {0x80, 61, 0x00} }, + {13.000, {0x90, 60, 0x68} }, + {13.125, {0x80, 60, 0x00} }, + {13.125, {0x90, 61, 0x69} }, + {13.250, {0x80, 61, 0x00} }, + {13.250, {0x90, 60, 0x6a} }, + {13.375, {0x80, 60, 0x00} }, + {13.375, {0x90, 61, 0x6b} }, + {13.500, {0x80, 61, 0x00} }, + {13.500, {0x90, 60, 0x6c} }, + {13.625, {0x80, 60, 0x00} }, + {13.625, {0x90, 61, 0x6d} }, + {13.750, {0x80, 61, 0x00} }, + {13.750, {0x90, 60, 0x6e} }, + {13.875, {0x80, 60, 0x00} }, + {13.875, {0x90, 61, 0x6f} }, + {14.000, {0x80, 61, 0x00} }, + {14.000, {0x90, 60, 0x70} }, + {14.125, {0x80, 60, 0x00} }, + {14.125, {0x90, 61, 0x71} }, + {14.250, {0x80, 61, 0x00} }, + {14.250, {0x90, 60, 0x72} }, + {14.375, {0x80, 60, 0x00} }, + {14.375, {0x90, 61, 0x73} }, + {14.500, {0x80, 61, 0x00} }, + {14.500, {0x90, 60, 0x74} }, + {14.625, {0x80, 60, 0x00} }, + {14.625, {0x90, 61, 0x75} }, + {14.750, {0x80, 61, 0x00} }, + {14.750, {0x90, 60, 0x76} }, + {14.875, {0x80, 60, 0x00} }, + {14.875, {0x90, 61, 0x77} }, + {15.000, {0x80, 61, 0x00} }, + {15.000, {0x90, 60, 0x78} }, + {15.125, {0x80, 60, 0x00} }, + {15.125, {0x90, 61, 0x79} }, + {15.250, {0x80, 61, 0x00} }, + {15.250, {0x90, 60, 0x7a} }, + {15.375, {0x80, 60, 0x00} }, + {15.375, {0x90, 61, 0x7b} }, + {15.500, {0x80, 61, 0x00} }, + {15.500, {0x90, 60, 0x7c} }, + {15.625, {0x80, 60, 0x00} }, + {15.625, {0x90, 61, 0x7d} }, + {15.750, {0x80, 61, 0x00} }, + {15.750, {0x90, 60, 0x7e} }, + {15.875, {0x80, 60, 0x00} }, + {15.875, {0x90, 61, 0x7f} }, + {16.000, {0x80, 61, 0x00} }, + {16.000, {0xff, 255, 0xff} }, // sentinel +}; + +}} // namespace + +#endif |