|
| 1 | +import audiocore |
| 2 | +import audiopwmio |
| 3 | +import audiomixer |
| 4 | +import board |
| 5 | +import array |
| 6 | +import time |
| 7 | +import math |
| 8 | + |
| 9 | +CHANNELS = 2 |
| 10 | +RATE = 8000 |
| 11 | +SAMPLE_TYPE = "H" |
| 12 | +OFFSET = 2**15 - 1 |
| 13 | +BUFFER_SIZE = 640 |
| 14 | +SINGLE_BUFFER = True |
| 15 | +LOOP = True |
| 16 | + |
| 17 | +# (frequency, amp_left, amp_right) |
| 18 | +VOICES = ((200, 1, 0), (400, 0, 1), (100, 1, 1)) |
| 19 | + |
| 20 | + |
| 21 | +def play( |
| 22 | + voices=VOICES, |
| 23 | + channels=CHANNELS, |
| 24 | + rate=RATE, |
| 25 | + sample_type=SAMPLE_TYPE, |
| 26 | + offset=OFFSET, |
| 27 | + buffer_size=BUFFER_SIZE, |
| 28 | + single_buffer=SINGLE_BUFFER, |
| 29 | + loop=LOOP, |
| 30 | +): |
| 31 | + waves = [] |
| 32 | + samples = [] |
| 33 | + for v in voices: |
| 34 | + print(v) |
| 35 | + sample_length = int(rate // v[0]) |
| 36 | + wave = array.array(sample_type, [offset] * sample_length * channels) |
| 37 | + for i in range(0, sample_length): |
| 38 | + if channels == 1: |
| 39 | + wave[i] = int( |
| 40 | + math.sin(math.pi * 2 * i / sample_length) * v[1] * (2**15 - 1) + offset |
| 41 | + ) |
| 42 | + else: |
| 43 | + wave[2 * i] = int( |
| 44 | + math.sin(math.pi * 2 * i / sample_length) * v[1] * (2**15 - 1) + offset |
| 45 | + ) |
| 46 | + wave[2 * i + 1] = int( |
| 47 | + math.sin(math.pi * 2 * i / sample_length) * v[2] * (2**15 - 1) + offset |
| 48 | + ) |
| 49 | + waves.append(wave) |
| 50 | + samples.append( |
| 51 | + audiocore.RawSample( |
| 52 | + wave, sample_rate=rate, channel_count=channels, single_buffer=single_buffer |
| 53 | + ) |
| 54 | + ) |
| 55 | + mixer = audiomixer.Mixer( |
| 56 | + voice_count=len(voices), |
| 57 | + sample_rate=rate, |
| 58 | + channel_count=channels, |
| 59 | + bits_per_sample=16, |
| 60 | + samples_signed=False, |
| 61 | + buffer_size=buffer_size, |
| 62 | + ) |
| 63 | + pwm = audiopwmio.PWMAudioOut(left_channel=board.D12, right_channel=board.D13) |
| 64 | + pwm.play(mixer) |
| 65 | + for i in range(len(samples)): |
| 66 | + mixer.voice[i].play(samples[i], loop=loop) |
| 67 | + mixer.voice[i].level = 0.5 |
0 commit comments