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

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