²ò·è¤·¤Æ¤¤¤ë¤ß¤¿¤¤¤Ç¤¹¤¬µ¤¤Ë¤Ê¤Ã¤¿¤Î¤Ç¡¢
>HSP¾å¤Ç²»¼Á¤Ê¤É¤òÀ©¸æ¤¹¤ë¤Î¤ÏÆñ¤·¤¤¤Ç¤·¤ç¤¦¤«¡£win32¡©¤È¤«¤òÄ´¤Ù¤Æ¤¤¤ë¤Î¤Ç¤¹¤¬
HSP¤ÏWindows¤Îdll¤äcom¤ò¸Æ¤Ó½Ð¤»¤Þ¤¹¤Î¤Ç¡¢Windows¤Ç½ÐÍè¤ë¤³¤È¤Ï¤¢¤ëÄøÅÙ½ÐÍè¤ë¤«¤È»×¤¤¤Þ¤¹¡£
»ä¡¢¿®¹æ½èÍý¤ò¼ñÌ£¤ÇĹǯ¤ä¤Ã¤Æ¤¤¤ë¤Î¤Ç¤¹¤¬¡¢HSP¤È¤¤¤¦¤è¤êEQ,COMP,REVERB¤Ê¤É¤Î¿®¹æ½èÍý¤òÍý²ò¤¹¤ëÊý¤¬Éߵ郎¹â¤¤¤«¤â¤Ç¤¹¤Í¡£
GENKI¤µ¤ó¤¬Ä¶ÊØÍø¤ÊRIFF¥Õ¥©¡¼¥Þ¥Ã¥È(wav)ÆÉ¤ß¹þ¤à¥â¥¸¥å¡¼¥ë¾Ò²ð¤µ¤ì¤Æ¤Þ¤¹¤Î¤Ç¡¢
¤Þ¤º¡¢Raw¥Ç¡¼¥¿¤ò¤½¤ì¤Ç¿®¹æ½èÍý¤·¤ÆÇÈ·ÁÉÁ²è¤Ê¤É¤·¤Æ¤ß¤Æ¡¢
¤½¤ì¤¬½ÐÍ褿¤éºÆÀ¸¤ÏHSP¤«¤éwinmm.asÆÉ¤ß¹þ¤ó¤ÇwaveOutOpen´Ø¿ô¤òÄ´¤Ù¤Æ¤ß¤Æ¤½¤Î¥Ç¡¼¥¿¤òºÆÀ¸¤¬¤ÈÎɤ¤¤È»×¤¤¤Þ¤¹¡£
HSP¤Ë¸Â¤Ã¤¿»ö¤Ç¤Ï¤Ê¤¯¡¢Â¾¤Î¸À¸ì¤Ç¤â¥í¡¼¥ì¥Ù¥ë¤Ê»ö¤ò¤·¤¿¤¤¤È»×¤¦¤È¡¢¥³¥¢¤ÊÉôʬ¤ò¥×¥í¥°¥é¥à¤·¤Æ¤¤¤¯É¬Íפ¬½Ð¤Æ¤¤Þ¤¹¡£
¤â¤·¡¢¤µ¤Ã¤¯¤ê¹Ô¤¤¤¿¤¤¤Ê¤é¡¢Ã¯¤«¤¬¥Õ¥ê¡¼¤ÇÇÛÉÛ¤·¤Æ¤¤¤ë¼«Ê¬¤¬¤ä¤ê¤¿¤¤¤³¤È¤Ë¶á¤¤¥é¥¤¥Ö¥é¥êdll¤òõ¤¹¤Î¤â¼ê¤«¤È»×¤¤¤Þ¤¹¡£
¡Ê¤Ê¤«¤Ê¤«¼«Ê¬¤ËÅÔ¹ç¤ÎÎɤ¤¥é¥¤¥Ö¥é¥ê¤¬Ìµ¤¤¤Î¤Ç·ë¶Éºî¤ë¤Ï¤á¤Ë¤Ê¤ë¤Î¤Ç¤¹¤¬¡¢¤½¤ì¤¬³Ú¤·¤«¤Ã¤¿¤ê¤â¤¹¤ë¤Î¤Ç¡£¡Ë
¤Ç¤¹¤«¤é¡¢HSP¤Ç¤ÏÆñ¤·¤¤¤È¤¤¤¦¤è¤ê¡¢¥ª¡¼¥Ç¥£¥ª¤Î¿®¹æ½èÍý¤¬ÀìÌçŪ¤Ê¤Î¤Ç³Ø½¬¥³¥¹¥È¤¬¹â¤¤¤«¤â¤Ç¤¹¡£
>¥µ¥¦¥ó¥É¥Ç¥Ð¥¤¥¹¤Î¥Þ¥¹¥¿¡¼²»Î̤¬¥ì¥Ù¥ë¥á¡¼¥¿¡¼¤Î¤è¤¦¤Ëư¤¤¤Æ¤¤¤Þ¤¹¤¬
>¥ì¥Ù¥ë¥á¡¼¥¿¡¼¤ÎºÇÂçÃͤΥꥢ¥ë¥¿¥¤¥à¼èÆÀ¤ÈHSP¾å¤Ç²»ÎÌÀ©¸æ¤¬¤Ç¤¤ì¤Ð¡¦¡¦¡¦¡£
¥µ¥¦¥ó¥É¥Ç¥Ð¥¤¥¹¤ÏWindow¤ÎAPI¤ò»È¤Ã¤Æ¤¤¤ë¤ï¤±¤Ç¤¹¤«¤é¡¢HSP¤Ç½ÐÍè¤Ê¤¯¤Ï¤Ê¤¤¤È»×¤¤¤Þ¤¹¡£
win32¤¬Íý²ò¤Ç¤¤Ê¤¤¤È¾¯¤·Æñ¤·¤¤¤«¤â¤·¤ì¤Þ¤»¤ó¤¬¡¢°ìÎã¤È¤·¤ÆCOMµ¡Ç½¤Çcoreaudio¤ò»È¤¦¤È¤Ç¤¤Þ¤¹¡£
¼Â¹Ô¤·¤Æ¡¢¥Ç¥Ð¥¤¥¹¤Î¥Þ¥¹¥¿¡¼¥ß¥¥µ¡¼¤Î¥á¡¼¥¿¡¼¤È²»ÎÌ¿¨¤Ã¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¤Þ¤»¡£HSP¤Î²èÌ̤¬Ï¢Æ°¤·¤Þ¤¹¡£
¤Þ¤¿¡¢¥³¥á¥ó¥È³°¤¹¤È¡¢¥Ô¡¼¥¯¤ò¤ß¤Æ¤Ç¤¤ë¸Â¤ê0.5(-6dBfs)¤Î½ÐÎϤˤʤë¤è¤¦¥Þ¥¹¥¿¡¼¤Î²»Î̤¬Æ°¤¤Þ¤¹¡£
¢¨¸Ä¿ÍŪ¤Ë¤Ï¥Þ¥¹¥¿¡¼¤òưŪ¤Ë¿¨¤ë¤Î¤Ï¡¢¤â¤·²»À¼¥Ä¡¼¥ë¤òºî¤é¤ì¤¿¤¤¤Ê¤é¸Ä¿Í´Ä¶¤Ë¤è¤ê¡Ê¥¢¥ó¥×Åù¡Ë
¡¡»ö¸Î¤¬¤¢¤ë¤Î¤Ç¤¢¤Þ¤ê¤ª´«¤á¤·¤Ê¤¤¤Ç¤¹¡£
¡¡¥²¡¼¥à¤Ç¤¢¤ì¤Ð¥ª¡¼¥µ¥ê¥ó¥°¤ÎÃʳ¬¤Ç²»Î̤ò·¤¨¤¿¤éÎɤ¤¤È»×¤¤¤Þ¤¹¡£
¡¡¤Þ¤¿¡¢µ¡³£Åª¤Ë²»Î̤ò¤½¤í¤¨¤ë¤³¤È¤Ï¼þÇÈ¿ôÂӤˤè¤Ã¤ÆÄ°´¶¤¬ÊѤï¤ê¤Þ¤¹¤·²»¤Ï»þ´Ö¤Î·Ý½Ñ¤Ç¤¹¤«¤é¤Ê¤«¤Ê¤«Æñ¤·¤¤¤Ç¤¹¡£
¡¡
#module
; sprocket¤µ¤ó¤Î¥â¥¸¥å¡¼¥ë
#defcfunc tofloat double p1
temp = p1
return lpeek(temp) >> 29 & 7 | (p1 < 0) << 31 |lpeek(temp, 4) - (p1 ! 0) * 0x38000000 << 3
#defcfunc todouble int p1
temp = 0.0
lpoke temp, 4, (p1 & 0x80000000) | (((p1 & 0x7fffffff) >> 3) + ((p1 & 0x7fffffff) ! 0) * 0x38000000)
lpoke temp, 0, p1 << 29
return temp
#global
;»²¹Í¡§https://docs.microsoft.com/en-us/windows/win32/api/_coreaudio/
#define CLSID_IMMDeviceEnumerator "{BCDE0395-E52F-467C-8E3D-C4579291692E}"
#define IID_IMMDeviceEnumerator "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
#define IID_IMMDevice "{D666063F-1587-4E43-81F1-B948E807363F}"
#define IID_IAudioEndpointVolume "{5CDF2C82-841E-4546-9722-0CF74078229A}"
#define IID_IAudioMeterInformation "{C02216F6-8C67-4B5B-9D00-D008E73E0064}"
#usecom IMMDeviceEnumerator IID_IMMDeviceEnumerator CLSID_IMMDeviceEnumerator
#comfunc IMMDeviceEnumerator_GetDefaultAudioEndpoint 4 int,int,var
#usecom IMMDevice IID_IMMDevice CLSID_IMMDeviceEnumerator
#comfunc IMMDevice_Activate 3 var,int,int,var
#usecom IAudioEndpointVolume IID_IAudioEndpointVolume CLSID_IMMDeviceEnumerator
#comfunc IAudioEndpointVolume_SetMasterVolumeLevel 6 int,int
#comfunc IAudioEndpointVolume_SetMasterVolumeLevelScalar 7 int,int
#comfunc IAudioEndpointVolume_GetMasterVolumeLevel 8 var
#comfunc IAudioEndpointVolume_GetMasterVolumeLevelScalar 9 var
#usecom IAudioMeterInformation IID_IAudioMeterInformation CLSID_IMMDeviceEnumerator
#comfunc IAudioMeterInformation_GetPeakValue 3 var
newcom devEnum, IMMDeviceEnumerator
IMMDeviceEnumerator_GetDefaultAudioEndpoint devEnum, 0, 0, p
newcom dev, IMMDevice, -1, p
iid = 0xC02216F6, 0x4B5B8C67, 0x08D0009D, 0x64003EE7
IMMDevice_Activate dev, iid, 1, 0, p
newcom ami,IAudioMeterInformation,-1,p
newcom aev, IAudioEndpointVolume, -1, p
;threshold = 0.5 : attackTime = 0.05 : autogain = 0.0
*MAIN
IAudioMeterInformation_GetPeakValue ami, res : peak = todouble(res)
IAudioEndpointVolume_GetMasterVolumeLevelScalar aev, res : vol = todouble(res)
IAudioEndpointVolume_GetMasterVolumeLevel aev, res : voldb = todouble(res)
;autogain = limitf( autogain+((threshold-peak*vol)*attackTime), 0.0, 1.0)
;IAudioEndpointVolume_SetMasterVolumeLevelScalar aev, tofloat(autogain), 0
rgbcolor $C0C0C0 : boxf 0, ginfo_winy - double(ginfo_winy)*peak, 32, ginfo_winy
rgbcolor $00FF00 : boxf 0, ginfo_winy - double(ginfo_winy)*peak*vol, 32, ginfo_winy
rgbcolor $0000FF : p = ginfo_winy - vol*ginfo_winy: line 0, p, 32, p
color : pos 0,0 : mes strf("peak:%f(%f) vol:%f(%fdB)",peak, peak*vol, vol, voldb)
redraw 1 : await 16 : redraw 0 : rgbcolor $FFFFFF : boxf
goto *MAIN