Pythonã¯ç§åŠèšç®ã®ã©ã€ãã©ãªãå å®ããŠããããããã®ã©ã€ãã©ãªã䜿ãããšã§ããµã€ã³æ³¢ãæè»œã«çæã§ãããããã§ããã°ãç°¡åãªã·ã³ã»ãµã€ã¶ãŒãäœãããšãã§ããã ãããä»åã¯ãPythonã®ã©ã€ãã©ãªPyAudioãšNumPyã§é³æ¥œã®çæã«ææŠããŠã¿ããã
PyAudioã®ã€ã³ã¹ããŒã«
PyAudioã¯ãPythonã®ãªãŒãã£ãªé¢é£ã©ã€ãã©ãªã ãé³å£°ã®é²é³ãåçãæžãåºãã«å¯Ÿå¿ããŠãããä»åã¯ããã®PyAudioãšNumPyãå©çšããŠé³æ¥œãå¥ã§ãŠã¿ãããšæãã
ä»åã¯ãAnaconda3ã«ãPyAudioãã€ã³ã¹ããŒã«ããŠã¿ããAnacondaã®ã€ã³ã¹ããŒã«ã¯ãæ¬é£èŒã®45åç®ãåèã«ãããã
Windowsãªããã¹ã¿ãŒãã¡ãã¥ãŒããAnaconda Promptãèµ·åããããmacOSã§ããã°ãã¿ãŒããã«.appãèµ·åãããããããŠã以äžã®ã³ãã³ããå®è¡ããã
conda install pyaudio
ãªããNumPyã¯æåããAnacondaã«ã€ã³ã¹ããŒã«ãããŠããã
ç°¡åãªããŒãé³ã鳎ãããŠã¿ãã
ããã§ã¯ãæãç°¡åã«ãããŒãé³ãåçããããã°ã©ã ã玹ä»ãããã以äžã®ããã°ã©ã ããbeep.pyããšããååã§ä¿åãããã
import pyaudio
import numpy as np
# é³å£°ãåºåããããã®ã¹ããªãŒã ãéã --- (*1)
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32,
channels=1,
rate=44100,
frames_per_buffer=1024,
output=True)
# é©åœãªãµã€ã³æ³¢ãçæãã --- (*2)
samples = np.sin(np.arange(50000) / 20)
# ãµã€ã³æ³¢ãåçãã --- (*3)
print("play")
stream.write(samples.astype(np.float32).tostring())
stream.close()
ã³ãã³ãã©ã€ã³ããã以äžã®ã³ãã³ããå®è¡ãããšãããŒã³ãšèšãã·ã³ãã«ãªãµã€ã³æ³¢ãåçãããã
python beep.py
ããã°ã©ã ãèŠãŠã¿ããã(ïŒ1)ã®éšåã§ã¯ãPyAudioã®åºåã¹ããªãŒã ãéããé³å£°ãåçã§ããç¶æ ã«ããããããŠã(ïŒ2)ã®éšåã§ãµã€ã³æ³¢ãçæããããããŠãããã°ã©ã ã®(ïŒ3)ã®éšåã§ãµã€ã³æ³¢ãåçããã
ãªããããã§åçããæ³¢åœ¢ã¯NumPyã®sinã¡ãœããã§çæããæ³¢åœ¢ã§ãæåã®500åã ãåãåºããŠèŠãŠã¿ããšã以äžã®ãããªæ³¢åœ¢ã«ãªã£ãŠããã以äžã¯Jupyter Notebbokã§æ³¢åœ¢ã衚瀺ãããšããã ã
ãµã€ã³æ³¢ã®çæã«é¢ããŠã ããNumPyã䜿ãããšã§ç°¡åã«çæã§ãããäžèšã®ããã°ã©ã (ïŒ2)ã®éšåã詳ããã¿ãŠã¿ããããŸãããnp.arange(10)ãã®ããã«èšè¿°ãããšã[0,1,2,3,...9]ã®ãããªé£çªã®é åãäœæããããnp.arange(10) / 10ããšæžããšã[0, 0.1, 0.2, 0.3 ... 0.9]ã®ãããªå€ãçæããããããã§ããnp.sin( np.arange(50000) / 20 )ãã®ããã«æžããšãåå€ã«sin颿°ãé©çšãããµã€ã³æ³¢ãçæãããã
é³çšãåçããŠã¿ãã
次ã«ãã¬ãã®é³çšãåçããŠã¿ããã以äžã®ããã°ã©ã ããdoremi.pyããšããååã§ä¿åããã
import pyaudio
import numpy as np
# ãµã³ããªã³ã°ã¬ãŒããå®çŸ© --- (*1)
RATE = 44100
# BPMãé³é·ãå®çŸ© --- (*2)
BPM = 100
L1 = (60 / BPM * 4)
L2,L4,L8 = (L1/2,L1/4,L1/8)
# ãã¬ã...ã®åšæ³¢æ°ãå®çŸ© --- (*3)
C,D,E,F,G,A,B,C2 = (
261.626, 293.665, 329.628,
349.228, 391.995, 440.000,
493.883, 523.251)
# ãµã€ã³æ³¢ãçæ --- (*4)
def tone(freq, length, gain):
slen = int(length * RATE)
t = float(freq) * np.pi * 2 / RATE
return np.sin(np.arange(slen) * t) * gain
# åç --- (*5)
def play_wave(stream, samples):
stream.write(samples.astype(np.float32).tostring())
# åºåçšã®ã¹ããªãŒã ãéã --- (*6)
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32,
channels=1,
rate=RATE,
frames_per_buffer=1024,
output=True)
# ãã¬ããåç --- (*7)
print("play")
play_wave(stream, tone(C, L8, 1.0))
play_wave(stream, tone(D, L8, 1.0))
play_wave(stream, tone(E, L4, 1.0))
stream.close()
ãã®ããã°ã©ã ãå®è¡ããã«ã¯ã以äžã®ã³ãã³ããæã¡èŸŒããã
python doremi.py
ããã°ã©ã ã確èªããŠã¿ããã(ïŒ1)ã®éšåã§ã¯ããµã³ããªã³ã°ã¬ãŒããæå®ããããµã³ããªã³ã°ã¬ãŒããšããã®ã¯ã1ç§ãããã€ã®ããŒã¿ã§è¡šãããšãããã®ã ãããã§ã¯ã44100(44.1kHz)ãæå®ããŠããã®ã§ã1ç§éã«44100åã®ããŒã¿ãåçããã€ã¹ã«éä¿¡ãããšããæå³ã«ãªããã¡ãªã¿ã«ãCDã®ãµã³ããªã³ã°ã¬ãŒãã¯44.1kHzãFMã©ãžãªã¯33kHzãé»è©±ã¯8kHzã ã
ãããŠã(ïŒ2)ã®éšåã§ã¯ã鳿¥œã®ãã³ãã衚ãBPM(Beat Per Minute)ãé³ã®é·ããå®çŸ©ãããããã§ã¯ãBPMã100ã«æå®ãããããã¯ã1åéãããã«å»ãææ°ã100åã«ãããšããæå³ã ããããŠãããã§ã¯ãé³ã®é·ããç§åäœã§ãå šåé³ç¬Š(L1)ãäºåé³ç¬Š(L2)ãååé³ç¬Š(L4)ãå «åé³ç¬Š(L8)ãèšç®ããã
次ã«ã(ïŒ3)ã®éšåã§ã¯ããã¬ãã®é³ã®åšæ³¢æ°ãå®çŸ©ããŠããããã®é³(C)ã¯261.626Hzãã¬ã®é³(D)ã¯293.665Hzããã®é³(E)ã¯329.628Hz ... ã®ããã«åšæ³¢æ°ãæå®ããã
(ïŒ4)ã®éšåã§ã¯ãµã€ã³æ³¢ãçæãã颿°toneãå®çŸ©ãããNumPyãå©çšããããšã§ãµã€ã³æ³¢ãæè»œã«äœæããŠããã(ïŒ5)ã®éšåã§ã¯ãçæãããµã€ã³æ³¢ãPyAudioã®ã¹ããªãŒã ã«æžã蟌ã颿°play_waveãå®çŸ©ããã(ïŒ6)ã®éšåã¯ãPyAudioã§ã¹ããªãŒã ãéãåŠçã§ã(ïŒ7)ã®éšåã§å®éã«ãã¬ããŒãšåçãè¡ãã
ãªããé³çšã«ãããµã€ã³æ³¢ã®éãã確èªããŠã¿ããã以äžã®ããã«ããã»ã¬ã»ã©ã»ã·ã®åã€ã®é³çšã®æ³¢åœ¢ãçæããã
tone_c = tone(C, L4, 1.0) # ã
tone_d = tone(D, L4, 1.0) # ã¬
tone_a = tone(A, L4, 1.0) # ã©
tone_b = tone(B, L4, 1.0) # ã·
äžèšã®æ³¢åœ¢ããŒã¿ãJupyterã§å ã»ã©ãšåæ§ã®æ¹æ³ã§æç»ããŠã¿ããé³çšããšã«ãµã€ã³æ³¢ã®åšæãç°ãªãããšãåããã ããã
åšæ³¢æ°ãšåäºå¹³ååŸã®é¢ä¿
ãšããã§ãããã°ã©ã ã®(ïŒ3)ã®éšåã§ããã¬ãã®åšæ³¢æ°ã宿°ã§æå®ããããããããã®å€ã¯èšç®ã«ãã£ãŠæ±ããããšãã§ãããæ°åŠãšé³æ¥œã®é¢ä¿ã¯é¢çœãããã£ãããªã®ã§èšç®ããŠã¿ããã
ãŸããåææ¡ä»¶ãšããŠã身è¿ãªé³æ¥œã¯ãåäºå¹³ååŸã§ãã¥ãŒãã³ã°ãããŠãããããã¯ã1ãªã¯ã¿ãŒãã12çåããŠè¡šãããã®ã§ãããã€ãŸãã12åé³äžã1ãªã¯ã¿ãŒãäžãšãªãã
ãããŠãããã®ã¿ãŒã®ãã¥ãŒãã³ã°ã§äœ¿ããã440Hzã¯ã©ã®é³ã ãããããã1ãªã¯ã¿ãŒãäžã®é³ãæ±ããã«ã¯åšæ³¢æ°ã«2ãæããã°è¯ãããã®ããã1ãªã¯ã¿ãŒãäžã®ã©ã®åšæ³¢æ°ã¯880HzãšãªãããããããèããŠã¿ããšãåé³äžã®é³ã®åšæ³¢æ°ãèšç®ãããå Žåãå ã®åšæ³¢æ°ã«2ã®12乿 ¹ãæãåããã°è¯ãã
åããããããPythonã®ããã°ã©ã ã§ç¢ºèªããŠã¿ãããã©(440Hz)ã®åé³äžãã©â¯ïŒãŸãã¯ã·âïŒãæ±ããã«ã¯ã以äžã®ãããªã«ãããå®è¡ãããšã466.1637615180899ã衚瀺ãããã
a = 440
a_sharp = a * (2 ** (1/12))
print(a_sharp)
ãããå©çšããŠã128段éã®åšæ³¢æ°ãèšç®ããããã°ã©ã ãäœã£ãŠã¿ããã128段éãšã¯MIDI楜åšã®éµç€ã«å¯Ÿå¿ããåšæ³¢æ°ã ã
base_a = 440
names = ("C","C#","D","D#","E","F","F#","G","G#","A","A#","B")
res = []
for n in range(0, 128):
hz = 440 * 2 ** ((n-69) / 12)
name = names[n % 12]
o = int(n / 12)
res.append([name, o, hz])
import pandas as pd
df = pd.DataFrame(res, columns=["Note", "Octave", "Freq"])
df
ãŸãšã
以äžãä»åã¯ãPythonã§é³æ¥œãåçããæ¹æ³ã玹ä»ãããç§åŠèšç®ã©ã€ãã©ãªã®NumPyãšé³å£°ã©ã€ãã©ãªã®PyAudioã䜿ãããšã§ãæ°è»œã«é³ãçæããŠé³Žããããšãã§ãããããããæ³¢åœ¢åæãè¡ãã«ã¯ãæ°åŠã®ç¥èãå¿ èŠã«ãªããããã¬ãã鳎ããã ãã§ããã°ãããã»ã©é£ããèšç®ã¯å¿ èŠã§ã¯ãªããä»åã®ããã°ã©ã ãå©ãå°ã«ããããšã§ãç°¡åãªã·ã³ã»ãµã€ã¶ãŒãPythonã§èªäœããããšãã§ããã ãããPythonã§ãªãªãžãã«æ¥œåšãäœæããã®ã楜ããã ããã
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿èªå®ã2010幎 OSSè²¢ç®è ç« åè³ãæè¡æžãå€ãå·çããŠããã


