7#define EDEBUG(...) Ase::debug ("event", __VA_ARGS__)
12MidiEvent::MidiEvent (
const MidiEvent &other) :
18MidiEvent::MidiEvent (MidiEventType etype)
20 memset ((
void*)
this, 0,
sizeof (*
this));
23 static_assert (
sizeof (MidiEvent) <= 2 *
sizeof (
void*));
27MidiEvent::operator= (
const MidiEvent &other)
30 memcpy ((
void*)
this, &other,
sizeof (*
this));
36MidiEvent::message ()
const
38 if (type == MidiEvent::CONTROL_CHANGE)
40 if (param >=
uint (MidiMessage::ALL_SOUND_OFF) &&
41 param <=
uint (MidiMessage::POLY_MODE_ON))
48MidiEvent::to_string ()
const
50 const char *et =
nullptr;
55 frame, channel,
"PARAM_VALUE", param, pvalue);
56 case NOTE_OFF:
if (!et) et =
"NOTE_OFF";
58 case NOTE_ON:
if (!et) et =
"NOTE_ON";
61 return string_format (
"%4u ch=%-2u %-10s pitch=%d vel=%f tune=%f id=%x",
62 frame, channel, et, key, velocity, tuning, noteid);
64 return string_format (
"%4u ch=%-2u %s control=%d value=%f (%02x) {%u}",
65 frame, channel, et, param, value, cval, fragment);
66 case PROGRAM_CHANGE:
if (!et) et =
"PROGRAM_CHANGE";
68 frame, channel, et, param);
71 case PITCH_BEND:
if (!et) et =
"PITCH_BEND";
73 frame, channel, et, value);
74 case SYSEX:
if (!et) et =
"SYSEX";
77 static_assert (
sizeof (MidiEvent) >= 2 *
sizeof (uint64_t));
79 return string_format (
"%4u MidiEvent-%u (%08x %08x)", frame, type, uu[0], uu[1]);
83make_note_on (uint16 chnl, uint8 mkey,
float velo,
float tune, uint nid)
85 MidiEvent ev (velo > 0 ? MidiEvent::NOTE_ON : MidiEvent::
NOTE_OFF);
95make_note_off (uint16 chnl, uint8 mkey,
float velo,
float tune, uint nid)
97 MidiEvent ev (MidiEvent::NOTE_OFF);
107make_aftertouch (uint16 chnl, uint8 mkey,
float velo,
float tune, uint nid)
109 MidiEvent ev (MidiEvent::AFTERTOUCH);
119make_pressure (uint16 chnl,
float velo)
121 MidiEvent ev (MidiEvent::CHANNEL_PRESSURE);
128make_control (uint16 chnl, uint prm,
float val)
130 MidiEvent ev (MidiEvent::CONTROL_CHANGE);
134 ev.cval = ev.value * 127;
139make_control8 (uint16 chnl, uint prm, uint8 cval)
141 MidiEvent ev (MidiEvent::CONTROL_CHANGE);
145 ev.value = ev.cval * (1.0 / 127.0);
150make_program (uint16 chnl, uint prgrm)
152 MidiEvent ev (MidiEvent::PROGRAM_CHANGE);
159make_pitch_bend (uint16 chnl,
float val)
161 MidiEvent ev (MidiEvent::PITCH_BEND);
168make_param_value (uint param,
double pvalue)
170 MidiEvent ev (MidiEvent::PARAM_VALUE);
178MidiEventOutput::MidiEventOutput ()
183MidiEventOutput::append (int16_t frame,
const MidiEvent &event)
185 const bool out_of_order_event = append_unsorted (frame, event);
192MidiEventOutput::append_unsorted (int16_t frame,
const MidiEvent &event)
197 const int64_t last_event_stamp = !events_.empty() ? events_.back().frame : 0;
198 events_.push_back (event);
199 events_.back().frame = frame;
200 return frame < last_event_stamp;
205MidiEventOutput::ensure_order ()
208 return a.frame < b.frame;
214MidiEventOutput::last_frame ()
const
216 return !events_.empty() ? events_.back().frame : 0;
#define assert_return(expr,...)
Return from the current function if expr is unmet and issue an assertion warning.
The Anklang C++ API namespace.
std::string string_format(const char *format, const Args &...args) __attribute__((__format__(__printf__
Format a string similar to sprintf(3) with support for std::string and std::ostringstream convertible...
MidiMessage
Extended type information for MidiEvent.
void fixed_sort(RandomIt first, RandomIt last, Compare comp=std::less< typename std::iterator_traits< RandomIt >::value_type >())
Use sorting networks to sort containers <= 16 elements without allocations.
@ NOTE_OFF
Ase internal Parameter update.
@ CONTROL_CHANGE
Control Change.
@ AFTERTOUCH
Key Pressure, polyphonic aftertouch.
@ CHANNEL_PRESSURE
Channel Aftertouch.
uint32_t uint
Provide 'uint' as convenience type.
MidiEvent data structure.
uint channel
0…15 for standard events