Skip to main content

API to control the Maschine Mikro MK3

Project description

Pymikro

Python module to control the Maschine Mikro MK3. It allows you to use this maschine not only to create music, but also to control a home automation or a robot or any other creative stuff.

It uses directly the USB HID protocol, as a result there is no dependency on a product specific driver and it can run on any operating system. Furthermore, this gives you access to the full capabilities of this hardware which makes it even more fun to use.

Usage

import pymikro

maschine = pymikro.MaschineMikroMk3()

# control LEDs
lState = {
    'button': {
        'stop': {'val': 1}
    },
    'strip': {
        1: {'val': 3, 'color': 'blue'}
    },
    'pad': {
        1: {'val': 3, 'color': 'purple'}
    }
}
maschine.lights.set_all(lState)

maschine.lights.set('pad', 6, 3, 'orange')
maschine.lights.set('strip', 5, 3, 'green')
maschine.lights.set('button', 'notes', 4)
maschine.lights.update()

# control screen
maschine.screen.set("Hello World!\nIt's working")

# get button and pad updates
while True:
    cmd = maschine.read_cmd()
    if cmd:
        if cmd['cmd'] == 'pad':
            print('Pad number {} pressed: {}'.format(cmd['pad_nb'], cmd['pad_val']))
        if cmd['cmd'] == 'btn':
            print('Buttons pressed: {}'.format(cmd['btn_pressed']))

Setup

Linux

Install the hid driver

sudo apt-get install libhidapi-hidraw0

Install the package

pip3 install pymikro

Set permissions for the device

cd /tmp
wget https://raw.githubusercontent.com/flokapi/pymikro/main/50-ni-maschine.rules
sudo cp 50-ni-maschine.rules /etc/udev/rules.d/

Plug or re-plug the maschine mikro USB cable.

Windows

Install the hid driver:

  1. Donwload the latest version of hidapi-win.zip from https://github.com/libusb/hidapi/releases

  2. Extract the zip file and copy the hidapi.dll corresponding to your architecture to C:\Users\<Username>\AppData\Local\Programs\Python

Install the package

pip3 install pymikro

Plug or re-plug the maschine mikro USB cable.

About

Supported hardware features

Overall, there is actually more feature than the manufacturer uses :)

Pads:

  • Set color (17 possible values) and intensity
  • Get pressure value
  • Info whether pressed, touched, or released

Buttons:

  • get buttons being pressed
  • set light brightness

Encoder:

  • get value of the encoder (1 byte), and how much it moved
  • whether it's being touched (not pressed)

Touch strip:

  • get position of up to 2 fingers
  • set color and brightness of each LED

Screen:

  • set text with adjustable size, on 1 or 2 lines

Supported operating systems

Tested on Linux & Windows

Should also work on OSX by installing the hid api. See https://pypi.org/project/hid/

API

Connection

import pymikro

maschine = pymikro.MaschineMikroMk3()
maschine.hid.show_info()

Inputs

LEDs:

  • The state of the LEDs for the pads/touch strip/buttons is defined in a single data-structure which can be accessed and modified using the lights.get_all and lights.set_all methods. The LEDs can also be set individually using lights.set.

  • To apply the changes, lights.update must be called. Using a separate command allows to apply all the changes in a single write procedure (about 15ms) and increases the reactivity.

  • Example:

    maschine.lights.set_all({})                         # set empty dictionary to disable all LEDs
    maschine.lights.update()
    
    time.sleep(1)
    
    lState = {
        'button': {
            'stop': {'val': 1}                     # Button brighness value must be between 0
        },
        'strip': {
            1: {'val': 4, 'color': 'blue'}         # Touch Strip LED brightness value must be between 0 and 3
        },
        'pad': {
            1: {'val': 3, 'color': 'purple'}       # Pad brightness value must be between 0 and 3
        }
    }
    maschine.lights.set_all(lState)
    
    maschine.lights.set('pad', 6, 3, 'orange')       # pad nb 6, brightness 3.
    maschine.lights.set('strip', 5, 3, 'green')      # strip led nb 5, brightness 3.
    maschine.lights.set('button', 'notes', 4)        # button 'notes', brightness 4.
    maschine.lights.update()
    

Screen

  • Example

    maschine.screen.set("Hello", 24)                       # Font size set to 24
    
    maschine.screen.set(f"Hello World!\nIt's working")     # Printing text on both lines with '\n'.
                                                          # Default font size is 14
    

Outputs

Output commands can be read in a non-blocking way using the read_cmd method, which returns:

  • None if no new command is available
  • A dictionary which content differs depending on the cmd key value (btn or pad)
  • Example: cmd = maschine.read_cmd()

Pads

  • The pad command is only sent when the state of a pad is being changed (pressed/touched/released). The pad command is sent for a single pad at the time.

  • Example

    {
        'cmd': 'pad',
        'pad_nb': 5,
        'pad_val': 1360,                                 # between 0 and 4095
        'touched': True,                                 # finger in contact with the pad
        'pressed': False,                                # finger just pressed the pad (not 100% reliable)
        'released': False                                # finger just released the pad (not 100% reliable)
    }
    

Buttons:

  • The button command is only sent when the state of the buttons/touch strip/encoder changed (including button release). The command contains the full state of the button group.

  • Example

    {
        'cmd': 'btn',
        'btn_pressed': ['group', 'pattern', 'enter'],   # currently pressed buttons
        'encoder_pos': 10,                              # byte, cyclic value between 0 and 15
        'encoder_move': 1,                              # encoded moved to the right (+1) or left (-1)
        'encoder_touched': True,                        # finger in contact with the encoder
        'strip_pos_1': 123,                             # value of the strip if one finger touching
        'strip_pos_2': 0                                # second value if another finger is on the strip
    }
    

Alternatives

maschine-mikro-mk3-driver

  • Built for Linux only
  • Makes the Maschine Mikro available through a midi interface
  • Coded in Rust

Midi mode

  • Windows/OSX only (midi interface emulated by the driver)

  • press shift and project to enter midi mode

  • you can use mido or any other software to handle the midi commands

  • limited features/customization

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pymikro-0.1.1.tar.gz (399.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pymikro-0.1.1-py3-none-any.whl (397.4 kB view details)

Uploaded Python 3

File details

Details for the file pymikro-0.1.1.tar.gz.

File metadata

  • Download URL: pymikro-0.1.1.tar.gz
  • Upload date:
  • Size: 399.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for pymikro-0.1.1.tar.gz
Algorithm Hash digest
SHA256 3312a4ddf29b1d8f938b5338861ac1fe5b6f24d966a9c46b85eb2870dc258f1e
MD5 c340038ba1a6c29d2a6e1c2a554f7aa9
BLAKE2b-256 295e7d85ed0ddba0121f10ae1d7d4a1de86ac65dc01a1ab2abe76631a4e1b371

See more details on using hashes here.

File details

Details for the file pymikro-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: pymikro-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 397.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for pymikro-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 391836e690881cd4663a753a092cce317f7dbfc8e08273a154ff6759bd2b17ef
MD5 ff34c06c76856015bfdbe5c5870d8f0d
BLAKE2b-256 7fdb3dd1d5050269b06e5695a56d6eb1765295b5fcf83339c05e1350ae8d8c0d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page