Skip to content

Instantly share code, notes, and snippets.

View 0xfe's full-sized avatar
💭
miles to go before i sleep

Mohit Cheppudira 0xfe

💭
miles to go before i sleep
View GitHub Profile
@0xfe
0xfe / impulse-fft.py
Created February 28, 2020 11:39
FFT of Impulse Signal
points = 256
y = np.zeros(points, dtype="complex64")
y[20] = np.complex(1,0)
ifft_y = fft.irfft(y) * points
plt.figure(figsize=(10, 3))
plt.plot(ifft_y)
plt.show()
@0xfe
0xfe / impulse-signal.py
Created February 28, 2020 11:37
Impulse Signal
points = 256
y = np.zeros(points, dtype="complex64")
y[20] = np.complex(1,0) # stick a 1 into the 20th position
plt.figure(figsize=(10, 3))
plt.bar(np.arange(100), np.absolute(y)[:100]) # Show the first 100 points
plt.show()
@0xfe
0xfe / sine-wave-fft.py
Created February 27, 2020 22:29
FFT of Sine Wave
# Generate an integer-period sine wave to
# eliminate spectral leak.
hz = 20
x = np.linspace(0, 2 * np.pi * hz, 128 * hz)
y = np.sin(x)
plt.figure(figsize=(10, 3))
plt.plot(x, y)
plt.show()
# We're only interested in the real components
@0xfe
0xfe / sine-wave.py
Created February 27, 2020 22:26
20hz Sine Wave
import numpy as np
import matplotlib.pyplot as plt
# Generate Sine wave
hz = 20
x = np.arange(0, 1, 0.001) # 1 second
y = np.sin(2 * np.pi * hz * x)
plt.figure(figsize=(10, 3))
plt.plot(x, y)
plt.show()
@0xfe
0xfe / deep-pitchs-errors-by-key.py
Created February 23, 2020 03:29
Plot prediction errors by key
files = os.listdir("samples")
np.random.shuffle(files)
notes = ['A', 'As', 'B', 'C', 'Cs', 'D', 'Ds', 'E', 'F', 'Fs', 'G', 'Gs']
note_map = {}
for i, note_name in enumerate(notes):
note_map[note_name] = i
count_by_key = np.zeros((8 * 12))
errors_by_key = np.zeros((8 * 12))
@0xfe
0xfe / deep-pitches-start-training.py
Created February 23, 2020 03:21
Start Training the Deep Pitches Model
self.model.fit(training_xs, training_ys, epochs=150, batch_size=32,
callbacks=[tf.keras.callbacks.EarlyStopping(monitor='val_mse', patience=25)],
validation_data=(testing_xs, testing_ys))
@0xfe
0xfe / deep-pitches-build-training-data.py
Created February 23, 2020 03:16
Build Training Data for Deep Pitches
for octave in range(2, 8):
random.shuffle(GM_PATCHES)
for patch in range(0, 15):
program = GM_PATCHES[patch]
for key in Note.names:
sample = Sample("samples/note-%s%s-P%s" % (key, octave, program),
program=program, key=key, octave=octave)
sample.make_wav()
for pitch_shift_hz in np.concatenate((np.array([0]), np.random.randint(10, 80, 5))):
sample.transform_wav(
@0xfe
0xfe / deep-pitches-model.py
Created February 23, 2020 03:12
Deep Convnet Model for Pitch Detection
self.model = tf.keras.models.Sequential([
# Add features/channels dim for Conv2D layer
layers.Reshape((self.s_rows, self.s_cols, 1), input_shape=(self.s_rows, self.s_cols)),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
@0xfe
0xfe / spectrogram.py
Created February 22, 2020 23:58
Python Spectrogram
DefaultConfig = Config(
rows=513,
cols = 90,
s_nperseg = 256,
s_nfft = 1024,
s_noverlap = 200,
resample = 16000)
def spectrogram(file, config=DefaultConfig):
fs, data = wavfile.read(file)
@0xfe
0xfe / midi_note_helper.py
Created February 22, 2020 23:54
MIDI note helper
class Note:
values = {
"c": 0,
"d": 2,
"e": 4,
"f": 5,
"g": 7,
"a": 9,
"b": 11
}