I am trying to find out what is a good way to create many arrays and access them (maybe through a list), while being the most memory effecient. So far this is what I have come to:
Code: Select all
def sine_wave(TONE_FREQUENCY_IN_HZ):
# create a buffer containing the pure tone samples
global samples_per_cycle
samples_per_cycle = SAMPLE_RATE_IN_HZ // TONE_FREQUENCY_IN_HZ
sample_size_in_bytes = SAMPLE_SIZE_IN_BITS // 8
samples = bytearray(samples_per_cycle * sample_size_in_bytes)
volume_reduction_factor = 32
srange = pow(2, SAMPLE_SIZE_IN_BITS) // 2 // volume_reduction_factor
if SAMPLE_SIZE_IN_BITS == 16:
format = "<h"
else: # assume 32 bits
format = "<l"
for i in range(samples_per_cycle):
sample = srange + int((srange - 1) * math.sin(2 * math.pi * i / samples_per_cycle))
struct.pack_into(format, samples, i * sample_size_in_bytes, sample)
return (samples)
# ======= CREATE SAMPLES ===================================================================
sine_sample = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[sine_wave(55), sine_wave(58), sine_wave(62), sine_wave(65), sine_wave(69), sine_wave(73), sine_wave(78), sine_wave(82), sine_wave(87), sine_wave(93), sine_wave(98), sine_wave(104)],
[sine_wave(110), sine_wave(117), sine_wave(124), sine_wave(131), sine_wave(139), sine_wave(147), sine_wave(156), sine_wave(165), sine_wave(175), sine_wave(185), sine_wave(196), sine_wave(208)],
[sine_wave(220), sine_wave(233), sine_wave(247), sine_wave(262), sine_wave(277), sine_wave(294), sine_wave(311), sine_wave(330), sine_wave(349), sine_wave(370), sine_wave(392), sine_wave(415)],
[sine_wave(440), sine_wave(466), sine_wave(494), sine_wave(523), sine_wave(554), sine_wave(587), sine_wave(622), sine_wave(659), sine_wave(698), sine_wave(740), sine_wave(784), sine_wave(831)],
[sine_wave(880), sine_wave(932), sine_wave(988), sine_wave(1047), sine_wave(1109), sine_wave(1175), sine_wave(1245), sine_wave(1319), sine_wave(1397), sine_wave(1480), sine_wave(1568), sine_wave(1661)],
[sine_wave(1760), sine_wave(1865), sine_wave(1976), sine_wave(2093), sine_wave(2217), sine_wave(2349), sine_wave(2489), sine_wave(2637), sine_wave(2794), sine_wave(2960), sine_wave(3136), sine_wave(3322)]
]
tone_sample = sine_sample[4][0]
The code works, however I am not able to create any more of these list of arrays ( for example for square wave and triangle wave) because of the limit memory of the Pico.
Is there a way to be able to use less memory, or storing the arrays in the Pico flash memory?