-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlarson_scanner_remote.py
100 lines (72 loc) · 3.51 KB
/
larson_scanner_remote.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import random
import time
import os
import sys
file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)
from base_remote_strip import BaseRemoteStrip
from base_remote_strip import MidiTransform
from base_remote_strip import NumberUtils
from base_remote_strip import ColorMidiUtils
from bibliopixel import colors as bp_colors
class LarsonScannerRemote(BaseRemoteStrip):
"""Larson scanner (i.e. Cylon Eye or K.I.T.T.)."""
def __init__(self, layout, start=0, end=-1, min_tail=2, max_tail=50, **args):
super(LarsonScannerRemote, self).__init__(layout, start, end, **args)
self._min_tail = min_tail
self._max_tail = max_tail
self._max_randomness = 100
self._color = (255,255,255)
self._random_color = (255,255,255)
def pre_run(self):
self._direction = -1
self._last = 0
self._step = 0
self._random_counter = 0
self._random_seed = 0
def get_color(self):
if self.use_rgb:
self._color = ColorMidiUtils.three_cc_to_color(self.red_control, self.green_control, self.blue_control)
if self._random_counter == 0:
self._random_seed = (self.color_control + random.randint(0, self._randomness)) % 127
color = ColorMidiUtils.one_cc_to_color(self._random_seed)
c_lev = MidiTransform.remap_cc_value(self.brightness_control, 0, 256)
self._color = bp_colors.color_scale(color, c_lev)
def step(self, amt=1):
self.layout.all_off()
self._randomness = int(MidiTransform.remap_cc_value(self.randomness_control, 0, self._max_randomness))
scaled_tail = int(MidiTransform.remap_cc_value(self.count_control, self._min_tail, self._max_tail))
self._tail = scaled_tail
scaled_fade = int(MidiTransform.remap_cc_value(self.utility_control_two, 1, 500))
self._fadeAmt = scaled_fade // self._tail
self.get_color()
self._last = self._start + self._step
self.layout.set(self._last, self._color)
for i in range(self._tail):
self.layout.set(self._last - i, bp_colors.color_scale(self._color, 255 - (self._fadeAmt * i)))
self.layout.set(self._last + i, bp_colors.color_scale(self._color, 255 - (self._fadeAmt * i)))
if self._start + self._step >= self._end:
self._direction = -self._direction
elif self._step <= 0:
self._direction = -self._direction
self._step += self._direction * amt
delay_time = MidiTransform.remap_cc_value(self.delay_control, 0, 1)
time.sleep(delay_time)
self._random_counter = (self._random_counter + 1) % 30
class LarsonRainbowRemote(LarsonScannerRemote):
"""Larson scanner (i.e. Cylon Eye or K.I.T.T.) but Rainbow."""
def __init__(self, layout, start=0, end=-1, **args):
super(LarsonRainbowRemote, self).__init__(layout, start, end, **args)
self._color_number = 0
def get_color(self):
color_seed = MidiTransform.remap_cc_value(self.color_control, 0, 10)
amount_change = MidiTransform.remap_cc_value(self.utility_control_one, 0.1, 5)
if amount_change == 5:
amount_change = 0
base_color = (self._color_number + color_seed) % 359
self._color_number = (base_color + amount_change) % 359
color = bp_colors.hue2rgb_360(self._color_number)
c_lev = MidiTransform.remap_cc_value(self.brightness_control, 0, 256)
self._color = bp_colors.color_scale(color, c_lev)
def step(self, amt=1):
super(LarsonRainbowRemote, self).step(amt)