-
Notifications
You must be signed in to change notification settings - Fork 1
/
beat.py
78 lines (56 loc) · 1.81 KB
/
beat.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import time
import random
from datetime import timedelta
class SkipCycleBeat(object):
def __init__(self, cycles=20):
self.state = 0
self.skip_cycles = cycles
def tick(self):
self.state = (self.state+1) % self.skip_cycles
return 1 if self.state == 0 else 0
class LowPassBeat(object):
def __init__(self, stream, thresh=0.47):
self.stream = stream
self.thresh = thresh
def tick(self):
band = self.stream.bands[0]
return band if band > self.thresh else 0
class MidPassBeat(object):
def __init__(self, stream, thresh=0.47):
self.stream = stream
self.thresh = thresh
def tick(self):
band = self.stream.bands[1]
return band if band > self.thresh else 0
class HighPassBeat(object):
def __init__(self, stream, thresh=0.47):
self.stream = stream
self.thresh = thresh
def tick(self):
band = self.stream.bands[2]
return band if band > self.thresh else 0
class RandomBeat(object):
def __init__(self, probability=0.05):
self.probability = probability
def tick(self):
return 1 if random.random() < self.probability else 0
class TimedBeat(object):
def __init__(self, ms, duration=200):
self.ms = ms
self.duration = duration
self.last_tick = time.time() * 1000.0
def tick(self):
now = time.time() * 1000.0
if now > (self.last_tick + self.ms):
self.last_tick = now
return 1
if now < (self.last_tick + self.duration):
return 1
return 0
class EnergyBeat(object):
def __init__(self, stream, thresh=0):
self.stream = stream
self.thresh = thresh
def tick(self):
val = max(self.stream.bands)
return val if val > self.thresh else 0