Skip to content

Commit 6441934

Browse files
committed
added wavetype to UI, changed around some other UI, restored drive_mix
1 parent c3ae113 commit 6441934

File tree

2 files changed

+32
-35
lines changed

2 files changed

+32
-35
lines changed

circuitpython/tbish/code.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
display = setup_display()
2929
touches = setup_touch()
3030

31-
bpm = 180
32-
steps_per_beat = 2 # 4 = 16th note, 2 = 8th note, 1 = quarter note
31+
bpm = 120
32+
steps_per_beat = 4 # 4 = 16th note, 2 = 8th note, 1 = quarter note
3333

3434
seqs = [
3535
[[36, 36, 48, 36, 48, 48+7, 36, 48], # notes, 0 = rest
@@ -56,18 +56,21 @@
5656
Param("resQ", 1.0, 0.5, 4.0, "%.2f", 'resonance'),
5757
Param('decay', 0.75, 0.0, 1.0, "%.2f", 'decay'),
5858

59-
Param('drive', 320, 5, 40, "%2d", 'drive'),
59+
Param('drive', 30, 5, 40, "%2d", 'drive'),
6060
Param('drivemix', 0.2, 0.0, 1.0, "%.2f", 'drive_mix'),
6161

6262
Param('delay', 0.0, 0.0, 1.0, "%.2f", 'delay_mix'),
6363
Param('dtime', 0.25, 0.0, 1.0, "%.2f", 'delay_time'),
6464

6565
Param('seq', 0, 0, len(seqs), "%1d"),
66+
Param('transpose', 0, -13, 13, "%2d", 'transpose'),
67+
68+
Param('wave', 1, 0, 2, "%1d", 'wavenum'),
6669
Param('bpm', bpm, 40, 200, "%3d"),
6770

6871
]
6972

70-
touchpad_to_knobset = [1,3,6,8,10] # ,13]
73+
touchpad_to_knobset = [1,3,6,8,10,13]
7174
touchpad_to_transpose = [0,2,4,5,7,9,11,12,14]
7275

7376
tb = TBishSynth(mixer.sample_rate, mixer.channel_count)

circuitpython/tbish/tbish_synth.py

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@
2222
* EG: A decay-only envelope generator controls both filter cutoff and amplitude.
2323
The EG is retriggered on every step and has no sustain or release
2424
25-
Common post effects added to TB-303 are:
26-
27-
* Overdrive / Distortion
28-
* Delay, usually tempo-sync'd
29-
3025
The 16-step sequencer of the TB-303 is different than most, having 3 attributes
3126
per step:
3227
@@ -36,6 +31,12 @@
3631
3732
This code does not implement the sequencer, but does implement accent and slide.
3833
34+
Common post effects added to TB-303 are:
35+
36+
* Overdrive / Distortion
37+
* Delay, usually tempo-sync'd
38+
39+
Both of these effects are added to this synth.
3940
4041
"""
4142
# Sorta like a TB303
@@ -56,20 +57,20 @@
5657
np.linspace(wave_vol, -wave_vol, num=wave_size, dtype=np.int16), # saw
5758
np.concatenate((np.ones(wave_size//2, dtype=np.int16) * wave_vol, # square
5859
np.ones(wave_size//2, dtype=np.int16) * -wave_vol)),
59-
6060
)
6161

6262
class TBishSynth:
6363
def __init__(self, sample_rate, channel_count):
6464
self.synth = synthio.Synthesizer(sample_rate=sample_rate,
6565
channel_count=channel_count)
6666
self.note = None
67-
self.secs_per_step = 0.125
67+
self.secs_per_step = 0.125 # fixme
68+
self.transpose = 0
6869
self.wavenum = 1 # which waveform to use: saw=0, square=1
6970
self.cutoff = 8000 # aka 'filter frequency'
7071
self.envmod = 0.5 # aka 'filter depth'
71-
self.envdecay = 0.01
72-
self._accent = 0.5
72+
self.decay = 0.01
73+
self.accent = 0.5
7374
self.autoslide = True # FIXME unused yet
7475
self.filt_env = synthio.LFO(rate=1, scale=self.cutoff, once=True,
7576
waveform=np.array((32767,0),dtype=np.int16))
@@ -119,6 +120,7 @@ def add_audioeffects(self):
119120
return self.fx_delay # the "output" of this synth
120121

121122
def note_on_step(self, midi_note, slide=False, accent=False):
123+
"""Trigger a note, with slide and accent"""
122124
print("note_on_step: %3d %1d %1d" % (midi_note, slide, accent))
123125
self.note_off(midi_note) # must do when in step mode
124126
attack_level = 0.8
@@ -134,7 +136,7 @@ def note_on_step(self, midi_note, slide=False, accent=False):
134136
if slide:
135137
glide_time = 0.1
136138
# FIXME also do appropriate other actions for slide
137-
envdecay = max(0.05, self.secs_per_step * self.envdecay * 1.5) # 1.5 fudge
139+
envdecay = max(0.05, self.secs_per_step * self.decay * 1.5) # FIXME: 1.5 fudge
138140
frate = 1 / envdecay
139141
self.filt_env.offset = ((1-envmod) * cutoff)
140142
self.filt_env.scale = cutoff - self.filt_env.offset
@@ -147,11 +149,11 @@ def note_on_step(self, midi_note, slide=False, accent=False):
147149
decay_time = envdecay,
148150
sustain_level=0,
149151
release_time=0.01)
150-
self.note = synthio.Note(synthio.midi_to_hz(midi_note),
152+
self.note = synthio.Note(synthio.midi_to_hz(midi_note+self.transpose),
151153
bend = self.glider.lerp,
152154
filter = self.filter,
153155
envelope = ampenv,
154-
waveform = waves[self.wavenum])
156+
waveform = waves[int(self.wavenum)])
155157
self.synth.press(self.note)
156158

157159

@@ -160,27 +162,11 @@ def note_on(self, midi_note, vel=100):
160162
self.note_on_step(midi_note, slide=(vel==1), accent=(vel==127))
161163

162164
def note_off(self, midi_note, vel=0):
163-
"""Used for both MIDI and sequencer mode"""
165+
"""Used for both MIDI and sequencer mode, passed in args are not used."""
164166
if self.note:
165167
self.synth.release(self.note)
166168
self.note = None
167169

168-
@property
169-
def decay(self):
170-
return self.envdecay
171-
172-
@decay.setter
173-
def decay(self,t):
174-
self.envdecay = t
175-
176-
@property
177-
def accent(self):
178-
return self.accent
179-
180-
@accent.setter
181-
def accent(self, v):
182-
self.accent = v
183-
184170
@property
185171
def resonance(self):
186172
return self.filter.Q
@@ -201,6 +187,14 @@ def drive(self,d):
201187
self.fx_distortion.post_gain = -d/2
202188
self.fx_distortion.pre_gain = d
203189

190+
@property
191+
def drive_mix(self):
192+
return self.fx_distortion.mix
193+
194+
@drive_mix.setter
195+
def drive_mix(self, m):
196+
self.fx_distortion.mix = m
197+
204198
@property
205199
def delay_mix(self):
206200
return self.fx_delay.mix
@@ -211,8 +205,8 @@ def delay_mix(self, m):
211205

212206
@property
213207
def delay_time(self):
214-
return self.fx_delay.delay_ms / (self.secs_per_step * 100 * 2)
208+
return self.fx_delay.delay_ms / (self.secs_per_step * 100 * 4)
215209

216210
@delay_time.setter
217211
def delay_time(self, m):
218-
self.fx_delay.delay_ms = self.secs_per_step * 1000 * 2 * m
212+
self.fx_delay.delay_ms = self.secs_per_step * 1000 * 4 * m

0 commit comments

Comments
 (0)