【Python】npyファイルから読み込んだ音を演奏する

以下の記事で書き出した TONES.npy と melody.npy を配列として読み込むことで、
演奏する音を変更しやすくする。

import numpy as np
import wave
import struct

filename = "cde.wav"

TONESfile = "TONES.npy"
melodyfile = "melody.npy"

a = 1.0
fs = 44100
bpm = 60

nt = np.load(TONESfile)
TONES = nt.tolist()

nm = np.load(melodyfile)
melody = nm.tolist()

sound = []
for note in melody:
  tones = note[0]
  beat = note[1]
  sec = 60 / bpm * beat * 4
  n = np.arange(fs * sec)
  s = None
  for tone in tones:
    if tone in TONES:
      f0 = TONES[tone]
    else:
      f0 = 0
    if s is None:
      s = a * np.sin(2.0 * np.pi * f0 * n / fs)
    else:
      s += a * np.sin(2.0 * np.pi * f0 * n / fs)
  sound += s.tolist()

s = np.array(sound)
abs = np.abs(s)
max_num = 32767.0 / max(abs)
s = [int(x * max_num) for x in s]

bin = struct.pack('h' * len(s), *s)

w = wave.Wave_write(filename)
p = (1, 2, fs, len(bin), 'NONE', 'not compressed')
w.setparams(p)
w.writeframes(bin)
w.close()
タイトルとURLをコピーしました