Linux and UNIX Man Pages

Linux & Unix Commands - Search Man Pages

numm.one-bit-instrument(7) [debian man page]

one-bit-instrument(7)						  Numm Tutorials					     one-bit-instrument(7)

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 introduc- tion 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 depres- sions 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.getting-started(7), numm.spectral-analysis(7) numm February 2012 one-bit-instrument(7)

Check Out this Related Man Page

spectral-analysis(7)						  Numm Tutorials					      spectral-analysis(7)

NAME
spectral analysis - perform realtime spectral analysis SYNOPSIS
numm-run FILE DESCRIPTION
Frequency makes for a meaningful description of many audio signals. We can use numpy's fourier analysis to compute spectra from the micro- phone and display the results visually. We will break down the process into smaller parts: baby steps... First, create and save a skeletal file that moves a line across the screen: idx = 0 def video_out(a): global idx a[:,idx] = 255 idx = (idx + 1) % a.shape[1] def audio_in(a): pass Save this snippet and run it with numm-run. We will use the numpy.fft module for our analysis. First we define a function to get a particular frequency from the fourier transform: import numpy as np def get_freq(fourier, frequency): freqs = np.fft.fftfreq(len(fourier), 1/44100.0) nearest = (abs(freqs - frequency)).argmin() return abs(fourier[nearest]) Next, we hook up this function to audio input from the microphone. A frequency bin is chosen on a log scale for each row on the screen to display a spectogram. In total: import numpy as np idx = 0 recent_audio = np.zeros(4096, np.int16) recent_video = np.zeros((240,320,3), np.uint8) freq_bins = np.exp2(np.linspace(np.log2(27000),np.log2(27),240)) def get_freq(fourier, frequency): freqs = np.fft.fftfreq(len(fourier), 1/44100.0) nearest = (abs(freqs - frequency)).argmin() return abs(fourier[nearest]) def video_out(a): global idx fourier=np.fft.fft(recent_audio) values =np.array([get_freq(fourier,X) for X in freq_bins]) recent_video[:,idx,1] = (values/10000).clip(0,255) idx = (idx + 1) % a.shape[1] a[:] = np.roll(recent_video, -idx, axis=1) def audio_in(a): recent_audio[:] = np.roll(recent_audio, len(a)) recent_audio[:len(a)] = a.mean(axis=1) SEE ALSO
numm-run(1), numm.getting-started(7), numm.one-bit-instrument(7) numm February 2012 spectral-analysis(7)
Man Page