Module musx.midi.midimsg
A module that defines low level constructors and accessors for manipulating lists of bytes as midi messsages.
Expand source code
"""
A module that defines low level constructors and accessors for manipulating
lists of bytes as midi messsages.
"""
# Channel Messages
kNoteOff = 0b10000000
kNoteOn = 0b10010000
kAftertouch = 0b10100000
kCtrlChange = 0b10110000
kProgChange = 0b11000000
kChanPress = 0b11010000
kPitchBend = 0b11100000
# Channel Messages masks
kChannelMask = 0b00001111
kStatusMask = 0b11110000
# System Common Messages
kSysEx = 0b11110000
kTimeCode = 0b11110001
kSongPos = 0b11110010
kSongSel = 0b11110011
kTuneReq = 0b11110110
kEOE = 0b11110111
# System RealTime Messages
kTimingClock = 0b11111000
kStart = 0b11111010
kContinue = 0b11111011
kStop = 0b11111100
kActiveSens = 0b11111110
kReset = 0b11111111
# MetaMessages (only exist in midi file)
kMetaMsg = 0b11111111 # equals kReset but kReset is never found in midi files.
kSeqNumber = 0b00000000
kText = 0b00000001
kCopyRight = 0b00000010
kTrackName = 0b00000011
kInstName = 0b00000100
kLyric = 0b00000101
kMarker = 0b00000110
kCuePoint = 0b00000111
kProgName = 0b00001000
kDevName = 0b00001001
kChanPrefix = 0b00100000
kMidiPort = 0b00100001
kEOT = 0b00101111
kTempo = 0b01010001
kSMPTEOff = 0b00101010
kTimeSig = 0b01011000
kKeySig = 0b01011001
kSeqEvent = 0b01111111
# SMPTE Frame Formats
kfps24 = 0
kfps25 = 1
kfps30drop = 2
kfps30 = 3
def status(msg):
"""Returns the status byte of the message."""
return (msg[0] & kStatusMask) if is_channel_message(msg) else msg[0]
def has_status(msg, stat):
"""Returns true if the message is of the specified status type."""
return status(msg) == stat
# Channel Messages
def is_channel_message(msg):
"""Returns true if the message is a channel message."""
return msg[0] < kSysEx
def channel(msg):
"""Returns the channel number of the message."""
return msg[0] & kChannelMask
# Note Off and Note On
def note_off(chan, key, vel):
"""
Creates a note off message.
Parameters
----------
chan : 0-15
The midi channel of the message.
key : byte
The midi key number.
vel : byte
The velocity of the key up.
"""
return [kNoteOff | chan, key, vel]
def note_on(chan, key, vel):
"""
Creates a note on message.
Parameters
----------
chan : 0-15
The midi channel of the message.
key : byte
The midi key number.
vel : byte
The velocity of the key down.
"""
return [kNoteOn | chan, key, vel]
def keynum(msg):
"""Returns the key number of a note on, off, or aftertouch message."""
return msg[1]
def velocity(msg):
"""Returns the velocity value of a note on or off message."""
return msg[2]
# Aftertouch
def aftertouch(chan, key, press):
"""
Creates an aftertouch message.
Parameters
----------
chan : 0-15
The midi channel of the message.
key : byte
The midi key number.
press : byte
The pressure value.
"""
return [kAftertouch | chan, key, press]
def touch(msg):
"""Returns the value of an aftertouch message."""
return msg[2]
# Control Change
def control_change(chan, ctrl, val):
"""
Creates a control change message.
Parameters
----------
chan : 0-15
The midi channel of the message.
ctrl : byte
The controller number.
val : byte
The controller value.
"""
return [kCtrlChange | chan, ctrl, val]
def controller(msg):
"""Returns the controller number of a control change message."""
return msg[1]
def control(msg):
"""Returns the controller value of a control change message."""
return msg[2]
# Program Change
def program_change(chan, prog):
"""
Creates a program change message.
Parameters
----------
chan : 0-15
The midi channel of the message.
prog : byte
The program value.
"""
return [kProgChange | chan, prog]
def program(msg):
"""Returns the program value of a program change message."""
return msg[1]
# Channel Pressure
def channel_pressure(chan, press):
"""
Creates a channel pressure message.
Parameters
----------
chan : 0-15
The midi channel of the message.
press : byte
The pressure value.
"""
return [kChanPress | chan, press]
def pressure(msg):
"""Returns the pressure value of a channel pressure message."""
if status(msg) == kAftertouch:
assert False, "shouldnt happen"
return msg[1]
# Pitch Bend
def pitch_bend(chan, value):
"""
Creates a pitch bend message.
Parameters
----------
chan : 0-15
The midi channel of the message.
value : integer
The 14-bit pitch bend value.
"""
return [kPitchBend | chan, value & 0x7F, (value >> 7) & 0x7F]
def bend(msg):
"""Returns the pitch bend value of a pitch bend message."""
return (msg[2] & 0x7F) << 7 | (msg[1] & 0x7F)
# Channel Mode Messages (these are just control changes 120-127)
def all_sounds_off(chan, val):
"""
Creates an 'all sounds off' control message.
Parameters
----------
chan : 0-15
The midi channel of the message.
val : byte
The controller value.
"""
return control_change(chan, 120, val)
def reset_all_controllers(chan, val):
"""
Creates a 'reset all controllers' control message.
Parameters
----------
chan : 0-15
The midi channel of the message.
val : byte
The controller value.
"""
return control_change(chan, 121, val)
def local_control(chan, val):
"""
Creates a 'local control' control message.
Parameters
----------
chan : 0-15
The midi channel of the message.
val : byte
The controller value.
"""
return control_change(chan, 122, val)
def all_notes_off(chan):
"""
Creates an 'all notes off' control message.
Parameters
----------
chan : 0-15
The midi channel of the message.
"""
return control_change(chan, 123, 0)
def omni_mode_off(chan):
"""
Creates a 'omni mode off' control message.
Parameters
----------
chan : 0-15
The midi channel of the message.
"""
return control_change(chan, 124, 0)
def omni_mode_on(chan):
"""
Creates a 'omni mode on' control message.
Parameters
----------
chan : 0-15
The midi channel of the message.
"""
return control_change(chan, 125, 0)
def mono_mode_on(chan):
"""
Creates a 'mono mode on' control message.
Parameters
----------
chan : 0-15
The midi channel of the message.
"""
return control_change(chan, 126, 0)
def mono_mode_off(chan, chans):
"""
Creates a 'mono mode off' control message.
Parameters
----------
chan : 0-15
The midi channel of the message.
chans : byte
The channels.
"""
return control_change(chan, 126, chans)
def poly_mode_on(chan):
"""
Creates a 'poly mode on' control message.
Parameters
----------
chan : 0-15
The midi channel of the message.
"""
return control_change(chan, 127, 0)
def is_system_message(msg):
"""Returns true if the message is a system message."""
return msg[0] >= kSysEx
def is_system_common_message(msg):
"""Returns true if the message is a system common message."""
return kSysEx <= msg[0] <= kEOE
def is_system_realtime_message(msg):
"""Returns true if the message is a system realtime message."""
return kTimingClock <= msg[0] <= kReset
# System Common Messages. (these are not valid in midi files.)
def sysex(data):
"""
Creates a system exclusive message ending with EOE.
Parameters
----------
data : list
A list of data bytes ending with EOE.
"""
if data[-1] != kEOE:
data.append(kEOE) # make sure data includes EOE
return [kSysEx, len(data), bytes(data)]
def midi_time_code(typ, val):
"""
Creates a time code message.
Parameters
----------
type : 0-15
The time code type.
value : byte
The type code value.
"""
return [kTimeCode, (typ << 4) | val]
def midi_song_position(pos):
"""
Creates a song position message.
Parameters
----------
pos : int
A 14 bit song pointer position.
"""
lsb = pos & 0x7F
msb = pos >> 7
return [kSongPos, lsb, msb]
def midi_song_select(song):
"""
Creates a song select message.
Parameters
----------
song : byte
The song number to set.
"""
return [kSongSel, song]
def midi_tune_request():
"""Creates a midi tune request message."""
return [kTuneReq]
def midi_end_of_exclusive():
"""Creates an end of exclusive message."""
return [kEOE]
# System Real Time Messages (these are not valid in midi files.)
def midi_clock():
"""Creates a midi clock message."""
return [kTimingClock]
def midi_start():
"""Creates a midi start message."""
return [kStart]
def midi_continue():
"""Creates a midi continue message."""
return [kContinue]
def midi_stop():
"""Creates a midi stop message."""
return [kStop]
def active_sensing():
"""Creates an active sensing midi message."""
return [kActiveSens]
def midi_reset():
"""Creates a midi reset message."""
return [kReset]
# Midi Meta Messages. (these have the same upper byte value 0xFF as
# as system messages but they are mutually exclusive: system messages cannot
# appear in midi files and meta messages cannot be sent to devices)
def is_meta_message(msg):
"""Returns true if the message is a midi meta message."""
return msg[0] == kMetaMsg and len(msg) >= 3
def is_meta_message_type(msg, typ):
"""Returns true if the message is a midi meta message of the specified type."""
return is_meta_message(msg) and msg[1] == typ
def int_to_vlq(val):
"""
Converts an integer value into a variable length quantity (list).
"""
vlq = []
for i in range(21, 0, -7):
if val >= (1 << i):
vlq.append(((val >> i) & 0x7F) | 0x80)
vlq.append(val & 0x7F)
return vlq
def meta_seq_number(num):
"""
Creates a sequence number meta message.
Parameters
----------
num : byte
The sequence number
"""
msb = num & (0x7F << 7)
lsb = num & 0x7f
return [kMetaMsg, kSeqNumber, 2, msb, lsb]
def text_meta_message(metatype, txt):
"""
Creates a meta text message.
Parameters
----------
metatype : byte
The meta type id of the message.
txt : string
The text string for the message.
"""
data = txt.encode('ascii') if isinstance(txt, str) else txt
assert isinstance(data, bytes), "meta text message data is not bytes()."
return [kMetaMsg, metatype, len(data), data]
def text(meta):
"""
Returns the meta message's text as a string.
"""
return meta[3].decode('ascii')
def meta_text(txt):
"""
Creates a text meta message.
Parameters
----------
txt : string
The text string for the message.
"""
return text_meta_message(kText, txt)
def meta_copyright(txt):
"""
Creates a copyright message.
Parameters
----------
txt : string
The copyright string for the message.
"""
return text_meta_message(kCopyRight, txt)
def meta_track_name(txt):
"""
Creates a track name meta message.
Parameters
----------
txt : string
The track name for the message.
"""
return text_meta_message(kTrackName, txt)
def meta_inst_name(txt):
"""
Creates an instrument name meta message.
Parameters
----------
txt : string
The instrument name for the message.
"""
return text_meta_message(kInstName, txt)
def meta_lyric(txt):
"""
Creates a lyric meta message.
Parameters
----------
txt : string
The lyrics string for the message.
"""
return text_meta_message(kLyric, txt)
def meta_marker(txt):
"""
Creates a marker meta message.
Parameters
----------
txt : string
The meta marker text for the message.
"""
return text_meta_message(kMarker, txt)
def meta_cue(txt):
"""
Creates a cue meta message.
Parameters
----------
txt : string
The cueing string for the message.
"""
return text_meta_message(kCuePoint, txt)
def meta_program_name(txt):
"""
Creates a program name meta message.
Parameters
----------
txt : string
The cue string for the message.
"""
return text_meta_message(kProgName, txt)
def meta_device_name(txt):
"""
Creates a device name meta message.
Parameters
----------
txt : string
The device name.
"""
return text_meta_message(kDevName, txt)
def meta_chan_prefix(chan):
"""
Creates a channel prefix meta message.
Parameters
----------
chan : byte
The channel prefix number.
"""
return [kMetaMsg, kChanPrefix, 1, chan]
def meta_port(port):
"""
Creates a port meta message.
Note: **This meta event is depreciated in the midi spec.**
"""
return [kMetaMsg, kMidiPort, 1, port]
def meta_eot():
"""Creates an end of track meta message."""
return [kMetaMsg, kEOT, 0]
def meta_tempo(usecs_per_quarter):
"""
Creates a tempo meta message.
Parameters
----------
usecs_per_quarter : int
The number of microseconds in a quarter note.
"""
msg = [kMetaMsg, kTempo, 3]
for i in range(16, -1, -8):
msg.append((usecs_per_quarter & (0xff << i)) >> i)
return msg
def tempo(msg):
"""Returns the usec tempo value from a tempo meta message."""
return (msg[3] << 16) + (msg[4] << 8) + msg[5]
def meta_time_sig(top, bot, clocks=24, tsecs=8):
"""
Creates a time signature meta message.
Parameters
----------
top : byte
The top number of the time signature
bot : byte
The power of 2 of the bottom number: 0 is top/1, 2 is top/4, etc.
clocks : byte
The number of MIDI clocks between metronome clicks.
tsecs : byte
the number of 32nds in a quarter note (usually 8).
"""
return [kMetaMsg, kTimeSig, 4, top, bot, clocks, tsecs]
def meta_key_sig(sf, mode):
"""
Creates a key signature meta message.
Parameters
----------
sf : -7 to 7
Negative numbers name flat keys (Eb is -3 etc.) and positive numbers name sharp keys (A is 3 etc.).
mode : 0 or 1
Specify 0 for major keys and 1 for minor keys.
"""
return [kMetaMsg, kKeySig, 2, sf, mode]
def meta_seq_event(data):
"""
Creates a sequencer specific meta message.
Parameters
----------
data : list
A list of bytes to send to the sequencer.
"""
return [kMetaMsg, kSeqEvent, len(data), bytes(data)]
Functions
def active_sensing()
-
Creates an active sensing midi message.
Expand source code
def active_sensing(): """Creates an active sensing midi message.""" return [kActiveSens]
def aftertouch(chan, key, press)
-
Creates an aftertouch message.
Parameters
chan
:0-15
- The midi channel of the message.
key
:byte
- The midi key number.
press
:byte
- The pressure value.
Expand source code
def aftertouch(chan, key, press): """ Creates an aftertouch message. Parameters ---------- chan : 0-15 The midi channel of the message. key : byte The midi key number. press : byte The pressure value. """ return [kAftertouch | chan, key, press]
def all_notes_off(chan)
-
Creates an 'all notes off' control message.
Parameters
chan
:0-15
- The midi channel of the message.
Expand source code
def all_notes_off(chan): """ Creates an 'all notes off' control message. Parameters ---------- chan : 0-15 The midi channel of the message. """ return control_change(chan, 123, 0)
def all_sounds_off(chan, val)
-
Creates an 'all sounds off' control message.
Parameters
chan
:0-15
- The midi channel of the message.
val
:byte
- The controller value.
Expand source code
def all_sounds_off(chan, val): """ Creates an 'all sounds off' control message. Parameters ---------- chan : 0-15 The midi channel of the message. val : byte The controller value. """ return control_change(chan, 120, val)
def bend(msg)
-
Returns the pitch bend value of a pitch bend message.
Expand source code
def bend(msg): """Returns the pitch bend value of a pitch bend message.""" return (msg[2] & 0x7F) << 7 | (msg[1] & 0x7F)
def channel(msg)
-
Returns the channel number of the message.
Expand source code
def channel(msg): """Returns the channel number of the message.""" return msg[0] & kChannelMask
def channel_pressure(chan, press)
-
Creates a channel pressure message.
Parameters
chan
:0-15
- The midi channel of the message.
press
:byte
- The pressure value.
Expand source code
def channel_pressure(chan, press): """ Creates a channel pressure message. Parameters ---------- chan : 0-15 The midi channel of the message. press : byte The pressure value. """ return [kChanPress | chan, press]
def control(msg)
-
Returns the controller value of a control change message.
Expand source code
def control(msg): """Returns the controller value of a control change message.""" return msg[2]
def control_change(chan, ctrl, val)
-
Creates a control change message.
Parameters
chan
:0-15
- The midi channel of the message.
ctrl
:byte
- The controller number.
val
:byte
- The controller value.
Expand source code
def control_change(chan, ctrl, val): """ Creates a control change message. Parameters ---------- chan : 0-15 The midi channel of the message. ctrl : byte The controller number. val : byte The controller value. """ return [kCtrlChange | chan, ctrl, val]
def controller(msg)
-
Returns the controller number of a control change message.
Expand source code
def controller(msg): """Returns the controller number of a control change message.""" return msg[1]
def has_status(msg, stat)
-
Returns true if the message is of the specified status type.
Expand source code
def has_status(msg, stat): """Returns true if the message is of the specified status type.""" return status(msg) == stat
def int_to_vlq(val)
-
Converts an integer value into a variable length quantity (list).
Expand source code
def int_to_vlq(val): """ Converts an integer value into a variable length quantity (list). """ vlq = [] for i in range(21, 0, -7): if val >= (1 << i): vlq.append(((val >> i) & 0x7F) | 0x80) vlq.append(val & 0x7F) return vlq
def is_channel_message(msg)
-
Returns true if the message is a channel message.
Expand source code
def is_channel_message(msg): """Returns true if the message is a channel message.""" return msg[0] < kSysEx
def is_meta_message(msg)
-
Returns true if the message is a midi meta message.
Expand source code
def is_meta_message(msg): """Returns true if the message is a midi meta message.""" return msg[0] == kMetaMsg and len(msg) >= 3
def is_meta_message_type(msg, typ)
-
Returns true if the message is a midi meta message of the specified type.
Expand source code
def is_meta_message_type(msg, typ): """Returns true if the message is a midi meta message of the specified type.""" return is_meta_message(msg) and msg[1] == typ
def is_system_common_message(msg)
-
Returns true if the message is a system common message.
Expand source code
def is_system_common_message(msg): """Returns true if the message is a system common message.""" return kSysEx <= msg[0] <= kEOE
def is_system_message(msg)
-
Returns true if the message is a system message.
Expand source code
def is_system_message(msg): """Returns true if the message is a system message.""" return msg[0] >= kSysEx
def is_system_realtime_message(msg)
-
Returns true if the message is a system realtime message.
Expand source code
def is_system_realtime_message(msg): """Returns true if the message is a system realtime message.""" return kTimingClock <= msg[0] <= kReset
def keynum(msg)
-
Returns the key number of a note on, off, or aftertouch message.
Expand source code
def keynum(msg): """Returns the key number of a note on, off, or aftertouch message.""" return msg[1]
def local_control(chan, val)
-
Creates a 'local control' control message.
Parameters
chan
:0-15
- The midi channel of the message.
val
:byte
- The controller value.
Expand source code
def local_control(chan, val): """ Creates a 'local control' control message. Parameters ---------- chan : 0-15 The midi channel of the message. val : byte The controller value. """ return control_change(chan, 122, val)
def meta_chan_prefix(chan)
-
Creates a channel prefix meta message.
Parameters
chan
:byte
The channel prefix number.
Expand source code
def meta_chan_prefix(chan): """ Creates a channel prefix meta message. Parameters ---------- chan : byte The channel prefix number. """ return [kMetaMsg, kChanPrefix, 1, chan]
def meta_copyright(txt)
-
Creates a copyright message.
Parameters
txt
:string
- The copyright string for the message.
Expand source code
def meta_copyright(txt): """ Creates a copyright message. Parameters ---------- txt : string The copyright string for the message. """ return text_meta_message(kCopyRight, txt)
def meta_cue(txt)
-
Creates a cue meta message.
Parameters
txt
:string
- The cueing string for the message.
Expand source code
def meta_cue(txt): """ Creates a cue meta message. Parameters ---------- txt : string The cueing string for the message. """ return text_meta_message(kCuePoint, txt)
def meta_device_name(txt)
-
Creates a device name meta message.
Parameters
txt
:string
- The device name.
Expand source code
def meta_device_name(txt): """ Creates a device name meta message. Parameters ---------- txt : string The device name. """ return text_meta_message(kDevName, txt)
def meta_eot()
-
Creates an end of track meta message.
Expand source code
def meta_eot(): """Creates an end of track meta message.""" return [kMetaMsg, kEOT, 0]
def meta_inst_name(txt)
-
Creates an instrument name meta message.
Parameters
txt
:string
- The instrument name for the message.
Expand source code
def meta_inst_name(txt): """ Creates an instrument name meta message. Parameters ---------- txt : string The instrument name for the message. """ return text_meta_message(kInstName, txt)
def meta_key_sig(sf, mode)
-
Creates a key signature meta message.
Parameters
sf
:-7 to 7
- Negative numbers name flat keys (Eb is -3 etc.) and positive numbers name sharp keys (A is 3 etc.).
mode
:0
or1
- Specify 0 for major keys and 1 for minor keys.
Expand source code
def meta_key_sig(sf, mode): """ Creates a key signature meta message. Parameters ---------- sf : -7 to 7 Negative numbers name flat keys (Eb is -3 etc.) and positive numbers name sharp keys (A is 3 etc.). mode : 0 or 1 Specify 0 for major keys and 1 for minor keys. """ return [kMetaMsg, kKeySig, 2, sf, mode]
def meta_lyric(txt)
-
Creates a lyric meta message.
Parameters
txt
:string
- The lyrics string for the message.
Expand source code
def meta_lyric(txt): """ Creates a lyric meta message. Parameters ---------- txt : string The lyrics string for the message. """ return text_meta_message(kLyric, txt)
def meta_marker(txt)
-
Creates a marker meta message.
Parameters
txt
:string
- The meta marker text for the message.
Expand source code
def meta_marker(txt): """ Creates a marker meta message. Parameters ---------- txt : string The meta marker text for the message. """ return text_meta_message(kMarker, txt)
def meta_port(port)
-
Creates a port meta message. Note: This meta event is depreciated in the midi spec.
Expand source code
def meta_port(port): """ Creates a port meta message. Note: **This meta event is depreciated in the midi spec.** """ return [kMetaMsg, kMidiPort, 1, port]
def meta_program_name(txt)
-
Creates a program name meta message.
Parameters
txt
:string
- The cue string for the message.
Expand source code
def meta_program_name(txt): """ Creates a program name meta message. Parameters ---------- txt : string The cue string for the message. """ return text_meta_message(kProgName, txt)
def meta_seq_event(data)
-
Creates a sequencer specific meta message.
Parameters
data
:list
- A list of bytes to send to the sequencer.
Expand source code
def meta_seq_event(data): """ Creates a sequencer specific meta message. Parameters ---------- data : list A list of bytes to send to the sequencer. """ return [kMetaMsg, kSeqEvent, len(data), bytes(data)]
def meta_seq_number(num)
-
Creates a sequence number meta message.
Parameters
num
:byte
- The sequence number
Expand source code
def meta_seq_number(num): """ Creates a sequence number meta message. Parameters ---------- num : byte The sequence number """ msb = num & (0x7F << 7) lsb = num & 0x7f return [kMetaMsg, kSeqNumber, 2, msb, lsb]
def meta_tempo(usecs_per_quarter)
-
Creates a tempo meta message.
Parameters
usecs_per_quarter
:int
- The number of microseconds in a quarter note.
Expand source code
def meta_tempo(usecs_per_quarter): """ Creates a tempo meta message. Parameters ---------- usecs_per_quarter : int The number of microseconds in a quarter note. """ msg = [kMetaMsg, kTempo, 3] for i in range(16, -1, -8): msg.append((usecs_per_quarter & (0xff << i)) >> i) return msg
def meta_text(txt)
-
Creates a text meta message.
Parameters
txt
:string
- The text string for the message.
Expand source code
def meta_text(txt): """ Creates a text meta message. Parameters ---------- txt : string The text string for the message. """ return text_meta_message(kText, txt)
def meta_time_sig(top, bot, clocks=24, tsecs=8)
-
Creates a time signature meta message.
Parameters
top
:byte
- The top number of the time signature
bot
:byte
- The power of 2 of the bottom number: 0 is top/1, 2 is top/4, etc.
clocks
:byte
- The number of MIDI clocks between metronome clicks.
tsecs
:byte
- the number of 32nds in a quarter note (usually 8).
Expand source code
def meta_time_sig(top, bot, clocks=24, tsecs=8): """ Creates a time signature meta message. Parameters ---------- top : byte The top number of the time signature bot : byte The power of 2 of the bottom number: 0 is top/1, 2 is top/4, etc. clocks : byte The number of MIDI clocks between metronome clicks. tsecs : byte the number of 32nds in a quarter note (usually 8). """ return [kMetaMsg, kTimeSig, 4, top, bot, clocks, tsecs]
def meta_track_name(txt)
-
Creates a track name meta message.
Parameters
txt
:string
- The track name for the message.
Expand source code
def meta_track_name(txt): """ Creates a track name meta message. Parameters ---------- txt : string The track name for the message. """ return text_meta_message(kTrackName, txt)
def midi_clock()
-
Creates a midi clock message.
Expand source code
def midi_clock(): """Creates a midi clock message.""" return [kTimingClock]
def midi_continue()
-
Creates a midi continue message.
Expand source code
def midi_continue(): """Creates a midi continue message.""" return [kContinue]
def midi_end_of_exclusive()
-
Creates an end of exclusive message.
Expand source code
def midi_end_of_exclusive(): """Creates an end of exclusive message.""" return [kEOE]
def midi_reset()
-
Creates a midi reset message.
Expand source code
def midi_reset(): """Creates a midi reset message.""" return [kReset]
def midi_song_position(pos)
-
Creates a song position message.
Parameters
pos
:int
- A 14 bit song pointer position.
Expand source code
def midi_song_position(pos): """ Creates a song position message. Parameters ---------- pos : int A 14 bit song pointer position. """ lsb = pos & 0x7F msb = pos >> 7 return [kSongPos, lsb, msb]
def midi_song_select(song)
-
Creates a song select message.
Parameters
song
:byte
- The song number to set.
Expand source code
def midi_song_select(song): """ Creates a song select message. Parameters ---------- song : byte The song number to set. """ return [kSongSel, song]
def midi_start()
-
Creates a midi start message.
Expand source code
def midi_start(): """Creates a midi start message.""" return [kStart]
def midi_stop()
-
Creates a midi stop message.
Expand source code
def midi_stop(): """Creates a midi stop message.""" return [kStop]
def midi_time_code(typ, val)
-
Creates a time code message.
Parameters
type
:0-15
- The time code type.
value
:byte
- The type code value.
Expand source code
def midi_time_code(typ, val): """ Creates a time code message. Parameters ---------- type : 0-15 The time code type. value : byte The type code value. """ return [kTimeCode, (typ << 4) | val]
def midi_tune_request()
-
Creates a midi tune request message.
Expand source code
def midi_tune_request(): """Creates a midi tune request message.""" return [kTuneReq]
def mono_mode_off(chan, chans)
-
Creates a 'mono mode off' control message.
Parameters
chan
:0-15
- The midi channel of the message.
chans
:byte
- The channels.
Expand source code
def mono_mode_off(chan, chans): """ Creates a 'mono mode off' control message. Parameters ---------- chan : 0-15 The midi channel of the message. chans : byte The channels. """ return control_change(chan, 126, chans)
def mono_mode_on(chan)
-
Creates a 'mono mode on' control message.
Parameters
chan
:0-15
- The midi channel of the message.
Expand source code
def mono_mode_on(chan): """ Creates a 'mono mode on' control message. Parameters ---------- chan : 0-15 The midi channel of the message. """ return control_change(chan, 126, 0)
def note_off(chan, key, vel)
-
Creates a note off message.
Parameters
chan
:0-15
- The midi channel of the message.
key
:byte
- The midi key number.
vel
:byte
- The velocity of the key up.
Expand source code
def note_off(chan, key, vel): """ Creates a note off message. Parameters ---------- chan : 0-15 The midi channel of the message. key : byte The midi key number. vel : byte The velocity of the key up. """ return [kNoteOff | chan, key, vel]
def note_on(chan, key, vel)
-
Creates a note on message.
Parameters
chan
:0-15
- The midi channel of the message.
key
:byte
- The midi key number.
vel
:byte
- The velocity of the key down.
Expand source code
def note_on(chan, key, vel): """ Creates a note on message. Parameters ---------- chan : 0-15 The midi channel of the message. key : byte The midi key number. vel : byte The velocity of the key down. """ return [kNoteOn | chan, key, vel]
def omni_mode_off(chan)
-
Creates a 'omni mode off' control message.
Parameters
chan
:0-15
- The midi channel of the message.
Expand source code
def omni_mode_off(chan): """ Creates a 'omni mode off' control message. Parameters ---------- chan : 0-15 The midi channel of the message. """ return control_change(chan, 124, 0)
def omni_mode_on(chan)
-
Creates a 'omni mode on' control message.
Parameters
chan
:0-15
- The midi channel of the message.
Expand source code
def omni_mode_on(chan): """ Creates a 'omni mode on' control message. Parameters ---------- chan : 0-15 The midi channel of the message. """ return control_change(chan, 125, 0)
def pitch_bend(chan, value)
-
Creates a pitch bend message.
Parameters
chan
:0-15
- The midi channel of the message.
value
:integer
- The 14-bit pitch bend value.
Expand source code
def pitch_bend(chan, value): """ Creates a pitch bend message. Parameters ---------- chan : 0-15 The midi channel of the message. value : integer The 14-bit pitch bend value. """ return [kPitchBend | chan, value & 0x7F, (value >> 7) & 0x7F]
def poly_mode_on(chan)
-
Creates a 'poly mode on' control message.
Parameters
chan
:0-15
- The midi channel of the message.
Expand source code
def poly_mode_on(chan): """ Creates a 'poly mode on' control message. Parameters ---------- chan : 0-15 The midi channel of the message. """ return control_change(chan, 127, 0)
def pressure(msg)
-
Returns the pressure value of a channel pressure message.
Expand source code
def pressure(msg): """Returns the pressure value of a channel pressure message.""" if status(msg) == kAftertouch: assert False, "shouldnt happen" return msg[1]
def program(msg)
-
Returns the program value of a program change message.
Expand source code
def program(msg): """Returns the program value of a program change message.""" return msg[1]
def program_change(chan, prog)
-
Creates a program change message.
Parameters
chan
:0-15
- The midi channel of the message.
prog
:byte
- The program value.
Expand source code
def program_change(chan, prog): """ Creates a program change message. Parameters ---------- chan : 0-15 The midi channel of the message. prog : byte The program value. """ return [kProgChange | chan, prog]
def reset_all_controllers(chan, val)
-
Creates a 'reset all controllers' control message.
Parameters
chan
:0-15
- The midi channel of the message.
val
:byte
- The controller value.
Expand source code
def reset_all_controllers(chan, val): """ Creates a 'reset all controllers' control message. Parameters ---------- chan : 0-15 The midi channel of the message. val : byte The controller value. """ return control_change(chan, 121, val)
def status(msg)
-
Returns the status byte of the message.
Expand source code
def status(msg): """Returns the status byte of the message.""" return (msg[0] & kStatusMask) if is_channel_message(msg) else msg[0]
def sysex(data)
-
Creates a system exclusive message ending with EOE.
Parameters
data
:list
- A list of data bytes ending with EOE.
Expand source code
def sysex(data): """ Creates a system exclusive message ending with EOE. Parameters ---------- data : list A list of data bytes ending with EOE. """ if data[-1] != kEOE: data.append(kEOE) # make sure data includes EOE return [kSysEx, len(data), bytes(data)]
def tempo(msg)
-
Returns the usec tempo value from a tempo meta message.
Expand source code
def tempo(msg): """Returns the usec tempo value from a tempo meta message.""" return (msg[3] << 16) + (msg[4] << 8) + msg[5]
def text(meta)
-
Returns the meta message's text as a string.
Expand source code
def text(meta): """ Returns the meta message's text as a string. """ return meta[3].decode('ascii')
def text_meta_message(metatype, txt)
-
Creates a meta text message.
Parameters
metatype
:byte
- The meta type id of the message.
txt
:string
- The text string for the message.
Expand source code
def text_meta_message(metatype, txt): """ Creates a meta text message. Parameters ---------- metatype : byte The meta type id of the message. txt : string The text string for the message. """ data = txt.encode('ascii') if isinstance(txt, str) else txt assert isinstance(data, bytes), "meta text message data is not bytes()." return [kMetaMsg, metatype, len(data), data]
def touch(msg)
-
Returns the value of an aftertouch message.
Expand source code
def touch(msg): """Returns the value of an aftertouch message.""" return msg[2]
def velocity(msg)
-
Returns the velocity value of a note on or off message.
Expand source code
def velocity(msg): """Returns the velocity value of a note on or off message.""" return msg[2]