Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Informatique musicale : créer un séquenceur pas-à-pas avec Python

Informatique musicale : créer un séquenceur pas-à-pas avec Python

Pycon-Fr 2016, Rennes

Aujourd’hui, que ce soit via « Maschine » de Native Instruments, « Push » de Ableton, ou encore via des machines à l’esprit plus vintage comme le « Dark Time » de Doepfer ou des émulations de vieilles boites à rythmes, les musiciens retrouvent le goût du séquencement pas à pas ou « Step Sequencing ».
Le bidouilleur que je suis avait envie de détourner son matériel pour reproduire ce type d’outil de création…

Après une introduction au MIDI et aux principes d’un séquenceur, nous verrons comment nous pouvons, avec Python et la librairie mido, « hacker » un certain synthétiseur hardware pour en faire un séquenceur pas à pas, à l’aide d’une boucle d’événements. Nous essaierons même de l’interfacer avec Ableton Live pour contrôler non plus les sons du synthétiseur, mais des samples !

Vidéo disponible ici : https://www.pycon.fr/2016/videos/informatique-musicale-creer-un-sequenceur-pas-a-pas-avec-python.html

-----
Nowadays, using Native Instruments "Maschine", Ableton "Push", or machines with a vintage heritage such as Doepfer "Dark Time", musicians enjoy getting back to a special kind of sequencing which is step sequencing.
I wanted to hack with my current hardware to try and do the same as these tools.

After an introduction to MIDI and notions of sequencing, we will see how, thanks to Python and the Mido library, we can hack hardware to turn it into a step sequencer, using an event loop. We will try and interface our program with Ableton Live to control not only sounds from the synthetizer, but also trigger samples!

Video (in French) available @ https://www.pycon.fr/2016/videos/informatique-musicale-creer-un-sequenceur-pas-a-pas-avec-python.html

Yann Gravrand

October 16, 2016
Tweet

More Decks by Yann Gravrand

Other Decks in Technology

Transcript

  1. BUILD A STEP SEQUENCER
    IN PYTHON
    Pycon-Fr, Rennes, 2016

    View Slide

  2. WHO AM I?
    Yann Gravrand (@ygravrand)
    Tech lead
    Musicos

    View Slide

  3. PART 1: BACKGROUND
    Musical instruments
    Synthetizers and samplers
    Sequencers
    Step sequencers

    View Slide

  4. MUSICAL INSTRUMENTS
    Can be played by humans
    Some can be "played" by computers:
    Synthetizers
    Samplers
    ...

    View Slide

  5. SYNTHETIZERS
    Sound generators
    Generally, a lot of parameters can be tweaked

    View Slide

  6. FAMOUS SYNTHETIZERS
    Minimoog (analog) : 70s
    DX7 (digital) : 80s

    View Slide

  7. FAMOUS SYNTHETIZERS
    Nord Lead
    (analog modeling)
    Mininova
    (analog modeling)

    View Slide

  8. VST
    VST Plugins

    View Slide

  9. SAMPLERS
    Do not generate sounds themselves
    Play samples (little chunks of sound)

    View Slide

  10. SAMPLES / NOTES:
    One sample for the whole keyboard (pitch adjusted or
    not)

    View Slide

  11. One sample for each note

    View Slide

  12. One sample for a group of notes, pitch is ajusted

    View Slide

  13. DRUM MACHINES?
    Sound generator + step sequencer
    TR 909
    Tempest

    View Slide

  14. SEQUENCERS
    Play a sequence of notes
    Several tracks, instruments...

    View Slide

  15. STEP SEQUENCER
    A 4/4 measure is divided into:
    4 quarter notes
    Each quarter note is divided into 4 steps --> A sequence
    is usually 16 steps long

    View Slide

  16. STEP SEQUENCER
    Example: on the TR 808

    View Slide

  17. STEP SEQUENCER
    For each step, we define:
    the note / pitch
    other attributes: length...
    ... and activate it or not

    View Slide

  18. EXAMPLES
    Daft punk - Aerodynamic @ 1:03
    4 * 16-step patterns

    View Slide

  19. EXAMPLES
    Daft punk - Aerodynamic @ 2:28
    4 * 16-step patterns, some notes off

    View Slide

  20. USING A STEP SEQUENCER
    "Live" mode: turn steps on and off in real time, adjust
    pitch, length...
    "Step by step" mode: for each step, define the note
    attributes. No timing, no rush

    View Slide

  21. PART 2: THE PROJECT
    Project goals
    MIDI
    Using mido
    The Dirty Part: blocking, threads, asyncio...

    View Slide

  22. I HAD
    A cool synth
    Colorful (and empty) pads

    View Slide

  23. AND
    A snake

    View Slide

  24. PROJECT GOALS
    Make the synthetizer play notes using Python
    Modify and turn notes on / off to create a sequence
    Implement "step by step" and "live" modes
    Change tempo in real time
    Make interactions possible with any controller...
    ... Starting with mine, of course :)

    View Slide

  25. MIDI: MUSICAL INSTRUMENT DIGITAL INTERFACE
    Extremely old standard: 1983!
    Still largely in use today
    To synchronize and communicate between devices
    Message types:
    Notes (NOTE ON, NOTE OFF)
    Control Change (Ex: Filter resonance, Hold pedal...)
    Program Change (Change instrument)
    Sys ex
    ...

    View Slide

  26. WE WILL NEED TO SPEAK MIDI WITH DEVICES
    Midi input: pads pressed, keys pressed, knobs turned...
    Midi output: play a note, turn a LED on...

    View Slide

  27. MIDI INPUT: RECEIVING MESSAGES
    Message reception blocks
    So if we want to do something else in parallel, we have to
    handle this in a thread or coroutine or...?
    inport = mido.open_input()
    msg = inport.receive() # Blocking call

    View Slide

  28. MIDI OUTPUT: PLAYING NOTES
    --> BEEEEEEEEEEEEEEEEEEEE...
    --> ... EEEP.
    To play notes, we need a timer between NOTE_ON and
    NOTE_OFF (note duration). time.sleep?
    import mido
    outport = mido.open_output()
    msg = mido.Message('note_on', note=100, velocity=3)
    outport.send(msg)
    outport.send(mido.Message('note_off', note=100))

    View Slide

  29. ALIGNING NOTES (STEPS) WITH TEMPO
    Naive implementation:
    Two problems:
    time.sleep also blocks, so we have to handle it in a thread
    or coroutine or...
    Waking up, sleeping for X seconds, waking up...: the
    tempo slowly drifts
    while True:
    outport.send(mido.Message(...))
    time.sleep(tempo.step_duration)

    View Slide

  30. A STORY ABOUT BLOCKING AND TIMING
    So how can we have:
    1. independent yet connected blocking loops?
    2. timing accuracy to keep a stable tempo?

    View Slide

  31. SOLUTIONS
    Threads
    Many queues to avoid shared state
    Coroutines with asyncio
    Everything in a single thread, less concurrency issues
    Ok since our app is I/O bound
    ...But we have to modify mido to insert
    yield from or await...
    Greenlets with gevent
    Monkey patches time.sleep
    so we can use mido as is and have greenlets
    Drifting? calculate absolute times

    View Slide

  32. PROPOSED DESIGN
    Main process is I/O bound
    Console process is CPU bound!

    View Slide

  33. PART 3: IMPLEMENTATION
    & DEMO
    System overview
    Implementing a controller
    Action!

    View Slide

  34. SYSTEM OVERVIEW

    View Slide

  35. IMPLEMENTING A CONTROLLER
    Map messages from controller (pad pressed) to
    sequencer actions (toggle step)
    Send messages to controller for feedback (LEDs...)

    View Slide

  36. INTERPRETING EVENTS
    Some events are represented by a single message
    Others are the result of a sequence of messages (ex:
    NPRN LSB, MSB)
    Solution: a RulesChain
    Each Rule matches a message
    A state automaton keeps track of the matched rules
    Flexible rules evaluation engine
    self.register('FILTER',
    self.on_cc,
    RulesChain(Rule(type_='control_change', control='74'),
    Rule(type_='control_change', control='27',
    value='0'))
    )

    View Slide

  37. REACTING TO SEQUENCER STATES
    Event system:
    self.sequencer.on(SequencerEvents.STEP_BEGIN, self, self.on_step_begin)
    ...
    def on_step_begin(self, step):
    # Turn on current step LED
    self.sequencer.output(self, *msb_lsb_output(60, 0, 32 + step.pos))

    View Slide

  38. IN ACTION!

    View Slide

  39. IN ACTION!
    Bass pattern
    Drum pattern 1
    Drum pattern 2
    Mozart pattern (32-step sequence)
    Daft punk - da funk

    View Slide

  40. FUTURE
    Plans:
    Release in Open Source
    Chords (especially important for a drum machine...)
    Multi track
    Load / save to midi
    External tempo sync
    Reactive Web interface (iPad, ...)
    Conquer the world!

    View Slide

  41. THANK YOU!
    @ygravrand
    Soon:
    github.com/ygravrand/steppy

    View Slide