---
name: "numm.one-bit-instrument"
section: "7"
platform: "linux"
package: "python-numm"
version: "0.5-1"
release: "Debian 8 (Jessie)"
platforms: ["linux"]
url: "https://new.carta.tech/numm.one-bit-instrument"
---

# numm.one-bit-instrument(7)

how to make a gnarly synth with numm-run

## NAME

one bit instrument - how to make a gnarly synth with **numm-run**

## SYNOPSIS

numm-run *FILE*

## DESCRIPTION

In this tutorial we will learn how to live-code a one-bit synthesizer controlled by mouse position. It is intended as a gentle introduction to development with **numm-run**.

To get started, create a text file with the following method stubs:

-

  ```
  def audio_out(a):
      pass
  def video_out(a):
      pass
  ```

Save the file as *onebit.py*, and then launch it with **numm-run**:

-

  numm-run onebit.py

You should see a blank window appear. We will now make some sound and light by changing the value of *a* in the *audio\_out* and *video\_out functions:*

-

  ```
  def audio_out(a):
      a[::100] = 2**15
  def video_out(a):
      a.flat[::100] = 255
  ```

*Save the file, and you should see and hear the sketch update.* *This is using numpy's array-indexing to turn every hundredth* *audio sample and pixel-color on.* *The audio sample rate is by default 44100Hz, so it produces* *a series of clicks that will be perceived as a 441Hz tone.* *We can turn this into an instrument by connecting* *mouse motion to frequency:*

-

  ```
  period = 100
  def audio_out(a):
      a[::period] = 2**15
  def video_out(a):
      a.flat[::period] = 255
  def mouse_in(type,px,py,button):
      global period
      period = px*1000
  ```

*Finally, let's use the keyboard to record and jump to notes.* *The first time you press a key, it records the period,* *and subsequant depressions play the saved period:*

-

  ```
  period = 100
  record = {}
  def audio_out(a):
      a[::period] = 2**15
  def video_out(a):
      a.flat[::period] = 255
  def mouse_in(type,px,py,button):
      global period
      period = px*1000
  def keyboard_in(type,key):
      global period
      if record.has_key(key):
          period = record[key]
      elif record.has_key(key):
          record[] = period
  ```

## SEE ALSO

[**numm-run**(1)](/numm-run/1.md), [**numm.getting-started**(7)](/numm.getting-started/7.md), [**numm.spectral-analysis**(7)](/numm.spectral-analysis/7.md)
