06-midi-out.py - Sending MIDI events from pyo. ============================================================================================================================================ This program gives an example of how to build an algorithm with python/pyo and then send MIDI events from the Server to a connected MIDI synthesizer (physical or virtual). Available MIDI output methods (see the Server documentation for the details): - afterout(pitch, velocity, channel=0, timestamp=0) - bendout(value, channel=0, timestamp=0) - ctlout(ctlnum, value, channel=0, timestamp=0) - makenote(pitch, velocity, duration, channel=0) - noteout(pitch, velocity, channel=0, timestamp=0) - pressout(value, channel=0, timestamp=0) - programout(value, channel=0, timestamp=0) - sysexout(msg, timestamp=0) .. code-block:: python import random from pyo import * pm_list_devices() s = Server() # Open all MIDI output devices. s.setMidiOutputDevice(99) # Then boot the Server. s.boot() # Generates an audio ramp from 36 to 84, from # which MIDI pitches will be extracted. pitch = Phasor(freq=11, mul=48, add=36) # Global variable to count the down and up beats. count = 0 def midi_event(): global count # Retrieve the value of the pitch audio stream and convert it to an int. pit = int(pitch.get()) # If the count is 0 (down beat), play a louder and longer event, otherwise # play a softer and shorter one. if count == 0: vel = random.randint(90, 110) dur = 500 else: vel = random.randint(50, 70) dur = 125 # Increase and wrap the count to generate a 4 beats sequence. count = (count + 1) % 4 print("pitch: %d, velocity: %d, duration: %d" % (pit, vel, dur)) # The Server's `makenote` method generates a noteon event immediately # and the correponding noteoff event after `duration` milliseconds. s.makenote(pitch=pit, velocity=vel, duration=dur) # Generates a MIDI event every 125 milliseconds. pat = Pattern(midi_event, 0.125).play() s.gui(locals())