回答編集履歴

1

追記

2018/06/27 05:37

投稿

hayataka2049
hayataka2049

スコア30933

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