MIDI - mwicat/personal GitHub Wiki
GUI
Virtual midi piano keyboard - hhttps://sourceforge.net/projects/vmpk/files/vmpk/
Terminal
brew install gbevin/tools/sendmidi
brew install gbevin/tools/receivemidi
sendmidi dev 'IAC Driver Bus 1' ch 1 cc 80 127
receivemidi dev 'IAC Driver Bus 1'
Send sysex
import sys
import mido
from mido import Message
if len(sys.argv) < 2:
inputs = mido.get_output_names()
for x in inputs:
print(x)
sys.exit(1)
out_port_id = sys.argv[1]
port = mido.open_output(out_port_id)
def send(fname):
data = open(fname, 'rb').read()[1:-1]
msg = Message('sysex', data=data)
port.send(msg)
send('sys1')
RtMidi
sudo pip install python-rtmidi
Send
import rtmidi
midi_out = rtmidi.MidiOut()
ports = midiout.get_ports()
midi_out.open_port(0)
note_on = [0x90, 60, 112] # channel 1, middle C, velocity 112
note_off = [0x80, 60, 0]
midi_out.send_message(note_on)
midi_out.send_message(note_off)
Receive
import rtmidi
def from_midi_handler(event, data=None):
msg, deltatime = event
logger.debug('MIDI RECV: %s', msg)
midi_in = rtmidi.MidiIn()
ports = midiout.get_ports()
midi_in.open_port(0)
midi_in.set_callback(from_midi_handler)
MIDO
Install
sudo pip install mido python-rtmidi
Get devices
import mido
outs = mido.get_output_names()
# ['TiMidity:TiMidity port 0 128:0']
outp = mido.open_output('TiMidity port 0')
Send MIDI
import sys
import mido
from mido import Message
if len(sys.argv) < 2:
outputs = mido.get_output_names()
print('Usage: SCRIPT output_device')
print('Possible devices:')
for x in outputs:
print(x)
sys.exit(1)
outp_name = sys.argv[1]
outp = mido.open_output(outp_name)
# msg = Message('note_on', note=60)
# https://github.com/gluon/AbletonLive9_RemoteScripts/blob/master/LPD8/config.py
cc = Message('control_change', channel=0, control=1, value=127, time=0)
outp.send(cc)
Receive MIDI
import sys
import mido
from mido import Message
if len(sys.argv) < 2:
inputs = mido.get_input_names()
print 'Usage: SCRIPT input_device'
print 'Possible devices:'
for x in inputs:
print x
sys.exit(1)
inp = sys.argv[1]
port = mido.open_input(inp)
for msg in port:
if msg.type == 'note_on' and msg.velocity > 0:
print msg.note
MCU
- http://web.archive.org/web/20080126093602/http://members.aol.com/mhigrules/MCMap.htm
- https://images.thomann.de/pics/prod/151261_manual.pdf
- http://www.azslow.com/files/mcu.png
- http://web.archive.org/web/20080126093602/http://members.aol.com/mhigrules/MCMap.htm
Music21
import music21 as m21
Read midi
mf = m21.converter.parse('file.mid')
k = mf.analyze('key')
getdeg = k.getScaleDegreeFromPitch
notes = mf.parts[0].notes
getdeg(notes[0])
Transpose
def transpose(score, key=None):
if key is None:
key = score.parts[0].getKeySignatures()[0]
keyPitch, keyMode = key.pitchAndMode
basenote = m21.pitch.Pitch('c' if keyMode == 'major' else 'a')
ival = m21.interval.Interval(keyPitch, basenote)
key.transpose(ival, inPlace=True)
score.parts[0].transpose(ival, inPlace=True)
steps = int(ival.cents) / 100
return steps
python-midi
Editing
sudo apt-get install libasound2-dev swig python-dev
sudo pip install -e git+https://github.com/vishnubob/python-midi#egg=midi
import midi
pat = midi.read_midifile('myfile.mid')
notes = sorted(event for track in pat for event in track if type(event) in [midi.NoteOnEvent, midi.NoteOffEvent])
Play
import time
import midi
import midi.sequencer as sequencer
def play(notes):
for event in notes:
buf = seq.event_write(event, tick=True)
if buf is not None and buf < 1000:
time.sleep(.5)
pat = midi.read_midifile('myfile.mid')
pat.make_ticks_abs()
seq = sequencer.SequencerWrite(sequencer_resolution=pat.resolution)
seq.subscribe_port(128, 0)
seq.start_sequencer()
play(sorted(event for track in pat for event in track))
Render midi to wav
sudo apt-get install fluidsynth fluid-soundfont-gm
Name to pitch
NOTE_POS = 'C C# D D# E F F# G G# A A# B'.split()
def name_to_pitch(name):
octave = int(name[-1])
short_name = name[:-1]
pos = NOTE_POS.index(short_name)
pitch = octave * 12 + pos
return pitch
Mididings (midi router/filter/processor)
sudo apt-get install libglib2.0-dev libasound2-dev libjack-jackd2-dev libboost-dev libboost-python-dev libboost-thread-dev
sudo pip install decorator