質問するログイン新規登録

回答編集履歴

1

追記

2018/06/27 05:37

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -1,3 +1,53 @@
1
1
  ```python
2
2
  self.x += self.Amp * np.sin( 2. * np.pi * f * self.t )
3
+ ```
4
+
5
+ ### 追記
6
+ それっぽく聞こえなかったからいじりました。
7
+
8
+ ```python
9
+ import numpy as np
10
+ from scipy.io.wavfile import write
11
+
12
+ class GenFreq(object):
13
+ def __init__(self, Fs=44100., dur=1.):
14
+ # 諸々の初期化
15
+ self.Fcs = {'C':261.63, 'D':293.66, 'E':329.63, 'F':349.23, 'G':392.00, 'A':440.00, 'B':493.88} # うなりが聞こえてたので精度を上げる
16
+ self.Amp = 10
17
+
18
+ self.Fs = Fs
19
+ self.dur = dur
20
+ self.N = int( dur * Fs )
21
+ self.x = np.zeros( self.N )
22
+
23
+ delta = 1./Fs
24
+ self.t = np.arange( self.N ) * delta
25
+
26
+ def getSound(self):
27
+ # 波形データ配列を返す
28
+ return self.x
29
+
30
+ def getLen(self):
31
+ # データ配列長を返す
32
+ return self.N
33
+
34
+ def addTone(self, code='C', Amp=None): # 音圧レベル補正
35
+ if Amp is None:
36
+ Amp = self.Amp
37
+ # おとを重ねる
38
+ f = self.Fcs[code]*2
39
+ self.x += Amp * np.sin( 2. * np.pi * f * self.t )
40
+ # ここがうまく書けない
41
+
42
+ # ド・ミ・ソの和音(CEG) を作ってみる
43
+
44
+ Fs = 44100
45
+ s = GenFreq(Fs, dur=1.)
46
+ s.addTone('C', 10) # 根拠はよくわからないがこれくらいにしないと音の釣り合いが取れない感じだった
47
+ s.addTone('E', 25)
48
+ s.addTone('G', 71)
49
+ N = s.getLen()
50
+
51
+ # scipy.wav.iofile の write をインポート
52
+ write('soundtest.wav', Fs, s.getSound())
3
53
  ```