çŽ æãæºåããéã«ãå€ãCã³ãŒããPythonã§æžãçŽããã®ã§ããã®opusã¯ãæšæºctypesã©ã€ãã©ãªã䜿çšããŠPythonããWindows DLLã䜿çšããäŸã§ããããŸãã
èšäºã®æåŸã«ã2æã®Realtekããã³Audigy 2ãµãŠã³ãã«ãŒãããååŸããããŒã¿ãæ¯èŒããçµ±èšçã©ã³ãã ãã¹ãã®çµæã瀺ããŸãã
UPD UFOãé£ã¹ãã³ãŒãã®ãŒãã®æ¬ èœãä¿®æ£ããŸããã
éå±ãªçè«ã®çŽ¹ä»
ã»ãšãã©ãã¹ãŠã®ããã°ã©ãã³ã°èšèªã¯ãããããç䌌乱æ°ãçæããããã®ããã€ãã®æ©èœãæäŸããŸãã PSHã¯åèªã®æ°åŠçãªæå³ã§ã©ã³ãã ã§ã¯ãªããããã€ãã®ããç¥ãããã¢ã«ãŽãªãºã ã«ãã£ãŠååŸãããã¢ã«ãŽãªãºã ã®åæãã©ã¡ãŒã¿ãŒãç¥ã£ãŠãããããçµæã®ã·ãŒã±ã³ã¹ã¯åžžã«åã³ç¹°ãè¿ãããŸãã å€ãã®ã¿ã¹ã¯ã§ãé«å質ã®PSCãžã§ãã¬ãŒã¿ãŒã¯çã®ä¹±æ°ãå®å šã«çœ®ãæããããšãã§ããŸãã ã³ã³ãã¥ãŒã¿ãŒã²ãŒã ãããã»ã¹ã¢ããªã³ã°ãã¢ã³ãã«ã«ãçµ±åãéºäŒçã¢ã«ãŽãªãºã ...åªããPSHã§ååãªã¿ã¹ã¯ã®ãªã¹ãã¯ãé·æéç¶ç¶ã§ããŸãã
äžæ¹ãåŸãããã·ãŒã±ã³ã¹ã®çã®ã©ã³ãã æ§ãéèŠã§ããåé¡ã®éããããµãŒã¯ã«ããããŸãã äž»ãªäŸã¯æå·åã§ãã æ¬åœã«ä¹±æ°ãåŸãããšã«äººã ãåžžã«èå³ãæã£ãŠããã®ã¯æå·åã®æèã§ãã æãåçŽãªäŸã¯ã絶察æå·åŒ·åºŠã蚌æãããŠããå¯äžã®æå·ã§ããVernamæå·ïŒè±èªã®ã¯ã³ã¿ã€ã ããã ïŒã¯ãããŒã®ç§å¯ã¡ãã»ãŒãžãšåãé·ãã®çã«ä¹±æ°ã®ã·ãŒã±ã³ã¹ãå¿ èŠãšããŸãã æå·åŒ·åºŠã確ä¿ããããã«ãããŒã®çæã«äœ¿çšãããã©ã³ãã ããŒã¿ïŒVernamæå·ãAESãRSAãªã©ïŒãåå©çšããªãã§ãã ããã ããã¯ãä¿¡é Œã§ããä¹±æ°ã®ãœãŒã¹ãèŠã€ãããšããåé¡ã«ã€ãªãããŸãã
ãµãŠã³ãã«ãŒãã«ã¯ãã³ã³ãã¥ãŒã¿ãŒã®ä»ã®ã»ãšãã©ã®ã³ã³ããŒãã³ããšã¯ç°ãªããããžã¿ã«éšåã ãã§ãªãã¢ããã°éšåããããŸãã
ãµãŠã³ãã«ãŒãã®ç·åœ¢å ¥åã§ãªãŒãã£ãªä¿¡å·ãããžã¿ã«åããïŒããªããã£ããªïŒããã»ã¹ãèããŸãã
- æåã«ãé³ã«é¢ããæ å ±ãäŒããäœããã®ãœãŒã¹ããã®é»æ°ä¿¡å·ããããŸã
- ä¿¡å·ã¯ãµãŠã³ãã«ãŒãã®ã¢ããã°éšåã«å ¥ããããã§å¢å¹ ãããŠADCïŒã¢ããã°ããžã¿ã«ã³ã³ããŒã¿ãŒïŒã®ãã€ãããã¯ã¬ã³ãžã«äžèŽããŸãã
- ä¿¡å·ã¯ãç¹å®ã®è§£å床ãšãµã³ããªã³ã°åšæ³¢æ°ã§ADCã«ãã£ãŠããžã¿ã«åããããªãŒãã£ãªã«ãŒãã®ããžã¿ã«éšåã«å
¥åãããŸãããã®éšåããããã°ã©ã ã§ååŸã§ããŸãã
ãã©ã°ã©ã2ã«èå³ããããŸãã ãåç¥ã®ããã«ãã¢ããã°é»æ°ä¿¡å·ã«ã¯å¿ ç¶çã«ãã€ãºãå«ãŸããŸãããã€ãºæåã¯ããã€ãã®ã«ããŽãªã«å€§å¥ã§ããŸãã
- ç¡ç·å¹²æžããã³è¿é£ã®ããã€ã¹ããã³ç¡ç·ããã®å¹²æžïŒã·ãŒã«ããäžååãªã¢ã³ããç¡ç·ããã£ããããæ¹æ³ãèããããšããããŸããïŒïŒ
- é»æºå¹²æžïŒååãšããŠãç¡ç·å¹²æžã«èµ·å ããå ŽåããããŸãïŒ
- åè·¯éšåã®ã©ã³ãã é»åéåã®ç±éé³
å¹²æžãšãã¯ãŒã®ã©ã³ãã æ§ãéèŠãªãã€ã³ãã§ããå Žåã3çªç®ã®ã¿ã€ãã®ãã€ãºã¯çŽç²ã«éåã§ããã çã«ã©ã³ãã ã§ãã
å®éåé¡ã¯ããã®ãã€ãºããµãŠã³ãã«ãŒãã®ããžã¿ã«éšåã«ã©ãã ã浞éããããšããããšã§ãã çµéšã«ããã°ãããã¯æµžéããŠããŸããããžã¿ã«åããŠä¿åã§ããŸãã
16ãããèšé²ã¢ãŒãã§ã¯ãåãµã³ãã«ã®æäžäœãããã®ã¿ãã©ã³ãã æ å ±ãäŒéããŸã.24ãããã¢ãŒãã§ã¯ãããã€ãã®æäžäœãããããåžžã«1ã€ã®æäžäœãããã®ã¿ãåãããšãæãä¿¡é Œã§ããŸãã ãããããã«è¡ãæ¹æ³ãšãWindowsçšã®Pythonããã°ã©ã ã®äŸã説æããŸãã
Pythonã«èå³ããªã人ïŒããã°ã©ã ã®èª¬æã®åŸã®æåŸã®çµæãšçµè«ã®åæã
Windowsã§ã®é²é³
Windowsã§ãµãŠã³ããé²é³ããæãç°¡åãªæ¹æ³ã¯ã winmm.dllã©ã€ãã©ãªã®Waveform Audioã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããããšã§ãã Pythonã§ãµãŠã³ããæäœããããã®æšæºã©ã€ãã©ãªã¯ãªããããéåžžã®DLLãžã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããctypesã©ã€ãã©ãªã䜿çšããŸã ã
sysã©ã€ãã©ãªïŒæšæºåºåãžã®ã¢ã¯ã»ã¹çšïŒãštime ïŒ sleepé¢æ°ãžã®ã¢ã¯ã»ã¹çšïŒãã€ã³ããŒãããŸãã ãŸãã ctypesãããã¹ãŠã®ååãã€ã³ããŒãããŸãã
ã€ã³ããŒãã·ã¹ãã
èŒžå ¥ æé
ctypes ã€ã³ããŒã ãã *
æŽæ°ïŒéåžžã¯ãšã©ãŒã³ãŒãïŒãè¿ãCé¢æ°ã®å ŽåãPythonã§ã¯ãšã©ãŒã³ãŒãããã§ãã¯ããé¢æ°ãæå®ã§ããŸãã ããã䜿çšããŠãããã°ã©ã ã«æå°éã®ãšã©ãŒå¶åŸ¡ãè¿œå ããŸããCé¢æ°ããšã©ãŒãè¿ãå ŽåãMMSYSERR_NOERRORã¯PythonäŸå€ãã¹ããŒããã³ã³ãœãŒã«ã¯åé¡ãã©ãã«ããããæ£ç¢ºã«ç¢ºèªããŸãã
次ã«ããªã¹ãããwinmm.dllã©ã€ãã©ãªïŒPythonãªããžã§ã¯ãwindll.winmmãctypesããã€ã³ããŒããããŸãïŒã®åé¢æ°ã«å¯ŸããŠãçŸåšã®varsïŒïŒã³ã³ããã¹ãã§å€æ°ãäœæããã«ãŒãããããŸãã .waveInOpenïŒã ãŸããæ»ãå€ã®åããå¶åŸ¡ãé¢æ°MMSYSERR_NOERRORã«å²ãåœãŠãŸãã
def MMSYSERR_NOERROR ïŒå€ïŒ ïŒ
å€ãªã ïŒ = 0 ïŒ
raise Exception ïŒ "winmm.dllé¢æ°ã®å®è¡äžã®ãšã©ãŒ" ãå€ïŒ
æ»ãå€
[ "waveInOpen" ã "waveInPrepareHeader"ã® funcnameã®å Žåã
"waveInAddBuffer" ã "waveInStart" ã
"waveInStop" ã "waveInReset" ã
"waveInUnprepareHeader" ã "waveInClose" ] ïŒ
vars ïŒ ïŒ [ funcname ] = windllã winmm [ funcname ]
vars ïŒ ïŒ [ funcname ] restype = MMSYSERR_NOERROR
Windows Audioã§äœæ¥ããããã«å¿ èŠãªCæ§é ãå®çŸ©ããŸãã æ§é ã¯ã©ã¹ã¯ã ctypesããã€ã³ããŒããããæ§é ã¯ã©ã¹ãç¶æ¿ããå¿ èŠããããæ§é èŠçŽ ã®ååãšCã¿ã€ãããªã¹ããã_fields_ãã£ãŒã«ããå«ãå¿ èŠããããŸãã ctypesããCã¿ã€ãã®ã¯ã©ã¹ãã€ã³ããŒãããŸããããããã®ååã¯ãc_intãc_uintãªã©ãè¡šããŠããŸãã
æåã®WAVEFORMATEXæ§é ã«ã¯ããªãŒãã£ãªããŒã¿åœ¢åŒã®æ å ±ãå«ãŸããŠããŸãã ãã©ã¡ãŒã¿ãŒããªãå Žåãã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã»ãšãã©ã®ãµãŠã³ãã«ãŒãã®å žåçãªå€ã§ãã16ããã48 kHzã¢ãã©ã«ã®æ§é ãäœæããŸãã
2çªç®ã®WAVEHDRã¯ããªãŒãã£ãªããŒã¿ã®ãããã¡ãŒãèšè¿°ããŸãã ãã©ã¡ãŒã¿ãŒãšããŠãã³ã³ã¹ãã©ã¯ã¿ãŒã¯WAVEFORMATEXåã®ãªããžã§ã¯ããå¿ èŠãšãããã®åœ¢åŒã®1ç§ã®é³å£°ãä¿åã§ãããããã¡ãŒãå²ãåœãŠãŸãã Cæåã®é åã¯ã create_string_bufferé¢æ°ã«ãã£ãŠäœæãããŸãã
ã¯ã©ã¹ WAVEFORMATEX ïŒæ§é äœïŒ ïŒ
WAVE_FORMAT_PCM = 1
_fields_ = [ ïŒ "wFormatTag" ãc_ushort ïŒ ã
ïŒ "nChannels" ãc_ushort ïŒ ã
ïŒ "nSamplesPerSec" ãc_uint ïŒ ã
ïŒ "nAvgBytesPerSec" ãc_uint ïŒ ã
ïŒ "nBlockAlign" ãc_ushort ïŒ ã
ïŒ "wBitsPerSample" ãc_ushort ïŒ ã
ïŒ "cbSize" ãc_ushort ïŒ ]
def __init__ ïŒ self ãsamples = 48000 ãbits = 16 ãchannels = 1 ïŒ ïŒ
èªå·± ã wFormatTag = WAVEFORMATEX ã WAVE_FORMAT_PCM
èªå·± ã nSamplesPerSec =ãµã³ãã«
èªå·± ã wBitsPerSample =ããã
èªå·± ã nChannels =ãã£ã³ãã«
èªå·± ã nBlockAlign = self nChannels * self ã wBitsPerSample / 8
èªå·± ã nAvgBytesPerSec = self nBlockAlign * self ã nSamplesPerSec
èªå·± ã cbSize = 0
ã¯ã©ã¹ WAVEHDR ïŒæ§é äœïŒ ïŒ
_fields_ = [ ïŒ "lpData" ãPOINTER ïŒ c_char ïŒ ïŒ ã
ïŒ "dwBufferLength" ãc_uint ïŒ ã
ïŒ "dwBytesRecorded" ãc_uint ïŒ ã
ïŒ "dwUser" ãc_uint ïŒ ã ïŒãŠãŒã¶ãŒããŒã¿dwordãŸãã¯ãã€ã³ã¿ãŒ
ïŒ "dwFlags" ãc_uint ïŒ ã
ïŒ "dwLoops" ãc_uint ïŒ ã
ïŒ "lpNext" ãc_uint ïŒ ã ïŒäºçŽæžã¿ã®ãã€ã³ã¿ãŒ
ïŒ "reserved" ãc_uint ïŒ ] ïŒäºçŽæžã¿ã®ãã€ã³ã¿ãŒ
def __init__ ïŒ self ã Waveformat ïŒ ïŒ
èªå·± ã dwBufferLength =波圢ã nAvgBytesPerSec
èªå·± ã lpData = create_string_buffer ïŒ ' \ 0 00' * selfãdwBufferLength ïŒ
èªå·± ã dwFlags = 0
次ã«ãwaveFormatãªããžã§ã¯ããäœæããŸãã ãªãŒãã£ãªããŒã¿çšã®3ã€ã®ãããã¡ã
æ®å¿µãªãããã»ãšãã©ã®ãã©ã€ããŒã§ã¯ã winmm.dll ïŒããªãå€ãã€ã³ã¿ãŒãã§ã€ã¹ã®å¯èœæ§ããããŸãïŒã§ã¯ããªãŒãã£ãªã«ãŒãããµããŒãããŠããŠãã16ããããããæ£ç¢ºã«ããžã¿ã«åã§ããŸããã ç§ã¯1æã®ã«ãŒãã ããç¥ã£ãŠããŸãïŒSB Live24bitãããã¯ã§ããŸããã çŸåšã¯æå ã«ãããŸããããDirectXãŸãã¯ASIOã§ã®ã¿24ããããæžã蟌ãAudigy 2 NotebookããããŸãã ãããã£ãŠãä»æ¥ã®äŸã¯16ãããçšã«èšèšãããŠããŸãïŒ24ãããã§å€æŽããå¿ èŠãããå Žæã¯ãã«ãŒããããããµããŒãããŠããå Žåã«ã³ã¡ã³ãã§ããŒã¯ãããŠããŸãïŒã
waveFormat = WAVEFORMATEX ïŒãµã³ãã«= 48000 ãããã= 16 ïŒ
waveBufferArray = [ ç¯å² ïŒ 3 ïŒã® iã®WAVEHDR ïŒ waveFormat ïŒ ]
次ã®é¢æ°ã¯ããã°ã©ã ã®äž»èŠãªé¢æ°ã§ããã winmm.dllããããã¡ã®1ã€ãæºããããšãã«Windowsã«ãã£ãŠåŒã³åºãããŸãã
ããã¯Cã³ãŒã«ããã¯ã§ãããããæåã«ã¯ã©ã¹ãäœæããå¿ èŠããããŸãã ããã¯ctypesã®WINFUNCTYPEé¢æ°ãåŒæ°ïŒæ»ãå€ã®åãåŒæ°ã®åã«ãã£ãŠè¡ãããŸãã ãã®é¢æ°ã¯äœãè¿ãã¹ãã§ã¯ãªããããMSDNã«ãããšãæåã®åŒæ°ã¯None ãæ®ãã¯Noneã§ãã åŒæ°POINTERïŒc_uintïŒã«æ³šæããŠãã ãã-ããã¯ãŠãŒã¶ãŒããŒã¿ãžã®ãã€ã³ã¿ã§ãããã®äŸã§ã¯åãªãæ°åã§ãããããšãã°ãããŒã¿ãæžã蟌ãå Žæãå¿ èŠãªããŒã¿éã瀺ãã¯ã©ã¹ãªã©ãäœã§ãããŸããŸããã POINTERïŒWAVEHDRïŒã¯ãããŒã¿ãããã¡ãŒãžã®ãã€ã³ã¿ãŒã§ãã
uMsgãã©ã¡ãŒã¿ãŒã¯åŒã³åºãã®çç±ã瀺ããŸããMM_WIM_DATAã«èå³ããããŸã-ãªãŒãã£ãªããŒã¿ãå©çšå¯èœã§ãã
WRITECALLBACK = WINFUNCTYPE ïŒ None ãc_uintãc_uintãPOINTER ïŒ c_uint ïŒ ãPOINTER ïŒ WAVEHDR ïŒ ãc_uint ïŒ
def pythonWriteCallBack ïŒ HandleWaveInãuMsgãdwInstanceãdwParam1ãdwParam2 ïŒ ïŒ
MM_WIM_CLOSE = 0x3BF
MM_WIM_DATA = 0x3C0
MM_WIM_OPEN = 0x3BE
uMsg == MM_WIM_OPENã®å Žå ïŒ
"Open handle =" ãHandleWaveInãå°å·ããŸã
elif uMsg == MM_WIM_CLOSEïŒ
"Close handle =" ãHandleWaveInãå°å·ã ãŸã
elif uMsg == MM_WIM_DATAïŒ
#print "Data handle ="ãHandleWaveIn
wavBuf = dwParam1ã å 容
wavBufã®å Žå ã dwBytesRecorded > 0 ïŒ
bits = [ ord ïŒ wavBufãlpData [ i ] ïŒ ïŒ 1 for i in range ïŒ 0 ã wavBufãdwBytesRecorded ã 2 ïŒ ]
ïŒ24ãããã®å ŽåïŒåã®è¡ã®2ã®çµããã3ã«çœ®ãæããŸã
ç¯å² = 0 ã len ïŒãããïŒ ã 2 ïŒã® iã®ãã€ã¢ã¹= [ããã[ i ] ãããã[ i ]ã® å Žå ïŒ =ããã[ i + 1 ] ]
bytes = [ chr ïŒ reduce ïŒ lambda vãbïŒv << 1 | bãbias [ i- 8 ïŒi ] ã 0 ïŒ ïŒ i for range ïŒ 8 ã len ïŒ bias ïŒ ã 8 ïŒ ]
rndstr = '' ã çµå ïŒ ãã€ã ïŒ
#print bytesã
sys æšæº æžãèŸŒã¿ ïŒ rndstr ïŒ
wavBufã®å Žå ã dwBytesRecorded == wavBufã dwBufferLength ïŒ
waveInAddBuffer ïŒ HandleWaveInãdwParam1ãsizeof ïŒ waveBuf ïŒ ïŒ
ãã®ä» ïŒ
ã1ã€ã®ãããã¡ã®è§£æŸã ãdwInstance [ 0 ]ãåºåããŸã
dwInstance [ 0 ] -= 1
ãã®ä» ïŒ
ãäžæãªã¡ãã»ãŒãžããçºçããã
ããŒãã€ã³ãïŒ
bits = [ ord ïŒ wavBufãlpData [ i ] ïŒ ïŒ 1 for i in range ïŒ 0 ã wavBufãdwBytesRecorded ã 2 ïŒ ]
ããŒã¿ã¯2ãã€ãïŒ24ãããã®å Žåã¯3ãã€ãïŒã§ããã¯ãããããã2ã®ã¹ãããã§é åã調ã¹ãŸãïŒç¯å²ïŒ0ãwavBuf.dwBytesRecordedã2ïŒïŒããã¢ã®æäžäœãã€ãã®æäžäœããããéžæããŸãïŒ ordïŒwavBuf.lpData [i]ïŒ ïŒ1 ã çµæã¯ãåãµã³ãã«ã®æäžäœãããã®ãããã®ãªã¹ãã§ãã
å°ããªæ°åŠçãªäœè«ïŒ
ã©ã³ãã ããŒã¿ã¯ç°ãªãååžãæã€å ŽåããããŸãã ç¹å®ã®çªå·ã®çºçé »åºŠã ããšãã°ãããã0000100000000ã®ã·ãŒã±ã³ã¹ãããããŠãããã®äœçœ®ãã©ã³ãã ã«å€åããå Žåããããã©ã³ãã ã·ãŒã±ã³ã¹ã§ããããŒããçºçãã確çããŠããããããã¯ããã«é«ãããšã¯æããã§ãã æã䟿å©ãªãããã ãŒããš1ã®çºç確çãçãããåäžååžã ã åäžãªååžã«éå ããæé ã¯ããã€ã¢ã¹ãªããšåŒã°ããŸãã æãç°¡åãªæ¹æ³ã¯çœ®æã§ãïŒ10-> 1ã01-> 0ã11-> discardã00-> discard
ãã€ã¢ã¹ã解é€ãããšã次ã®è¡ãå®è¡ãããŸã
ç¯å² = 0 ã len ïŒãããïŒ ã 2 ïŒã® iã®ãã€ã¢ã¹= [ããã[ i ] ãããã[ i ]ã® å Žå ïŒ =ããã[ i + 1 ] ]
ã¹ããã2ãå®è¡ããŸãïŒ rangeïŒ0ãlenïŒbitsïŒã2ïŒ ãåããã¢ãæããŸã ïŒ bits [i]ïŒ= Bits [i + 1] ãæ®ãããæåã«åãïŒããã[i]ã
æåŸã«ããã®åŒã¯ãããããã€ãã«åéãããã¹ãŠãæååã«ããŒãžããŸã
bytes = [ chr ïŒ reduce ïŒ lambda vãbïŒv << 1 | bãbias [ i- 8 ïŒi ] ã 0 ïŒ ïŒ i for range ïŒ 8 ã len ïŒ bias ïŒ ã 8 ïŒ ]
8ãããããšã«ã reduceé¢æ°ãåŒã³åºãããŸãïŒã©ã ãvãbïŒv << 1 | bããã€ã¢ã¹[i-8ïŒi]ã0ïŒ ã ããã§ã¯ãé¢æ°åããã°ã©ãã³ã°èŠçŽ ãå¿åé¢æ°ïŒäžæçã«FãšåŒã³ãŸãããïŒ lambda vãbïŒv << 1 | bã䜿çšããŸãã次ã®ãããªreduceé¢æ°ã«ãã£ãŠåŒã³åºãããŸãããã€ã¢ã¹[i-7]ïŒã...ããã€ã¢ã¹[i-1]ïŒ- chré¢æ°ã«ãã£ãŠæåã«å€æããããã€ããå€æããŸãã
ãã€ãã®ãªã¹ãã¯stdoutã«æžã蟌ãŸããæååã«å€æãããŸããããã¯ããã®ãã€ããªããŒã¿ã®æ¹ãåºåããã¡ã€ã«ã«ãªãã€ã¬ã¯ãããæ¹ãããããã§ãã ã³ã³ãœãŒã«ã«æžã蟌ãå Žåãã³ã³ãœãŒã«ãžã®ãã€ããªåºåæã«WindowsãCtrl + Cãé©åã«ãã£ããããªãããã ã print bytes ãã䜿çšããŠãããè¡ãããšããå§ãããŸãã
é¢æ°ã®æåŸã«ã¯ããããã¡ãå®å šã«æºããããŠãããã©ããã確èªãããã§ãã¯ããããŸãã ããã§ããå Žåãã·ã¹ãã ã«æ»ããŠwaveInAddBufferé¢æ°ã§åããŸãã ããã§ãªãå Žåãããã¯ããŒã¿åºåãåæ¢ããŠããïŒããã€ã¹ãéããŠããïŒããšãæå³ããå æãããã¡ã®ã«ãŠã³ã¿ãŒã1ã€æžãããŸãïŒã«ãŠã³ã¿ãŒã¯ãŠãŒã¶ãŒããŒã¿ã«ä¿åãããŸãïŒã
pythonWriteCallBacké¢æ°ããWRITECALLBACKã¯ã©ã¹ã®Cé¢æ°ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
次ã«ãããã€ãã®äŸ¿å©ãªå®æ°ãå®çŸ©ããåŸãæåã«WAVE_FORMAT_QUERYãã©ã¡ãŒã¿ãŒã§ãã©ãŒãããããµããŒããããŠããããšã確èªãã次ã«CALLBACK_FUNCTIONãã©ã¡ãŒã¿ãŒã§ãWAVE_MAPPERããã€ã¹ãéããŸãïŒãµãŠã³ãã«ãŒãçªå·ãçŽæ¥èšå®ã§ããŸãããŠãŒã¶ãŒããŒã¿ïŒãã®äŸã§ã¯ãExitFlagã®æ°ïŒã
byrefé¢æ°ã䜿çšããŠããã€ã³ã¿ãŒãPythonããCé¢æ°ã«ã©ã®ããã«æž¡ããããã«æ³šç®ããŠãã ãã ã ãŸãã byrefïŒExitFlagïŒã§ããŠãŒã¶ãŒããŒã¿ããžã®ãã€ã³ã¿ãŒãæž¡ããŸãããWindowsã¯ãã€ãã³ãããšã«dwInstanceã®åœ¢åŒã§ã³ãŒã«ããã¯ã«æž¡ããŸãïŒããšãã°ããããã¡ãŒãåããïŒã
次ã«ãäœæãããåãããã¡ãŒã«å¯ŸããŠwaveInPrepareHeaderãåŒã³åºããwaveInAddBufferã䜿çšããŠwinmm.dllãæž¡ããŸãã æåŸã«ãwaveInStartïŒHandleWaveInïŒãåŒã³åºããšãé³å£°ã®å ¥åãéå§ããããã«æ瀺ãããŸãã ãµã€ã¯ã«time.sleepïŒ1ïŒã§åŸ ã£ãŠããçµããã
ããŒã®çµã¿åããCtrl + CïŒPython KeyboardInterrupt ïŒãã€ã³ã¿ãŒã»ããããŠãããã°ã©ã ãçµäºããŸãã
writeCallBack = WRITECALLBACK ïŒ pythonWriteCallBack ïŒ
è©ŠããŠãã ãã ïŒ
ExitFlag = c_uint ïŒ 3 ïŒ
HandleWaveIn = c_uint ïŒ 0 ïŒ
WAVE_MAPPER = c_int ïŒ -1 ïŒ
WAVE_FORMAT_QUERY = c_int ïŒ 1 ïŒ
CALLBACK_FUNCTION = c_int ïŒ 0x30000 ïŒ
waveInOpen ïŒ 0 ãWAVE_MAPPERãbyref ïŒ waveFormat ïŒ ã 0ã0 ãWAVE_FORMAT_QUERY ïŒ
waveInOpen ïŒ byref ïŒ HandleWaveIn ïŒ ãWAVE_MAPPERãbyref ïŒ waveFormat ïŒ ãwriteCallBackãbyref ïŒ ExitFlag ïŒ ãCALLBACK_FUNCTION ïŒ
waveBufferArrayã®waveBufã®å ŽåïŒ
waveInPrepareHeader ïŒ HandleWaveInãbyref ïŒ waveBuf ïŒ ãsizeof ïŒ waveBuf ïŒ ïŒ
waveInAddBuffer ïŒ HandleWaveInãbyref ïŒ waveBuf ïŒ ãsizeof ïŒ waveBuf ïŒ ïŒ
waveInStart ïŒ HandleWaveIn ïŒ
äžæ¹ 1
æé ã å¯ã ïŒ 1 ïŒ
KeyboardInterrupt ãé€ã ïŒ
waveInReset ïŒ HandleWaveIn ïŒ
äžæ¹ 1
æé ã å¯ã ïŒ 1 ïŒ
ExitFlagã®å Žå ã å€ == 0 ïŒ
ç Žã
waveBufferArrayã®waveBufã®å ŽåïŒ
waveInUnprepareHeader ïŒ HandleWaveInãbyref ïŒ waveBuf ïŒ ãsizeof ïŒ waveBuf ïŒ ïŒ
waveInClose ïŒ HandleWaveIn ïŒ
è¡æ«ã®èªåå€æãç¡å¹ã«ããã«ã¯ãã- u ããã©ã¡ãŒã¿ãŒã䜿çšããŠã¹ã¯ãªãããåŒã³åºãå¿ èŠããããŸãã
c:\...\python.exe -u .py > .rnd
çµè«
å€éšä¿¡å·ãªãã§é²é³ããããšãã§ãããç¡é³ãã ãã§ãäžäœãããã¯ã©ã³ãã ãªå€ãååŸããŸãã å€éšä¿¡å·ïŒãœãŒã¹ïŒãªãã§é²é³ãããšããªãŒãã£ãªã«ãŒãã®åè·¯ã«èªç¶ã«ååšãããã€ãºã®ç¹æ§ãåŸãããŸãã å¥ã®ãªãã·ã§ã³ãšããŠãäœããã®ä¿¡å·ãèšé²ãããšãæäžäœãããã®ããžã¿ã«åãšã©ãŒã«ãã€ãºãçŸããå ŽåããããŸãã
åžžã«ããžã¿ã«åãšã©ãŒããããŸãããäžæ¹ã§ãããŒãããã€ãºã¯ãªãŒãã£ãªã«ãŒãã®ç©çããã€ã¹ã«å€§ããäŸåããŠãããäžéšã®ã¢ãã«ã§ã¯è¡šç€ºãããªãå ŽåããããŸãã ããŒãããã€ãºã®åæçµæã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
å®éšçã«åŸãããé²é³ã®ããã®æé©ãªãããµãŒèšå®ïŒé²é³ãã£ã³ãã«ãéžæããŸãïŒåçã§ã¯ãããŸããïŒïŒ Line-In ããã£ã³ãã«ã®é³éãæ倧ã«ããä»ã®ãã£ã³ãã«ããã¹ãŠãªãã«ããŸãã
å€ãã®ãªãŒãã£ãªã«ãŒãããã€ã¯ããã®ä¿¡å·ããæ¹åãããããŸããŸãªããžã¿ã«ãã£ã«ã¿ãŒãé©çšããããšããŠããããããã€ã¯ãã£ãã«ã¯ä¹±æ°ã®å質ãææªã§ãã ãã¹ãããããªãŒãã£ãªã«ãŒãã®1ã€ïŒã€ãŸãRealtek ïŒã§ããã€ã¯ãã£ãã«ã¯ãããã¬ã³ãžã®åä¿¡ã«é©ããªãåºåãçæããŸããã Audigy 2ã§ã¯ ãMic Boost + 20DBAãã€ã¯ã²ã€ã³ããªã³ã«ãããšãã©ã³ãã ãªã³ã³ããŒãã³ããåé€ãããŸããã
ããã€ãã®ããã°ã©ã ã䜿çšããŠãåä¿¡ããä¹±æ°ã®å質ããã¹ãã§ããŸãã æã䜿ããããentïŒ http://www.fourmilab.ch/random/random.zipããããŠã³ããŒãïŒã ã³ã³ãœãŒã«ããå®è¡
> type data.rnd | ent.exe
data.rndãã©ã³ãã ããŒã¿ãå«ããã€ããªãã¡ã€ã«ã§ããå ŽåïŒããã°ã©ã å ã®äœåãªå°å·ãã³ã¡ã³ãã¢ãŠãããããšãå¿ããªãã§ãã ãããçµ±èšãå°ãæãªãå¯èœæ§ããããŸãïŒã ãã¹ãã«æé©ãªãã¡ã€ã«ãµã€ãºã¯çŽã§ãã 500KB ããã°ã©ã ã¯ããã€ãã®ãã©ã¡ãŒã¿ãŒãã«ãŠã³ãããŸãã
- ãšã³ããããŒïŒã©ã³ãã ããŒã¿ã®å ŽåïŒ8-ãã€ãã®ãããæ°ã«ãªããããïŒ
- ç®è¡å¹³åïŒã©ã³ãã ããŒã¿ã®å ŽåïŒ127.5ã«ãªãåŸåããããŸãïŒ
- ã¢ã³ãã«ã«ãPiçªå·ïŒ500kBããŒã¿ã®å Žåã誀差ã¯çŽ0.1ïŒ ã§ãïŒ
- ã«ã€äºä¹ïŒçæ³çã«ã¯10ã90ïŒ ã®ç¯å²ã«ãããŸãïŒ
- ä¿æ°ïŒ0ã«è¿ãã©ã³ãã ããŒã¿ã®å ŽåïŒ
ã©ã³ãã æ§ã®åºæºã¯æ¬è³ªçã«çµ±èšçã§ãããã·ãŒã±ã³ã¹èªäœã§ã¯ãªãããœãŒã¹ã«é©çšãããããšã«æ³šæããŠãã ããã ãããã£ãŠãä¿¡é Œã§ããçµæãåŸãã«ã¯ã1ã€ã®ãœãŒã¹ã®ãµã³ãã«ã«å¯ŸããŠäžé£ã®ãã¹ããå®æœããå¿ èŠããããŸãã ããšãã°ã500KBã®20åã 倧å€æ°ããã¹ãã«åæ Œããå ŽåïŒçŽ90ïŒ ïŒããœãŒã¹ã¯äžå®ã®ç¢ºçã§ã©ã³ãã ã§ãã
æ®å¿µãªãããçµ±èšã«ã¯100ïŒ ã®åºæºã¯ãããŸããã äžå®ã®ç¢ºçã§ããµãŠã³ãã«ãŒãããã®èšäºãçæã§ããŸãïŒå®éããããç§ãåŸãæ¹æ³ã§ã-åè«ã§ãïŒã
ãŸããNISTïŒç±³åœèŠæ ŒåäŒïŒã®ããæŽç·ŽããããœãããŠã§ã¢ããã±ãŒãžã䜿çšããŠãäž¡æ¹ã®ãµãŠã³ãã«ãŒãã®ããŒããåºåã®ã©ã³ãã æ§ããã¹ãããŸããã äž¡æ¹ã®ã«ãŒãã¯è¯è³ªã®ä¹±æ°ã瀺ããŸããã
èå³æ·±ãããšã«ã Realtekã®å èµãªãŒãã£ãªã¯ãæããã«ADCã®å質ãäœããã€ãºãé«ããããååžã®åäžæ§ããããã«åäžããŠããŸãã Audigy 2ã¯Realtekã§ãµããŒããããŠããªã24ãããã¢ãŒãã§ã¯ç«¶åããŸããïŒãããã«ããŠããDirectXãå¿ èŠã§ãããPythonã®DirectXã¯å¥ã®è©±ã§ãïŒã
ä»ã®ãã¹ãããã±ãŒãžãžã®ãªã³ã¯ïŒ
http://stat.fsu.edu/pub/diehard/
http://www.phy.duke.edu/~rgb/General/dieharder.php
http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html
Audigy 2ã©ã€ã³å ¥åããç¡é³ãèšé²ããããšã«ããååŸãããã¡ã€ã«ã§ã®entããã°ã©ã åºåã®äŸïŒ
Entropy = 7.999609 bits per byte.
Optimum compression would reduce the size
of this 500000 byte file by 0 percent.
Chi square distribution for 500000 samples is 270.78, and randomly
would exceed this value 23.75 percent of the times.
Arithmetic mean value of data bytes is 127.5890 (127.5 = random).
Monte Carlo value for Pi is 3.139644559 (error 0.06 percent).
Serial correlation coefficient is 0.001109 (totally uncorrelated = 0.0).