Source code for drumhat

import time
from sys import exit

try:
    import cap1xxx
except ImportError:
    raise ImportError("This library requires the cap1xxx module\nInstall with: sudo pip install cap1xxx")

__version__ = '0.1.0'

dh = None

auto_leds = True

PADS = list(range(1,9))

LEDMAP = [
    5, 4, 3, 2,
    1, 0, 6, 7
]

NUMMAP = [
    4, 3, 2, 1, 
    7, 6, 5, 8
]

_on_press = [None] * 8
_on_release = [None] * 8
_is_setup = False

[docs]def on_hit(pad, handler=None): """Register a function to be called when a pad or pads are hit. The function should expect one argument: event. You can look at event.pad to determine which pad was hit. :param pad: A single integer from 0 to 7, or a list of integers :param handler: The handler function to call on hit """ global _on_press setup() if type(pad) == list: for ch in pad: on_hit(ch, handler) return try: channel = NUMMAP.index(pad) except ValueError: raise TypeError("Invalid drum pad #{}".format(pad)) if handler is None: def decorate(handler): global _on_press _on_press[channel] = handler return decorate _on_press[channel] = handler
[docs]def on_release(pad, handler=None): """Register a function to be called when a pad or pads are released. The function should expect one argument: event. You can look at event.pad to determine which pad was released. :param pad: A single integer from 0 to 7, or a list of integers :param handler: The handler function to call on release """ global _on_release setup() if type(pad) == list: for ch in pad: on_release(ch, handler) return try: channel = NUMMAP.index(pad) except ValueError: raise TypeError("Invalid drum pad #{}".format(pad)) if handler is None: def decorate(handler): global _on_release _on_release[channel] = handler return decorate _on_release[channel] = handler
def _handle_press(event): global _on_press channel = event.channel event.pad = NUMMAP[channel] if auto_leds: dh.set_led_state(LEDMAP[channel], True) if callable(_on_press[channel]): try: _on_press[channel](event) except TypeError: _on_press[channel]() def _handle_release(event): global _on_release channel = event.channel event.pad = NUMMAP[channel] if auto_leds: dh.set_led_state(LEDMAP[channel], False) if callable(_on_release[channel]): try: _on_release[channel](event) except TypeError: _on_release[channel]()
[docs]def led_on(pad): """Turn on an LED corresponding to a single pad. :param pad: A single integer from 0 to 7, corresponding to the pad whose LED you want to turn on. """ setup() idx = -1 try: idx = NUMMAP.index(pad) except ValueError: raise TypeError("Invalid drum pad #{}".format(pad)) led = LEDMAP[idx] dh.set_led_state(led, True)
[docs]def all_off(): """Turn off all LEDs""" setup() for pad in PADS: led_off(pad)
[docs]def all_on(): """Turn on all LEDs""" setup() for pad in PADS: led_on(pad)
[docs]def led_off(pad): """Turn off an LED corresponding to a single pad. :param pad: A single integer from 0 to 7, corresponding to the pad whose LED you want to turn off. """ setup() idx = -1 try: idx = NUMMAP.index(pad) except ValueError: raise TypeError("Invalid drum pad #{}".format(pad)) led = LEDMAP[idx] dh.set_led_state(led, False)
def setup(): global dh, _is_setup if _is_setup: return True dh = cap1xxx.Cap1188( i2c_addr=0x2c, alert_pin=25) for x in range(8): dh.on(x,event='press', handler=_handle_press) dh.on(x,event='release', handler=_handle_release) """Unlink the LEDs since Drum HAT's LEDs don't match up with the channels""" dh._write_byte(cap1xxx.R_LED_LINKING, 0b00000000) _is_setup = True