From 4ed8f3483df8c7474fd97ec0640860006ec901b9 Mon Sep 17 00:00:00 2001 From: John Edgar Park Date: Fri, 4 Jan 2019 12:54:17 -0800 Subject: [PATCH] sequencer code, debouncer, and samples first commit --- Disc_Step_Sequencer/Disc_Step_Sequencer.py | 145 +++++++++++++++++++++ Disc_Step_Sequencer/ch_01.wav | Bin 0 -> 8422 bytes Disc_Step_Sequencer/clap_01.wav | Bin 0 -> 14286 bytes Disc_Step_Sequencer/debouncer.py | 96 ++++++++++++++ Disc_Step_Sequencer/fB_bd_tek.wav | Bin 0 -> 13274 bytes Disc_Step_Sequencer/fB_elec_hi_snare.wav | Bin 0 -> 13290 bytes 6 files changed, 241 insertions(+) create mode 100644 Disc_Step_Sequencer/Disc_Step_Sequencer.py create mode 100644 Disc_Step_Sequencer/ch_01.wav create mode 100644 Disc_Step_Sequencer/clap_01.wav create mode 100644 Disc_Step_Sequencer/debouncer.py create mode 100644 Disc_Step_Sequencer/fB_bd_tek.wav create mode 100644 Disc_Step_Sequencer/fB_elec_hi_snare.wav diff --git a/Disc_Step_Sequencer/Disc_Step_Sequencer.py b/Disc_Step_Sequencer/Disc_Step_Sequencer.py new file mode 100644 index 00000000..51229f6f --- /dev/null +++ b/Disc_Step_Sequencer/Disc_Step_Sequencer.py @@ -0,0 +1,145 @@ +""" +Opto Mechanical Disc Step Sequencer from John Park's Workshop + Crickit Feather M4 Express, Crickit FeatherWing, continuous servo, + four reflection sensors, speaker + +Adafruit invests time and resources providing this open source code. +Please support Adafruit and open source hardware by purchasing +products from Adafruit! + +Written by Dave Astels for Adafruit Industries +Copyright (c) 2018 Adafruit Industries +Licensed under the MIT license. + +All text above must be included in any redistribution. +""" + +import audioio +import board +from digitalio import DigitalInOut, Direction +from adafruit_crickit import crickit +from debouncer import Debouncer + +# You get 4 samples, they must all have the same sample rate and must +# all be mono or stereo (no mix-n-match!) +# mixer info https://circuitpython.readthedocs.io/en/latest/shared-bindings/audioio/Mixer.html + +VOICES = ["bd_tek.wav", "elec_hi_snare.wav", "ch_01.wav", "clap_01.wav"] +# Parse the first file to figure out what format its in +with open(VOICES[0], "rb") as f: + wav = audioio.WaveFile(f) + print("%d channels, %d bits per sample, %d Hz sample rate " % + (wav.channel_count, wav.bits_per_sample, wav.sample_rate)) + + # Audio playback object - we'll go with either mono or stereo depending on + # what we see in the first file + if wav.channel_count == 1: + audio = audioio.AudioOut(board.A0) + elif wav.channel_count == 2: + # audio = audioio.AudioOut(board.A0, right_channel=board.A0) + audio = audioio.AudioOut(board.A0) + else: + raise RuntimeError("Must be mono or stereo waves!") + mixer = audioio.Mixer(voice_count=4, + sample_rate=wav.sample_rate, + channel_count=wav.channel_count, + bits_per_sample=wav.bits_per_sample, + samples_signed=True) + audio.play(mixer) + +samples = [] +# Read the 4 wave files, convert to stereo samples, and store +# (show load status on neopixels and play audio once loaded too!) +for v in VOICES: + wave_file = open(v, "rb") + print(v) + # OK we managed to open the wave OK + sample = audioio.WaveFile(wave_file) + # debug play back on load! + mixer.play(sample, voice=0) + while mixer.playing: + pass + samples.append(sample) + + +led = DigitalInOut(board.D13) +led.direction = Direction.OUTPUT + +# For signal control, we'll chat directly with seesaw, use 'ss' to shorten typing! +ss = crickit.seesaw + +# define and set up inputs to use the debouncer +def make_criket_signal_debouncer(pin): # create pin signal objects + ss.pin_mode(pin, ss.INPUT_PULLUP) + return Debouncer(lambda : ss.digital_read(pin)) + +# The IR sensors on are pullups, connect to ground to activate +clock_pin = make_criket_signal_debouncer(crickit.SIGNAL1) +voice_1_pin = make_criket_signal_debouncer(crickit.SIGNAL2) +voice_2_pin = make_criket_signal_debouncer(crickit.SIGNAL3) +voice_3_pin = make_criket_signal_debouncer(crickit.SIGNAL4) +voice_4_pin = make_criket_signal_debouncer(crickit.SIGNAL5) +# Crickit capacitive touch pads +touch_1_pad = Debouncer(lambda: crickit.touch_1.value) +touch_4_pad = Debouncer(lambda: crickit.touch_4.value) +touch_2_3_pad = Debouncer(lambda: crickit.touch_2.value and crickit.touch_3.value) + +crickit.continuous_servo_1.set_pulse_width_range(min_pulse=500, max_pulse=2500) +speed = -0.04 #this is clockwise/forward at a moderate tempo + + +def play_voice(vo): + mixer.stop_voice(vo) + mixer.play(samples[vo], voice=vo, loop=False) + +while True: + clock_pin.update() #debouncer at work + voice_1_pin.update() + voice_2_pin.update() + voice_3_pin.update() + voice_4_pin.update() + touch_1_pad.update() + touch_4_pad.update() + touch_2_3_pad.update() + + crickit.continuous_servo_1.throttle = speed # spin the disc at speed defined by touch pads + + if clock_pin.fell: # sensor noticed change from white (reflection) to black (no reflection) + # this means a clock tick has begun, time to check if any steps will play + led.value = 0 + + if voice_1_pin.value: # a black step (no reflection) mark during clock tick, play a sound! + led.value = 1 # light up LED when step is read + # print('| .kick. | | | |') + play_voice(0) + + if voice_2_pin.value: + led.value = 1 + # print('| | .snare. | | |') + play_voice(1) + + if voice_3_pin.value: + led.value = 1 + # print('| | | .closed hat. | |') + play_voice(2) + + if voice_4_pin.value: + led.value = 1 + # print('| | | | .clap. |') + play_voice(3) + + if touch_4_pad.rose: # speed it up + speed -= 0.001 + # print("speed: %s" % speed) + + if touch_1_pad.rose: # slow it down + speed += 0.001 + # you can comment out the next two lines if you want to go backwards + # however, the clock ticks may not register with the default template spacing + if speed >= 0: # to prevent backwards + speed = 0 + # print("speed: %s" % speed) + + if touch_2_3_pad.rose: # stop the disc + speed = 0 + # print("speed: %s" % speed) diff --git a/Disc_Step_Sequencer/ch_01.wav b/Disc_Step_Sequencer/ch_01.wav new file mode 100644 index 0000000000000000000000000000000000000000..dc16722ffdd32ea0ba29631ceccd7c39c55a6db4 GIT binary patch literal 8422 zcmeHLX;_ojw*E2?WPkukm_u;Zj1Z6*Pzw$mMJZZr>!~&-VUQs-34>PK+Urn{?deg` zsvWFHYwJ+2M?0#tYL8e2vB-=-m<(hhAqkm>n}C9}dLHg+?{n{SACo^jJ8Qjbt@qt~ z?fre3X^R(kQUGAh!mLHvg)#~O005BpOU(j+)UyBp2K>DFtW<#pp)oM4_D=cRG^Z_59v}S^x}tLbtO`r#jpmo&ch+^xpBLGF zn3y|QLTK&{w``kn;=w2AFJbKVZPZ=RGV4|tZ~8kRovXHf!IZwXeMyY_8~j}4_25;t zugy(RL`PEe8Cbe0g%nvkYlgqQQA1Bj`TU!(KNC)Od^jZoJk7BU2}5T(+3jDTdKJ9e zn%F$t{k8=l4}D9s!gbXcPq+ZogKL89&I70_-JGDjx;;~_m@?h@*z^AD3>i2-YoiN} z+~c|9hjIl+C~s{>Et*}?L!~S;ZGoS#^wM8F6(1kimB!j)(BWsJPbolC#rG}2w_6LM zp>Ve;!I(k8${ADI1^^_D05!I1t${1ReRq|SN1A&fwYaN@0}&C`tMR4E=fnFP)o^-4 zSHz%s&&-Ou)6{2U{25>4rv5c8moYufULe^c3PV;5UN{+8$v;Pv_a

0Wnl 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 literal 0 HcmV?d00001 diff --git a/Disc_Step_Sequencer/debouncer.py b/Disc_Step_Sequencer/debouncer.py new file mode 100644 index 00000000..b65083df --- /dev/null +++ b/Disc_Step_Sequencer/debouncer.py @@ -0,0 +1,96 @@ +""" +GPIO Pin Debouncer + +Adafruit invests time and resources providing this open source code. +Please support Adafruit and open source hardware by purchasing +products from Adafruit! + +Written by Dave Astels for Adafruit Industries +Copyright (c) 2018 Adafruit Industries +Licensed under the MIT license. + +All text above must be included in any redistribution. +""" + +import time +import digitalio + +class Debouncer(object): + """Debounce an input pin""" + + DEBOUNCED_STATE = 0x01 + UNSTABLE_STATE = 0x02 + CHANGED_STATE = 0x04 + + + def __init__(self, pin_or_predicate, mode=digitalio.Pull.UP, interval=0.010): + """Make am instance. + :param int/function pin_or_predicate: the pin (from board) to debounce + :param int mode: digitalio.Pull.UP or .DOWN (default is no pull up/down) + :param int interval: bounce threshold in seconds (default is 0.010, i.e. 10 milliseconds) + """ + self.state = 0x00 + if isinstance(pin_or_predicate, int): + p = digitalio.DigitalInOut(pin_or_predicate) + p.direction = digitalio.Direction.INPUT + p.pull = mode + self.f = lambda : p.value + else: + self.f = pin_or_predicate + if self.f(): + self.__set_state(Debouncer.DEBOUNCED_STATE | Debouncer.UNSTABLE_STATE) + self.previous_time = 0 + if interval is None: + self.interval = 0.010 + else: + self.interval = interval + + + def __set_state(self, bits): + self.state |= bits + + + def __unset_state(self, bits): + self.state &= ~bits + + + def __toggle_state(self, bits): + self.state ^= bits + + + def __get_state(self, bits): + return (self.state & bits) != 0 + + + def update(self): + """Update the debouncer state. Must be called before using any of the properties below""" + now = time.monotonic() + self.__unset_state(Debouncer.CHANGED_STATE) + current_state = self.f() + if current_state != self.__get_state(Debouncer.UNSTABLE_STATE): + self.previous_time = now + self.__toggle_state(Debouncer.UNSTABLE_STATE) + else: + if now - self.previous_time >= self.interval: + if current_state != self.__get_state(Debouncer.DEBOUNCED_STATE): + self.previous_time = now + self.__toggle_state(Debouncer.DEBOUNCED_STATE) + self.__set_state(Debouncer.CHANGED_STATE) + + + @property + def value(self): + """Return the current debounced value of the input.""" + return self.__get_state(Debouncer.DEBOUNCED_STATE) + + + @property + def rose(self): + """Return whether the debounced input went from low to high at the most recent update.""" + return self.__get_state(self.DEBOUNCED_STATE) and self.__get_state(self.CHANGED_STATE) + + + @property + def fell(self): + """Return whether the debounced input went from high to low at the most recent update.""" + return (not self.__get_state(self.DEBOUNCED_STATE)) and self.__get_state(self.CHANGED_STATE) diff --git a/Disc_Step_Sequencer/fB_bd_tek.wav b/Disc_Step_Sequencer/fB_bd_tek.wav new file mode 100644 index 0000000000000000000000000000000000000000..89cea991de56a902468693e07054bf11e410d301 GIT binary patch literal 13274 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

*ZU)`xywMqw8?qbB9+DGW9Ml#}62u(n9#DGC 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