35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
# File 'lib/rtmidi/message.rb', line 35
def serialize(message)
case message
when Array
normalize_bytes(message, allow_empty: false)
when NoteOff
[status_byte(0x80, message.channel), data_byte(message.note, "note"), data_byte(message.velocity, "velocity")]
when NoteOn
[status_byte(0x90, message.channel), data_byte(message.note, "note"), data_byte(message.velocity, "velocity")]
when PolyAftertouch
[status_byte(0xA0, message.channel), data_byte(message.note, "note"), data_byte(message.pressure, "pressure")]
when ControlChange
[status_byte(0xB0, message.channel), data_byte(message.controller, "controller"), data_byte(message.value, "value")]
when ProgramChange
[status_byte(0xC0, message.channel), data_byte(message.program, "program")]
when ChannelAftertouch
[status_byte(0xD0, message.channel), data_byte(message.pressure, "pressure")]
when PitchBend
bend = integer_in_range(message.value, 0, 16_383, "value")
[status_byte(0xE0, message.channel), bend & 0x7F, (bend >> 7) & 0x7F]
when SysEx
serialize_sysex(message.data)
when TimeCodeQuarterFrame
message_type = integer_in_range(message.message_type, 0, 7, "message_type")
value = integer_in_range(message.value, 0, 15, "value")
[0xF1, (message_type << 4) | value]
when SongPositionPointer
position = integer_in_range(message.position, 0, 16_383, "position")
[0xF2, position & 0x7F, (position >> 7) & 0x7F]
when SongSelect
[0xF3, data_byte(message.song, "song")]
when TuneRequest
[0xF6]
when TimingClock
[0xF8]
when Start
[0xFA]
when Continue
[0xFB]
when Stop
[0xFC]
when ActiveSensing
[0xFE]
when SystemReset
[0xFF]
when Unknown
normalize_bytes(message.bytes, allow_empty: false)
else
raise ArgumentError, "unsupported MIDI message: #{message.inspect}"
end
end
|