Skip to content

Instantly share code, notes, and snippets.

@omz
Created November 7, 2012 21:03
Show Gist options
  • Save omz/4034439 to your computer and use it in GitHub Desktop.
Save omz/4034439 to your computer and use it in GitHub Desktop.
Drum Machine
#TODO: Adjust size to screen size (iPhone)
#TODO: Clear (and random, play/pause?) buttons
from scene import *
from sound import play_effect, set_volume, load_effect
from colorsys import hsv_to_rgb
import pickle
class DrumMachine (Scene):
def setup(self):
self.beat = 0.0
set_volume(1.0)
self.sounds = ['Drums_01', 'Drums_02', 'Drums_03', 'Drums_06',
'Drums_10', 'Drums_11', 'Drums_11', 'Drums_15']
for effect in self.sounds:
load_effect(effect)
try:
with open('Drums.data', 'r') as f:
self.grid = pickle.load(f)
except EOFError:
self.grid = [[False for col in xrange(16)] for row in xrange(8)]
def draw(self):
background(0, 0, 0)
last_beat = int(self.beat)
self.beat += 1.0/7.5
self.beat %= 16
play = int(self.beat) != last_beat
for y in xrange(16):
beat_row = int(self.beat) == y
for x in xrange(8):
if self.grid[x][y]:
h = x / 8.0
r, g, b = hsv_to_rgb(h, 1, 1)
if play and int(self.beat) == y:
play_effect(self.sounds[x])
if beat_row:
h = x / 8.0
r, g, b = hsv_to_rgb(h, 1, 1)
fill(r, g, b)
else:
r, g, b = hsv_to_rgb(h, 1, 0.5)
fill(r, g, b)
elif beat_row:
fill(1, 1, 1)
else:
fill(0.50, 0.50, 0.50)
rect(x * 96, y * 61, 95, 60)
def touch_began(self, touch):
x, y = touch.location.as_tuple()
x = int(x / 96)
y = int(y / 61)
if y < 16:
self.grid[x][y] = not self.grid[x][y]
def stop(self):
with open('Drums.data', 'w') as f:
pickle.dump(self.grid, f)
run(DrumMachine(), PORTRAIT)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment