JAVAã®ãµãŠã³ããããŒã1ãå§ãŸãã é³ã鳎ãã
ããã¯ãJava Sound APIã«å®å šã«æ £ãã8ã€ã®ã¬ãã¹ã³ã®ã·ãªãŒãºã®æåã®ã¬ãã¹ã³ã§ãã
人éã®ç¥èŠã«ãããé³ãšã¯äœã§ããïŒ ããã¯ãæ°å§ã®å€åãè³ã®äžã®å°ããªæèŠé åã«äŒãããšãã«æããæèŠã§ãã
ãŸããSound APIãäœæããäž»ãªç®çã¯ãé©åãªã¿ã€ãã³ã°ã§é©åãªè¢«éšè ã®è³ã«å§åæ³¢ãäŒéããã®ã«åœ¹ç«ã€ã³ãŒããèšè¿°ããæ段ãæäŸããããšã§ãã
Javaã®ãµãŠã³ãã®çš®é¡ïŒ
- Java Sound APIã¯ãäž»ã«2ã€ã®ã¿ã€ãã®ãªãŒãã£ãªïŒãµãŠã³ãïŒããµããŒãããŠããŸãã
- ããžã¿ã«åããããã¡ã€ã«ãšããŠçŽæ¥é²é³ããããµãŠã³ã
- MIDIãã¡ã€ã«ãšããŠèšé²ããŸãã éåžžã«é¢ããŠããŸããã楜åšãåžæã®é åºã§æŒå¥ããã楜èã«äŒŒãŠããŸãã
ãããã®ã¿ã€ãã¯æ¬è³ªçã«ããªãç°ãªããŸããã»ãšãã©ã®å Žåãå€éšãœãŒã¹ãããã¡ã€ã«ã«é²é³ããããã«ããžã¿ã«åããå¿ èŠããããµãŠã³ãããŸãã¯ãã®ãããªãã¡ã€ã«ãã以åã«é²é³ããããµãŠã³ããåçããããã«ããžã¿ã«åããå¿ èŠããããµãŠã³ããæ±ã£ãŠãããããæåã«éäžããŸãã
ãã¬ãã¥ãŒ
Java Sound APIã¯ã ã©ã€ã³ãšãããµãŒã®æŠå¿µã«åºã¥ããŠããŸãã
次ïŒ
ãªãŒãã£ãªãããµãŒã«é©çšãããé³ã®ã¢ããã°è¡šçŸã®ç©ççããã³é»æ°çç¹æ§ã«ã€ããŠèª¬æããŸã ã
æåã®ããã¯ãã³ãã®ã·ããªãªã«æ»ããŸãããã®å Žåã6ã€ã®ãã€ã¯ãš2ã€ã®ã¹ãã¬ãªã¹ããŒã«ãŒã䜿çšããŸãã ããã¯ããªãŒãã£ãªãããµãŒã®åäœãç解ããããã«å¿ èŠã§ãã
次ã«ãã©ã€ã³ããããµãŒããªãŒãã£ãªããŒã¿ã®ãã©ãŒããããªã©ãJava Soundããã°ã©ãã³ã°ã®ãããã¯ãããã€ãèŠãŠãããŸãã
SourceDataLineãClipãMixerãAudioFormatã®åãªããžã§ã¯ãéã«ååšããé¢ä¿ãç解ãââããªãŒãã£ãªãåçããç°¡åãªããã°ã©ã ãäœæããŸãã
以äžã«ãé²é³ããé³ãé²é³ããŠåçããããã«äœ¿çšã§ãããã®ããã°ã©ã ã®äŸã瀺ããŸãã
å°æ¥ããã®ç®çã§äœ¿çšãããããã°ã©ã ã³ãŒãã®å®å šãªèª¬æãæäŸããŸãã ãããããã®ã¬ãã¹ã³ã§ã¯æ±ºããŠå®å šã§ã¯ãããŸããã
ã³ãŒãäŸãšèæ ®äºé
ã¢ããã°ãµãŠã³ãã®ç©ççããã³é»æ°çç¹æ§
ãã®ã¬ãã¹ã³ã®ç®çã¯ãJava Sound APIã䜿çšããJavaããã°ã©ãã³ã°ã®åºæ¬ã玹ä»ããããšã§ãã
Java Sound APIã¯ããªãŒãã£ãªãããµãŒã®æŠå¿µã«åºã¥ããŠããŸããããã¯ãããã¯ã³ã³ãµãŒãããèªå® ã§ã®CDã®åçãŸã§ãã»ãšãã©ã©ãã§ããµãŠã³ããåçãããšãã«äžè¬çã«äœ¿çšãããããã€ã¹ã§ãã ãããããªãŒãã£ãªãããµãŒã®åäœã®è©³çŽ°ãªèª¬æã«çæããåã«ãã¢ããã°ãµãŠã³ãèªäœã®ç©ççããã³é»æ°çç¹æ§ãç解ããŠãããšåœ¹ç«ã¡ãŸãã
å³ãèŠãŠãã ããã 1

Vasya Pupyrkinã¯ã¹ããŒããæŒããŸãã
ãã®å³ã¯ãVasyaãåºåã¢ãã¬ã¹ã·ã¹ãã ãšåŒã°ããã·ã¹ãã ã䜿çšããŠã¹ããŒããè¡ã£ãŠããæ§åã瀺ããŠããŸãã ãã®ãããªã·ã¹ãã ã¯éåžžããã€ã¯ãã¢ã³ããã¹ããŒã«ãŒã§æ§æãããŸãã ãã®ã·ã¹ãã ã®ç®çã¯ãVasyaã®å£°ã匷åããŠã倧å¢ã®äººã§ãèãããããã«ããããšã§ãã
ããã€ã
æçã«èšãã°ãVasyaã話ããšã声垯ã空æ°ç²åãåé ã§æ¯åãããŸãã ããã«ããé³æ³¢ãçºçããããããã€ã¯ã¡ã³ãã¬ã³ãæ¯åãããVasyaã®ãªãªãžãã«ã®é³ã®æ¯åãæ£ç¢ºã«ã·ãã¥ã¬ãŒãããéåžžã«å°ããªæ¯å¹ ã®é»æ°æ¯åã«å€ããŸãã ã¢ã³ãã¯ããã®ååã瀺ãããã«ããããã®é»æ°æ¯åãå¢å¹ ããŸãã ãã®åŸãã¹ããŒã«ãŒã«å°éããŸããã¹ããŒã«ãŒã¯ãå¢å¹ ãããé»æ°æ¯åãéåžžã«å¢å¹ ãããé³æ³¢ã«éå€æããŸãããVasya Pupyrkinã®å£°åž¯ã§çæãããåãæ³¢ãæ£ç¢ºã«ç¹°ãè¿ããŸãã
ãã€ãããã¯ãã€ã¯
ããã§ã¯ãå³ãèŠãŠã¿ãŸãããã å³2ã¯ããã€ãããã¯ãšåŒã°ãããã€ã¯ããã€ã¹ã®æŠç¥å³ã§ãã

å³ 2ãã€ãããã¯ãã€ã¯åè·¯
é³ã®æ¯åã¯èã«åœ±é¿ããŸã
é³ã®æ¯åã®å§åã¯ããã€ã¯å éšã®æè»ãªèã«äœçšããŸãã ããã«ããèãæ¯åããèã®æ¯åãé³æ³¢ã®æ¯åãç¹°ãè¿ããŸãã
å¯åã³ã€ã«
现ãã¯ã€ã€ãŒã®ã³ã€ã«ããã€ã¯ã®ã¡ã³ãã¬ã³ã«åãä»ããããŠããŸãã èãæ¯åãããšãã³ã€ã«ã¯åŒ·åãªæ°žä¹ ç£ç³ã§äœãããã³ã¢ã®ç£å Žå ã§åŸåŸ©éåãããŸãã ãããŠãã¡ã©ããŒã確ç«ããããã«ãã³ã€ã«ã«é»æµãçºçããŸãã
é»æ°ä¿¡å·ã¯é³æ³¢ã®åœ¢ã«åŸããŸãã
ãããã£ãŠãã³ã€ã«ã«èªå°ãããéåžžã«åŒ±ãé»æµããã亀äºã®é»æ°ä¿¡å·ãåŸããããã€ã¯ããã³ã®èã«äœçšããé³æ³¢ã®åœ¢ãç¹°ãè¿ããŸãã ããã«ã亀æµé»å§ã®åœ¢ã®ãã®ä¿¡å·ã¯ãå³1ã®å¢å¹ åšã®å ¥åã«äŸçµŠãããŸãã 1ã
æ¡å£°åš
å®éãã¹ããŒã«ãŒã®åäœåçã¯ãã€ãããã¯ãã€ã¯ã®ããã€ã¹ãç¹°ãè¿ããå察æ¹åã§ã®ã¿ãªã³ã«ãªããŸãã ïŒåœç¶ããã®å Žåãå·»ç·ã¯ã¯ããã«å€ªããèã¯å¢å¹ ãããä¿¡å·ã§ã®åäœãä¿èšŒããããã«ã¯ããã«å€§ãããªããŸãïŒ

ã©ãŠãã¹ããŒã«ãŒèã®æ¯åã¯ç©ºæ°ç²åã«åœ±é¿ãäžãã匷åãªé³æ³¢ãäœæããŸãã ãããã®æ³¢ã®åœ¢ç¶ã¯ãVasyaã®å£°åž¯ã«ãã£ãŠäœæãããã¯ããã«äœã匷床ã®é³æ³¢ã®åœ¢ç¶ãæ£ç¢ºã«ç¹°ãè¿ããŸãã ããããæ°ããæ³¢ã®åŒ·ãã¯ãVasyaããã®é³ã®æ¯åã倧å¢ã®äººã®åŸãã®åã«ããç«ã£ãŠãã人ã ã®è³ã«å±ãããã«ããã®ã«ååã§ãã
ããã¯ã³ã³ãµãŒã
ãã®æãŸã§ã«ãããªãã¯ããããã¹ãŠJava Sound APIãšäœã®é¢ä¿ãããã®ãââãšçåã«æããããããŸããã ããããããå°ãåŸ ã£ãŠãã ããããªãŒãã£ãªãããµãŒã®åºæ¬çãªä»çµã¿ã玹ä»ããŠããŸãã
äžèšã®åè·¯ã¯éåžžã«ã·ã³ãã«ã§ããã Vasya Pupyrkinã1ã€ã®ãã€ã¯ãã¢ã³ããã¹ããŒã«ãŒã§æ§æãããŠããŸããã 次ã«ãå³2ã®åè·¯ãèããŸãã 4ãæåã®é³æ¥œã°ã«ãŒãã®ããã¯ã³ã³ãµãŒãã®ããã«æºåãããã¹ããŒãžãæ瀺ããŸãã

6ã€ã®ãã€ã¯ãš2ã€ã®ã¹ããŒã«ãŒ
å³ 4ã€ã®6ã€ã®ãã€ã¯ãã¹ããŒãžäžã«ãããŸãã ã¹ããŒãžã®äž¡åŽã«2ã€ã®ã¹ããŒã«ãŒïŒã¹ããŒã«ãŒïŒããããŸãã ã³ã³ãµãŒããå§ãŸããšãæŒå¥è ã¯6ã€ã®ãã€ã¯ã®ããããã§æã£ãããé³æ¥œãæŒå¥ãããããŸãã ãããã£ãŠã6ã€ã®é»æ°ä¿¡å·ããããããããåå¥ã«å¢å¹ ããŠããäž¡æ¹ã®ã¹ããŒã«ãŒã«äŸçµŠããå¿ èŠããããŸãã ããã«å ããŠãæŒå¥è ã¯ããŸããŸãªãµãŠã³ãç¹æ®å¹æãããšãã°ãªããŒãã䜿çšã§ããŸãããªããŒãã¯ãã¹ããŒã«ãŒã«é©çšããåã«é»æ°ä¿¡å·ã«å€æããå¿ èŠããããŸãã
ã¹ããŒãžã®äž¡åŽã«ãã2ã€ã®ã¹ããŒã«ãŒã¯ãã¹ãã¬ãªãµãŠã³ãã®å¹æãäœãåºãããã«èšèšãããŠããŸãã ã€ãŸããå³åŽã®ã¹ããŒãžã«ãããã€ã¯ããã®é»æ°ä¿¡å·ã¯ãå³åŽã«ãããã¹ããŒã«ãŒã«èœã¡ãŸãã åæ§ã«ãå·ŠåŽã®ãã€ã¯ããã®ä¿¡å·ã¯ãã·ãŒã³ã®å·ŠåŽã«ããã¹ããŒã«ãŒã«éãå¿ èŠããããŸãã ãã ããã¹ããŒãžã®äžå€®è¿ãã«ããä»ã®ãã€ã¯ããã®é»æ°ä¿¡å·ã¯ãé©åãªæ¯çã§äž¡æ¹ã®ã¹ããŒã«ãŒã«æ¢ã«éä¿¡ãããŠããã¯ãã§ãã ãŸããäžå€®ã®2ã€ã®ãã€ã¯ã¯ãäž¡æ¹ã®ã¹ããŒã«ãŒã«åçã«ä¿¡å·ãéä¿¡ããå¿ èŠããããŸãã
ãªãŒãã£ãªãããµãŒ
äžèšã®ã¿ã¹ã¯ã¯ããªãŒãã£ãªãããµãŒãšåŒã°ããé»åããã€ã¹ã«ãã£ãŠå®è¡ãããŸãã
é³å£°åç·ïŒãã£ã³ãã«ïŒ
èè ã¯ãªãŒãã£ãªãããµãŒã®å°é家ã§ã¯ãããŸãããã圌ã®è¬èãªç解ã§ã¯ãå žåçãªãªãŒãã£ãªãããµãŒã¯ãããããã®å ã®ãªãŒãã£ãªä¿¡å·ãŸãã¯ã©ã€ã³ïŒãã£ãã«ïŒãè¡šãäºãã«ç¬ç«ããé»æ°ä¿¡å·ãäžå®æ°åä¿¡ããèœåãæã£ãŠããŸãã
ïŒãªãŒãã£ãªãã£ãã«ã®æŠå¿µã¯ãJava Sound APIã詳现ã«ç解ãå§ãããšéåžžã«éèŠã«ãªããŸãã
åãªãŒãã£ãªãã£ã³ãã«ã®ç¬ç«ããåŠç
ãããã«ãããæšæºã®ãªãŒãã£ãªãããµãŒã«ã¯ãä»ã®ãã£ã³ãã«ãšã¯ç¬ç«ããŠåãªãŒãã£ãªã©ã€ã³ãå¢å¹ ããæ©èœããããŸãã ãŸãããããµãŒã«ã¯éåžžãããšãã°ãªãŒãã£ãªã©ã€ã³ã®ãªããŒããªã©ããµãŠã³ãã®ç¹æ®å¹æãã¹ãŒããŒã€ã³ããŒãºããæ©èœããããŸãã æçµçã«ããããµãŒã¯ããã®ååã瀺ãããã«ãåºåãã£ã³ãã«ãžã®åãªãŒãã£ãªã©ã€ã³ã®å¯äžãå¶åŸ¡ããããã«ãèšå®ãããåºåãã£ã³ãã«ã®åã ã®é»æ°ä¿¡å·ããã¹ãŠããã¯ã¹ã§ããŸãïŒãã®ã³ã³ãããŒã«ã¯éåžžããã³ãŸãã¯ãã³ãšåŒã°ããŸã-空éã§ã®ååžïŒã
ã¹ãã¬ãªãµãŠã³ãã«æ»ã
ãããã£ãŠãå³ 4ããªãŒãã£ãªãããµãŒã®ãµãŠã³ããšã³ãžãã¢ã¯ã6ã€ã®ãã€ã¯ããã®ä¿¡å·ãçµåããŠããããããã¹ããŒã«ãŒã«éä¿¡ããã2ã€ã®åºåä¿¡å·ãååŸããããšãã§ããŸãã
æäœãæ£åžžã«è¡ãã«ã¯ãã¹ããŒãžäžã®ãã€ã¯ã®ç©ççãªäœçœ®ã«å¿ããŠãåãã€ã¯ããã®ä¿¡å·ãé©åãªå²åã§äŸçµŠããå¿ èŠããããŸãã ïŒãã³ãã³ã°ãå€æŽããããšã«ãããè³æ Œã®ãããµãŠã³ããšã³ãžãã¢ã¯ãå¿ èŠã«å¿ããŠãããšãã°ã³ã³ãµãŒãäžã«ãªãŒãããŒã«ãªã¹ããã¹ããŒãžå ã移åããå Žåã«ãåãã€ã¯ã®å¯äžãå€æŽã§ããŸãïŒã
ããã°ã©ãã³ã°ã®äžçã«æ»ãæé
ç©ççãªäžçããããã°ã©ãã³ã°ã®äžçã«æ»ããŸãããã Sunã«ãããšã ãJava Soundã«ã¯ç¹å¥ãªããŒããŠã§ã¢æ§æã¯å«ãŸããŠããŸããã ããŸããŸãªãªãŒãã£ãªã³ã³ããŒãã³ããã·ã¹ãã ã«ã€ã³ã¹ããŒã«ããAPIãä»ããŠãŠãŒã¶ãŒãå©çšã§ããããã«èšèšãããŠããŸãã Java Soundã¯ããµãŠã³ãã«ãŒãããã®æšæºã®å ¥åããã³åºåæ©èœïŒããšãã°ããªãŒãã£ãªãã¡ã€ã«ã®èšé²ãšåçïŒãããã³è€æ°ã®ãªãŒãã£ãªã¹ããªãŒã ãããã¯ã¹ããæ©èœããµããŒãããŠããŸãã
ãããµãŒãšãã£ã³ãã«
æ¢ã«è¿°ã¹ãããã«ãJava Sound APIã¯ãããµãŒãšãã£ã³ãã«ã®æŠå¿µã«åºã¥ããŠæ§ç¯ãããŠããŸãã ç©ççãªäžçããããã°ã©ãã³ã°ã®äžçã«ç§»è¡ããå ŽåãSunã¯ãããµãŒã«é¢ããŠæ¬¡ã®ããã«èšè¿°ããŸãã
ããããµãŒãšã¯ã1ã€ä»¥äžã®ãã£ã³ãã«ãæã€ãªãŒãã£ãªããã€ã¹ã§ãã ãããããªãŒãã£ãªä¿¡å·ãå®éã«ããã·ã³ã°ãããããµãŒã«ã¯ããœãŒã¹ãœãŒã¹ã®è€æ°ã®å ¥åãã£ãã«ãšãå°ãªããšã1ã€ã®åºåã¿ãŒã²ãããã£ãã«ãå¿ èŠã§ãã
å ¥åè¡ã¯SourceDataLineãªããžã§ã¯ããæã€ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«ã§ããåºåè¡ã¯TargetDataLineãªããžã§ã¯ãã«ã§ããŸãã ãããµãŒã¯ãäºåã«é²é³ããã«ãŒãããããµãŠã³ããå ¥åãšããŠåãåãããã®å ¥åãœãŒã¹ãã£ã³ãã«ãClipã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã¯ã©ã¹ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãšããŠå®çŸ©ããããšãã§ããŸãã
ãã£ãã«åç·ã€ã³ã¿ãŒãã§ãŒã¹ã
Sunã¯ãLineã€ã³ã¿ãŒãã§ãŒã¹ãã次ã®ããšãå ±åããŸããã Lineã¯ãå ¥åãŸãã¯åºåãªãŒãã£ãªããŒãããããµãŒããŸãã¯ãããµãŒãšã®éã®ãªãŒãã£ãªãã¹ãªã©ã®ããžã¿ã«ãªãŒãã£ãªãã€ãã©ã€ã³ã®èŠçŽ ã§ãã ãã£ã³ãã«ãééããé³å£°ããŒã¿ã¯ãã¢ããŸãã¯ãã«ããã£ã³ãã«ïŒã¹ãã¬ãªãªã©ïŒã§ãã ...ãã£ã³ãã«ã«ã¯ãã²ã€ã³ããã³ããªããŒããªã©ã®ã³ã³ãããŒã«ãèšå®ã§ããŸãã
çšèªããŸãšãã
ãããã£ãŠãäžèšã®Sunããã®åŒçšã¯ã次ã®çšèªãæå³ããŠããŸãã
ãœãŒã¹ããŒã¿ã©ã€ã³
ã¿ãŒã²ããã²ã¿ã¿ãªã³
枯
ã¯ãªãã
ã³ã³ãããŒã«
å³ å³5ã¯ããããã®çšèªã䜿çšããŠç°¡åãªãªãŒãã£ãªåºåããã°ã©ã ãäœæããäŸã瀺ããŠããŸãã

ããã°ã©ã ã¹ã¯ãªãã
ãœãããŠã§ã¢ã®èŠ³ç¹ãã å³5ã¯ã1ã€ã®Clipãªããžã§ã¯ããš2ã€ã®SourceDataLineãªããžã§ã¯ãã§ååŸããMixerãªããžã§ã¯ãã瀺ããŠããŸãã
ã¯ãªãããšã¯
ã¯ãªããã¯ããããµãŒã®å ¥åã«ãããªããžã§ã¯ãã§ããããã®å 容ã¯æéãšãšãã«å€åããŸããã ã€ãŸãããªãŒãã£ãªããŒã¿ãåçããåã«Clipãªããžã§ã¯ãã«ããŒãããŸãã Clipãªããžã§ã¯ãã®ãªãŒãã£ãªã³ã³ãã³ãã¯1å以äžåçã§ããŸãã ã¯ãªãããã«ãŒãããã¯ãããšãã³ã³ãã³ããäœåºŠãåçãããŸãã
å ¥åã¹ããªãŒã
äžæ¹ãSourceDataLineãªããžã§ã¯ãã¯ããããµãŒã®å ¥åã«ããã¹ããªãŒã ãªããžã§ã¯ãã§ãã ãã®ã¿ã€ãã®ãªããžã§ã¯ãã¯ããªãŒãã£ãªããŒã¿ã®ã¹ããªãŒã ãåä¿¡ãããªã¢ã«ã¿ã€ã ã§ãããµãŒã«éä¿¡ã§ããŸãã å¿ èŠãªãªãŒãã£ãªããŒã¿ã¯ããªãŒãã£ãªãã¡ã€ã«ããããã¯ãŒã¯æ¥ç¶ãã¡ã¢ãªãããã¡ãªã©ãããŸããŸãªãœãŒã¹ããååŸã§ããŸãã
ããŸããŸãªã¿ã€ãã®ãã£ãã«
ãããã£ãŠãClipããã³SourceDataLineãªããžã§ã¯ãã¯ãMixerãªããžã§ã¯ãã®å ¥åãã£ãã«ãšèŠãªãããšãã§ããŸãã ãããã®åå ¥åãã£ã³ãã«ã«ã¯ããã³ãã²ã€ã³ããªããŒããšããç¬èªã®ãã£ã³ãã«ãèšå®ã§ããŸãã
ãªãŒãã£ãªã³ã³ãã³ããåçãã
ãã®ãããªåçŽãªã·ã¹ãã ã§ã¯ãMixerã¯å ¥åã©ã€ã³ããããŒã¿ãèªã¿åããã³ã³ãããŒã«ã䜿çšããŠå ¥åä¿¡å·ãããã·ã³ã°ããã¹ããŒã«ãŒãã©ã€ã³åºåãããããã©ã³ãžã£ãã¯ãªã©ã®1ã€ä»¥äžã®åºåãã£ã³ãã«ã«åºåãæäŸããŸãã
ãªã¹ã11ã¯ããã€ã¯ããŒããããªãŒãã£ãªããŒã¿ããã£ããã£ãããã®ããŒã¿ãã¡ã¢ãªã«ä¿åããã¹ããŒã«ãŒããŒãããåçããåçŽãªããã°ã©ã ã瀺ããŠããŸãã
ãã£ããã£ãšåçã®ã¿ã説æããŸãã äžèšã®ããã°ã©ã ã®ã»ãšãã©ã¯ããŠãŒã¶ãŒçšã®ãŠã£ã³ããŠãšã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŠãèšé²ãšåçãå¶åŸ¡ã§ããããã«ããããšã§ãã ãã®éšåã«ã€ããŠã¯ãç®æšãè¶ ãããã®ãšããŠèª¬æããŸããã ãããããã®åŸãããŒã¿ã®ãã£ããã£ãšåçãæ€èšããŸãã ãã®ã¬ãã¹ã³ã§è² ããè°è«ãã次ã®ãã£ããã£ãè¡ããŸãã éäžã§ãJava Sound APIã§ã®ãªãŒãã£ãªãã£ãã«ã®äœ¿çšã«ã€ããŠèª¬æããŸãã
ãã£ããã£ãããããŒã¿ã¯ãByteArrayOutputStreamãªããžã§ã¯ãã«ä¿åãããŸãã
ã³ãŒãã¹ããããã³ãŒãã¹ããããã¯ããã€ã¯ãããªãŒãã£ãªããŒã¿ãèªã¿åããByteArrayOutputStreamãªããžã§ã¯ããšããŠä¿åããŸãã
ãªã¹ã1ã§å§ãŸãplayAudioãšããã¡ãœããã¯ããã£ããã£ãããŠByteArrayOutputStreamãªããžã§ã¯ãã«ä¿åããããªãŒãã£ãªããŒã¿ãåçããŸãã
private void playAudio() { try{ byte audioData[] = byteArrayOutputStream. toByteArray(); InputStream byteArrayInputStream = new ByteArrayInputStream( audioData);
ãªã¹ã1
æšæºã³ãŒãããå§ããŸãã
ãªã¹ã1ã®ããã°ã©ã ã®ã¹ããããã¯ãå®éã«ã¯ãŸã Java Soundã«é¢é£ããŠããŸããã
ãã®ç®çã¯æ¬¡ã®ãšããã§ãã
- 以åã«ä¿åããããŒã¿ããã€ãåã®é åã«å€æããŸãã
- ãã€ãããŒã¿é åã®å ¥åã¹ããªãŒã ãååŸããŸãã
ããã¯ãåŸã§åçããããã«é³å£°ããŒã¿ãå©çšå¯èœã«ããããã«å¿ èŠã§ãã
Sound APIã«ç§»åãã
ãªã¹ã2ã®ã³ãŒãè¡ã¯ããã§ã«Java Sound APIã«é¢é£ããŠããŸãã
AudioFormat audioFormat = getAudioFormat();
ãªã¹ã2
ããã§ã¯ããã®ãããã¯ã«ã€ããŠç°¡åã«è§ŠããŸããããã«ã€ããŠã¯ã次ã®ã¬ãã¹ã³ã§è©³ãã説æããŸãã
2ã€ã®ç¬ç«ãã圢åŒ
ã»ãšãã©ã®å ŽåããªãŒãã£ãªããŒã¿ã®2ã€ã®ç¬ç«ãã圢åŒãæ±ã£ãŠããŸãã
ãªãŒãã£ãªããŒã¿ãå«ããã¡ã€ã«åœ¢åŒïŒä»»æïŒïŒããŒã¿ã¯ã¡ã¢ãªã«æ ŒçŽããããããããã°ã©ã ã§ã¯ãŸã äœæãããŠããŸããïŒ
æåºãããé³å£°ããŒã¿ã®åœ¢åŒã¯ãããèªäœã§ãã
ãªãŒãã£ãªåœ¢åŒãšã¯äœã§ããïŒ
Sunãããã«ã€ããŠæžããŠããããšã¯æ¬¡ã®ãšããã§ãã
ãåããŒã¿ãã£ãã«ã«ã¯ãããŒã¿ã¹ããªãŒã ã«é¢é£ä»ããããç¬èªã®ãªãŒãã£ãªåœ¢åŒããããŸãã 圢åŒïŒAudioFormatã®ã€ã³ã¹ã¿ã³ã¹ïŒã¯ããªãŒãã£ãªã¹ããªãŒã ã®ãã€ãé ã決å®ããŸãã 圢åŒãã©ã¡ãŒã¿ãŒã¯ããã£ãã«æ°ããµã³ããªã³ã°åšæ³¢æ°ãéååãããããšã³ã³ãŒãæ¹æ³ãªã©ã§ããéåžžã®ãšã³ã³ãŒãæ¹æ³ã¯ãPCMãšãã®å€åœ¢ã®ç·åœ¢ãã«ã¹ç¬Šå·å€èª¿ã§ãã
ãã€ãã·ãŒã±ã³ã¹
ãœãŒã¹ãªãŒãã£ãªããŒã¿ã¯ããã€ããªããŒã¿ã®ãã€ãã·ãŒã±ã³ã¹ã§ãã ãã®ã·ãŒã±ã³ã¹ãæŽçããã³è§£éããæ¹æ³ã«ã¯ããŸããŸãªãªãã·ã§ã³ããããŸãã ããããã¹ãŠã®ãªãã·ã§ã³ã詳现ã«æ±ãããšã¯ããŸããããããã§ããã°ã©ã ã§äœ¿çšãããªãŒãã£ãªåœ¢åŒã«ã€ããŠå°ã説æããŸãã
äœè«
ããã§ã¯ãä»ã®ãšããplayAudioã¡ãœããããã®ãŸãŸã«ããŠããªã¹ã2ã®getAudioFormatã¡ãœãããèŠãŠãã ããã
å®å šãªgetAudioFormatã¡ãœããããªã¹ã3ã«ç€ºããŸãã
private AudioFormat getAudioFormat(){ float sampleRate = 8000.0F; int sampleSizeInBits = 16; int channels = 1; boolean signed = true; boolean bigEndian = false; return new AudioFormat( sampleRate, sampleSizeInBits, channels, signed, bigEndian); }//end getAudioFormat
ãªã¹ã3
åæåãããå€æ°ã®å®£èšã«å ããŠããªã¹ã3ã®ã³ãŒãã«ã¯1ã€ã®å®è¡å¯èœåŒãå«ãŸããŠããŸãã
AudioFormatãªããžã§ã¯ã
getAudioFormatã¡ãœããã¯ãAudioFormatã¯ã©ã¹ã®ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŠè¿ããŸãã Sunã¯ãã®ã¯ã©ã¹ã«ã€ããŠæ¬¡ã®ããã«æžããŠããŸãã
ãAudioFormatã¯ã©ã¹ã¯ããªãŒãã£ãªã¹ããªãŒã å ã®ããŒã¿ã®ç¹å®ã®é åºãå®çŸ©ããŸãã AudioFormatãªããžã§ã¯ãã®ãã£ãŒã«ããåç §ãããšããã€ããªããŒã¿ã¹ããªãŒã ã®ããããæ£ãã解éããæ¹æ³ã«é¢ããæ å ±ãååŸã§ããŸãã
æãåçŽãªã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŸã
AudioFormatã¯ã©ã¹ã«ã¯2çš®é¡ã®ã³ã³ã¹ãã©ã¯ã¿ãŒããããŸãïŒæãåçŽãªã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŸãïŒã ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯æ¬¡ã®ãã©ã¡ãŒã¿ãŒãå¿ èŠã§ãã
- ãµã³ããªã³ã°ã¬ãŒããŸãã¯1ç§ãããã®ãµã³ãã«ã¬ãŒãïŒäœ¿çšå¯èœãªå€ïŒ8000ã11025ã16000ã22050ããã³44100ãµã³ãã«/ç§ïŒ
- ããŒã¿ã®ããã深床ïŒã«ãŠã³ãããšã«8ããã³16ããããå©çšå¯èœïŒ
- ãã£ã³ãã«æ°ïŒã¢ãçšã«1ãã£ã³ãã«ãã¹ãã¬ãªçšã«2ãã£ã³ãã«ïŒ
- ã¹ããªãŒã ã§äœ¿çšããã笊å·ä»ããŸãã¯ç¬Šå·ãªãã®ããŒã¿ïŒããšãã°ãå€ã¯0ãã255ãŸãã¯-127ãã+127ãŸã§å€åããŸãïŒ
- ããã°ãšã³ãã£ã¢ã³ãŸãã¯ãªãã«ãšã³ãã£ã¢ã³ã®ãã€ãé ã ïŒ16ãããå€ã®ãã€ãã¹ããªãŒã ãéä¿¡ããå Žåãã©ã¡ãã®ãã€ããæåã«æ¥ãããç¥ãããšãéèŠã§ã-äž¡æ¹ã®ãªãã·ã§ã³ãçºçãããããäœãŸãã¯é«ã§ãïŒã
ãªã¹ã3ãèŠããšãããããã«ãä»åã®ã±ãŒã¹ã§ã¯ãAudioFormatãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã«æ¬¡ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŸããã
- 1ç§ããã8000ãµã³ãã«
- 16ããŒã¿ãµã€ãº
- éèŠãªããŒã¿
- ãªãã«ãšã³ãã£ã¢ã³é
ããã©ã«ãã§ã¯ãããŒã¿ã¯ãªãã¢PCMã§ãšã³ã³ãŒããããŸãã
䜿çšããã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãç·åœ¢ãã«ã¹ã³ãŒãå€èª¿ãšäžèšã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠAudioFormatãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãïŒæ¬¡ã®ã¬ãã¹ã³ã§ã¯ç·åœ¢PCMããã³ãã®ä»ã®ãšã³ã³ãŒãæ¹æ³ã«æ»ããŸãïŒ
åã³playAudioã¡ãœããã«æ»ã
JavaãµãŠã³ãã§ãªãŒãã£ãªããŒã¿åœ¢åŒãã©ã®ããã«æ©èœããããç解ããã®ã§ãplayAudioã¡ãœããã«æ»ããŸãããã 䜿çšå¯èœãªãªãŒãã£ãªããŒã¿ãåçããå ŽåãAudioInputStreamã¯ã©ã¹ã®ãªããžã§ã¯ããå¿ èŠã«ãªããŸãã ãªã¹ã4ã§ãã®ã€ã³ã¹ã¿ã³ã¹ãååŸããŸãã
audioInputStream = new AudioInputStream( byteArrayInputStream, audioFormat, audioData.length/audioFormat. getFrameSize());
ãªã¹ã4
AudioInputStreamã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã©ã¡ãŒã¿ãŒ
- AudioInputStreamã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ã次ã®3ã€ã®ãã©ã¡ãŒã¿ãŒãå¿ èŠã§ãã
- AudioInputStreamãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã®ããŒã¹ãšãªãã¹ããªãŒã ïŒãã®ç®çã®ããã«ãå ã»ã©äœæããByteArrayInputStreamãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããŸãïŒ
- ãã®ã¹ããªãŒã ã®ãªãŒãã£ãªããŒã¿åœ¢åŒïŒãã®ç®çã®ããã«ãæ¢ã«AudioFormatãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŠããŸãïŒ
- ãã®ã¹ããªãŒã å ã®ããŒã¿ã®ãã¬ãŒã ïŒãã¬ãŒã ïŒã®ãµã€ãºïŒä»¥äžã®èª¬æãåç §ïŒ
- æåã®2ã€ã®ãã©ã¡ãŒã¿ãŒã¯ãªã¹ã4ã®ã³ãŒãããæããã§ãããã ãã3çªç®ã®ãã©ã¡ãŒã¿ãŒèªäœã¯ããã»ã©æ確ã§ã¯ãããŸããã
ãã¬ãŒã ãµã€ãºãååŸ
ãªã¹ã4ãããããããã«ã3çªç®ã®ãã©ã¡ãŒã¿ãŒã®å€ã¯èšç®ã䜿çšããŠäœæãããŸãã ããã¯ããããŸã§èšåããŠããªããªãŒãã£ãªåœ¢åŒã®å±æ§ã®1ã€ã«ãããããã¬ãŒã ãšåŒã°ããŸãã
ãã¬ãŒã ãšã¯äœã§ããïŒ
ããã°ã©ã ã§äœ¿çšãããŠããåçŽãªç·åœ¢PCMã®å Žåããã¬ãŒã ã«ã¯ãç¹å®ã®æéã®ãã¹ãŠã®ãã£ãã«ã®ãµã³ãã«ã®ã»ãããå«ãŸããŠããŸãã
ãããã£ãŠããã¬ãŒã ãµã€ãºã¯ããã€ãåäœã®ã«ãŠã³ããµã€ãºã«ãã£ãã«æ°ãæãããã®ã«çãããªããŸãã
ãæ³åã®ãšãããgetFrameSizeãšããã¡ãœããã¯ãã¬ãŒã ãµã€ãºããã€ãåäœã§è¿ããŸãã
ãã¬ãŒã ãµã€ãºã®èšç®
ãããã£ãŠããã¬ãŒã å ã®ãªãŒãã£ãªããŒã¿ã®é·ãã¯ããªãŒãã£ãªããŒã¿ã·ãŒã±ã³ã¹å ã®åèšãã€ãæ°ã1ãã¬ãŒã å ã®ãã€ãæ°ã§é€ç®ããããšã«ãã£ãŠèšç®ã§ããŸãã ãã®èšç®ã¯ããªã¹ã4ã®3çªç®ã®ãã©ã¡ãŒã¿ãŒã«äœ¿çšãããŸãã
SourceDataLineãªããžã§ã¯ãã®ååŸ
次ã«èª¬æããããã°ã©ã ã®æ¬¡ã®éšåã¯ãåçŽãªãªãŒãã£ãªåºåã·ã¹ãã ã§ãã å³5ã®å³ãããããããã«ããã®åé¡ã解決ããã«ã¯SourceDataLineãªããžã§ã¯ããå¿ èŠã§ãã
SourceDataLineãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãååŸããæ¹æ³ã¯ããã€ããããŸããããã®ãã¹ãŠãéåžžã«æ³šæãå¿ èŠã§ãã ãªã¹ã5ã®ã³ãŒãã¯ãSourceDataLineãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãžã®åç §ãååŸããŠä¿åããŸãã
ïŒãã®ã³ãŒãã¯SourceDataLineãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããã ãã§ã¯ãããŸãããããã¯ããªãé åãã®æ¹æ³ã§ååŸããŸããïŒ
DataLine.Info dataLineInfo = new DataLine.Info( SourceDataLine.class, audioFormat); sourceDataLine = (SourceDataLine) AudioSystem.getLine( dataLineInfo);
ãªã¹ã5
SourceDataLineãªããžã§ã¯ããšã¯äœã§ããïŒ
ããã«ã€ããŠããµã³ã¯æ¬¡ã®ããã«æžããŠããŸãã
ãSourceDataLineã¯ãããŒã¿ãæžã蟌ãããšãã§ããããŒã¿ãã£ãã«ã§ãã ãããµãŒã®å ¥åãšããŠæ©èœããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ããã€ãã·ãŒã±ã³ã¹ãSourceDataLineã«æžã蟌ã¿ãŸããSourceDataLineã¯ãããŒã¿ããããã¡ãªã³ã°ãããããµãŒã«é ä¿¡ããŸãã ãããµãŒã¯ã次ã®ã¹ããŒãžã§åŠçããããŒã¿ããããšãã°åºåããŒãã«éä¿¡ã§ããŸãã
ãã®ãã¢ãªã³ã°ã®åœåèŠåã¯ããã£ãã«ãšãããµãŒã®é¢ä¿ãåæ ããŠããããšã«æ³šæããŠãã ããã
AudioSystemã¯ã©ã¹ã®GetLineã¡ãœãã
SourceDataLineãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãååŸããæ¹æ³ã®1ã€ã¯ãAudioSystemã¯ã©ã¹ããéçãªgetLineã¡ãœãããåŒã³åºãããšã§ãïŒããã«ã€ããŠã¯ã次ã®ã¬ãã¹ã³ã§è©³ããå ±åããŸãïŒã
getLineã¡ãœããã¯ãLine.Infoåã®å ¥åãã©ã¡ãŒã¿ãŒãå¿ èŠãšããæ¢ã«å®çŸ©ãããŠããLine.Infoãªããžã§ã¯ãã®èª¬æãšäžèŽããLineãªããžã§ã¯ããè¿ããŸãã
å¥ã®çãäœè«
Sunã¯ãLine.Infoãªããžã§ã¯ãã«é¢ãã次ã®æ å ±ãå ±åããŸãã
ããã£ãã«ã«ã¯ç¬èªã®æ å ±ãªããžã§ã¯ãïŒLine.Infoã®ã€ã³ã¹ã¿ã³ã¹ïŒããããŸãããã®ãªããžã§ã¯ãã¯ãæ··åãªãŒãã£ãªããŒã¿ãåºåãšããŠãã£ãã«ã«çŽæ¥éä¿¡ãããããµãŒïŒååšããå ŽåïŒãšããã£ãã«ããçŽæ¥å ¥åãšããŠãªãŒãã£ãªããŒã¿ãåä¿¡ãããããµãŒïŒååšããå ŽåïŒã瀺ããŸãã Lineã®çš®é¡ã¯Line.Infoã®ãµãã¯ã©ã¹ã«å¯Ÿå¿ã§ããŸããããã«ãããç¹å®ã®ã¿ã€ãã®ãã£ãã«ã«é¢é£ããä»ã®ã¿ã€ãã®ãã©ã¡ãŒã¿ãŒãæå®ã§ããŸãã
DataLine.Infoãªããžã§ã¯ã
ãªã¹ã5ã®æåã®åŒã¯ãDataLine.Infoãªããžã§ã¯ãã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããŸããããã¯ãLine.Infoãªããžã§ã¯ãã®ç¹å¥ãªåœ¢åŒïŒãµãã¯ã©ã¹ïŒã§ãã
DataLine.Infoã¯ã©ã¹ã«ã¯ããªãŒããŒããŒããããã³ã³ã¹ãã©ã¯ã¿ãŒãããã€ããããŸãã æã䜿ãããããã®ãéžæããŸããã ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯2ã€ã®ãã©ã¡ãŒã¿ãŒãå¿ èŠã§ãã
ã¯ã©ã¹ãªããžã§ã¯ã
æåã®ãã©ã¡ãŒã¿ãŒã¯Classã§ããããã¯ãSourceDataLine.classãšããŠå®çŸ©ããã¯ã©ã¹ãè¡šããŸã
2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ããã£ãã«ã«å¿ èŠãªããŒã¿åœ¢åŒã決å®ããŸãã æ¢ã«å®çŸ©æžã¿ã®AudioFormatãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããŸãã
ãã§ã«å¿ èŠãªå Žæã«ããŸããïŒ
æ®å¿µãªãããæãå¿ èŠãªSourceDataLineãªããžã§ã¯ãã¯ãŸã ãããŸããã ãããŸã§ã®ãšãããå¿ èŠãªSourceDataLineãªããžã§ã¯ãã«é¢ããæ å ±ã®ã¿ãæäŸãããªããžã§ã¯ãããããŸãã
SourceDataLineãªããžã§ã¯ãã®ååŸ
ãªã¹ã5ã®2çªç®ã®åŒã¯ãæçµçã«å¿ èŠãªSourceDataLineã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŠä¿åããŸãã ããã¯ãAudioSystemã¯ã©ã¹ã®éçgetLineã¡ãœãããåŒã³åºããdataLineInfoããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããšã§çºçããŸãã ïŒæ¬¡ã®ã¬ãã¹ã³ã§ã¯ãLineãªããžã§ã¯ããååŸããæ¹æ³ãèŠãŠãMixerãªããžã§ã¯ããçŽæ¥æäœããŸãïŒã
getLineã¡ãœããã¯ãSourceDataLineã®èŠªã§ããLineåã®ãªããžã§ã¯ããžã®åç §ãè¿ããŸãã ãããã£ãŠãæ»ãå€ãSourceDataLineãšããŠä¿åãããåã«ãããã§ããŠã³ãã£ã¹ããå¿ èŠã§ãã
SourceDataLineãªããžã§ã¯ãã䜿çšããæºåãããŸããã
SourceDataLineãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãååŸãããããªã¹ã6ã«ç€ºãããã«ããããéããŠå®è¡ããæºåãããå¿ èŠããããŸãã
sourceDataLine.open(audioFormat); sourceDataLine.start();
ãªã¹ã6
éå°æ¹æ³
ãªã¹ã6ãããããããã«ãAudioFormatãªããžã§ã¯ããSourceDataLineãªããžã§ã¯ãã®openingã¡ãœããã«éä¿¡ããŸããã
Sunã«ãããšãããã¯ã¡ãœããã§ãã
ã以åã«å®çŸ©ããã圢åŒã§åç·ïŒãã£ãã«ïŒãéããå¿ èŠãªã·ã¹ãã ãªãœãŒã¹ãåãåããäœæ¥ïŒäœæ¥ïŒç¶æ ã«ã§ããããã«ããŸããã
ãã£ã¹ã«ããªãŒç¶æ
ãã®ã¹ã¬ããã§ã¯ãSunã圌ã«ã€ããŠæžããããšã¯ã»ãšãã©ãããŸããã
ããã£ãã«ã®ééã¯ãã·ã¹ãã ãªãœãŒã¹ã®åé ã«åœ±é¿ããŸãã ãã£ãã«ãæ£åžžã«éããšãå¿ èŠãªãã¹ãŠã®ãªãœãŒã¹ããã£ãã«ã«æäŸãããŸãã
ãªãŒãã£ãªããŒã¿ã®å ¥åããŒããšåºåããŒãããããããµãŒãéãã«ã¯ããšããããå¿ èŠãªãœãããŠã§ã¢ã³ã³ããŒãã³ãã®äœæ¥ãšåæåãè¡ããããã©ãããã©ãŒã ã®ããŒããŠã§ã¢ã®äœ¿çšãå«ãŸããŸãã
ãããµãŒãžã®ããŸãã¯ãããµãŒããã®ãªãŒãã£ãªããŒã¿ã®ã«ãŒãã§ãããã£ã³ãã«ãéãã«ã¯ããããµãŒãªãœãŒã¹ã®ç¡å¶éã®åæåãšåä¿¡ã®äž¡æ¹ãå«ãŸããŸãã ã€ãŸãããããµãŒã®ãã£ã³ãã«æ°ã«ã¯éãããããããç¬èªã®ãã£ã³ãã«ããŒãºãæã€ã¢ããªã±ãŒã·ã§ã³ïŒããã³1ã€ã®ã¢ããªã±ãŒã·ã§ã³ã§ãããïŒããããµãŒãªãœãŒã¹ãæ£ããå ±æããå¿ èŠããããŸãïŒ ''
ãã£ãã«ã§startã¡ãœãããåŒã³åºããŸã
Sunã«ãããšããã£ãã«ã®startã¡ãœãããåŒã³åºããšã次ã®ããšãæå³ããŸãã
ããã£ãã«ã¯I / Oã©ã€ã³ã䜿çšã§ããŸãã ãã§ã«åäœããŠããåç·ã䜿çšããããšãããšãã¡ãœããã¯äœãããŸããã ããããããŒã¿ãããã¡ãŒã空ã«ãªã£ãåŸããããã¡ãŒãå®å šã«èªã¿èŸŒãŸããåŸã«åŠçã§ããªãã£ãæåã®ãã¬ãŒã ãããI / Oã®éå§ãåéãããŸãã
ãã¡ããããã®å Žåããã£ãã«ã¯åæ¢ããŸããã§ããã åããŠçºå£²ããŠä»¥æ¥ã
ããã§å¿ èŠãªãã®ã¯ã»ãŒãã¹ãŠæã£ã
ãã®æç¹ã§ã以åã«é²é³ããŠByteArrayOutputStreamãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã«ä¿åãããªãŒãã£ãªããŒã¿ãåçããããã«å¿ èŠãªãã¹ãŠã®ãªãŒãã£ãªãªãœãŒã¹ãåãåããŸããã ïŒãã®ãªããžã§ã¯ãã¯ã³ã³ãã¥ãŒã¿ãŒã®RAMã«ã®ã¿ååšããããšãæãåºããŠãã ããïŒã
ãããŒãéå§ããŸã
ã¹ããªãŒã ãäœæããŠéå§ãããªãŒãã£ãªãåçããŸãã ãªã¹ã7ã®ã³ãŒãã¯ããã®ã¹ã¬ãããäœæããŠéå§ããŸãã
ïŒãã®ã¹ã¬ããã®startã¡ãœããã®åŒã³åºããšããªã¹ã6ã®SourceDataLineãªããžã§ã¯ãã®startã¡ãœããã®åŒã³åºããæ··åããªãã§ãã ããããããã¯ãŸã£ããç°ãªãæäœã§ãïŒ
Thread playThread = new Thread(new PlayThread()); playThread.start(); } catch (Exception e) { System.out.println(e); System.exit(0); }//end catch }//end playAudio
ãªã¹ã7
æ°åããªãã³ãŒã
ãªã¹ã7ã®ããã°ã©ã ã®ã¹ããããã¯ãéåžžã«åçŽã§ãããJavaã§ã®ãã«ãã¹ã¬ããããã°ã©ãã³ã°ã®äŸã瀺ããŠããŸãã ç解ã§ããªãå Žåã¯ãJavaãåŠç¿ããããã®å°éçãªãããã¯ã§ãã®ãããã¯ã«ç²ŸéããŠãã ããã
ã¹ããªãŒã ãéå§ããããšãäºåã«é²é³ããããã¹ãŠã®ãªãŒãã£ãªããŒã¿ãæåŸãŸã§åçããããŸã§åäœããŸãã
æ°ããã¹ã¬ãããªããžã§ã¯ã
ãªã¹ã7ã®ã³ãŒãã¯ãPlayThreadã¯ã©ã¹ã«å±ããThreadãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã ãã®ã¯ã©ã¹ã¯ãããã°ã©ã ã®å éšã¯ã©ã¹ãšããŠå®çŸ©ãããŠããŸãã ãã®èª¬æã¯ãªã¹ã8ããå§ãŸããŸãã
class PlayThread extends Thread{ byte tempBuffer[] = new byte[10000];
ãªã¹ã8
Threadã¯ã©ã¹ã®runã¡ãœãã
tempBufferå€æ°ïŒãã€ãã®é åãåç §ïŒã宣èšããããšãé€ããŠããã®ã¯ã©ã¹ã®å®å šãªå®çŸ©ã¯ãåã«runã¡ãœããã®å®çŸ©ã§ãã æ¢ã«ãåãã®ãšãããThreadãªããžã§ã¯ãã§startã¡ãœãããåŒã³åºããšããã®ãªããžã§ã¯ãã®runã¡ãœãããå®è¡ãããŸã
ãã®ã¹ã¬ããã®runã¡ãœããã¯ãªã¹ã9ããå§ãŸããŸãã
public void run(){ try{ int cnt; // // -1 // while((cnt = audioInputStream. read(tempBuffer, 0, tempBuffer.length)) != -1){ if(cnt > 0){ // // // // . sourceDataLine.write( tempBuffer, 0, cnt); }//end if }//end while
ãªã¹ã9
runã¡ãœããã®ããã°ã©ã ãã©ã°ã¡ã³ãã®æåã®éšå
runã¡ãœããã«ã¯2ã€ã®éèŠãªéšåãå«ãŸããŠããŸããæåã®éšåããªã¹ã9ã«ç€ºããŸãã
ã€ãŸããããã§ã¯ã«ãŒãã䜿çšããŠAudioInputStreamãããªãŒãã£ãªããŒã¿ãèªã¿åããSourceDataLineã«æž¡ããŸãã
SourceDataLineãªããžã§ã¯ãã«éä¿¡ãããããŒã¿ã¯ãããã©ã«ãã®ãªãŒãã£ãªåºåã«èªåçã«è»¢éãããŸãã å èµã®ã³ã³ãã¥ãŒã¿ãŒã¹ããŒã«ãŒãŸãã¯ã©ã€ã³åºåã䜿çšã§ããŸãã ïŒæ¬¡ã®ã¬ãã¹ã³ã§å¿ èŠãªãµãŠã³ãããã€ã¹ã決å®ããæ¹æ³ãåŠç¿ããŸãïŒã cntå€æ°ãštempBufferããŒã¿ãããã¡ãŒã¯ãèªã¿åãæäœãšæžã蟌ã¿æäœã®éã®ããŒã¿ã®æµããå¶åŸ¡ããããã«äœ¿çšãããŸãã
AudioInputStreamããã®ããŒã¿ã®èªã¿åã
AudioInputStreamãªããžã§ã¯ãããã®èªã¿åããµã€ã¯ã«ã¯ãæå®ãããæ倧ãã€ãæ°ã®ããŒã¿ãAudioInputStreamããèªã¿åãããã®ãã€ãé åãé 眮ããŸãã
æ»ãå€
ããã«ããã®ã¡ãœããã¯èªã¿åããããã€ãã®åèšæ°ãè¿ããŸããèšé²ãããã·ãŒã±ã³ã¹ã®çµããã«éããå Žåã¯-1ãè¿ããŸãã èªã¿åããããã€ãæ°ã¯ãcntå€æ°ã«æ ŒçŽãããŸãã
SourceDataLineæžã蟌ã¿ã«ãŒã
èªã¿åããããã€ãæ°ããŒããã倧ããå ŽåãSourceDataLineã«ããŒã¿ãæžã蟌ããµã€ã¯ã«ãžã®ç§»è¡ããããŸãã ãã®ã«ãŒãã§ã¯ããªãŒãã£ãªããŒã¿ããããµãŒã«å ¥ããŸãã ãã€ãã¯ãã€ã³ããã¯ã¹ã«åŸã£ãŠãã€ãé åããèªã¿åããããã£ãã«ãããã¡ã«æžã蟌ãŸããŸãã
å ¥åã¹ããªãŒã ã也ç¥ãããšã
èªã¿åãã«ãŒãã-1ãè¿ããšããããã¯ä»¥åã«èšé²ããããã¹ãŠã®ãªãŒãã£ãªããŒã¿ãçµäºããããã«å¶åŸ¡ããªã¹ã10ã®ããã°ã©ã ãã©ã°ã¡ã³ãã«æž¡ãããããšãæå³ããŸãã
sourceDataLine.drain(); sourceDataLine.close(); }catch (Exception e) { System.out.println(e); System.exit(0); }//end catch }//end run }// PlayThread
ãªã¹ã10
ããã¯ããŠåŸ ã€
ãªã¹ã10ã®ã³ãŒãã¯ãSourceDataLineãªããžã§ã¯ãã®drainã¡ãœãããåŒã³åºããŠãããã°ã©ã ããããã¯ããSourceDataLineã§å éšãããã¡ãŒã空ã«ãªãã®ãåŸ æ©ã§ããããã«ããŸãã ãããã¡ãŒã空ã®å Žåã次ã®éšåå šäœãã³ã³ãã¥ãŒã¿ãŒã®é³å£°åºåã«é ä¿¡ãããããšãæå³ããŸãã
SourceDataLineãéãã
次ã«ãããã°ã©ã ã¯closeã¡ãœãããåŒã³åºããŠãã£ãã«ãéããŸããããã«ããããã£ãã«ã䜿çšãããã¹ãŠã®ã·ã¹ãã ãªãœãŒã¹ã解æŸãããããšã瀺ããŸãã Sunã¯ã次ã®ãã£ãã«ééãå ±åããŠããŸãã
ããã£ãã«ãéãããšããã®ãã£ãã«ã«é¢é£ãããã¹ãŠã®ãªãœãŒã¹ã解æŸã§ããããšã瀺ããŸãã ãªãœãŒã¹ã解æŸããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãçµäºãããšãã ãã§ãªãããã§ã«é¢äžããŠãããã©ããã«é¢ä¿ãªããã¢ããªã±ãŒã·ã§ã³ã¯ãã£ãã«ãéããå¿ èŠããããŸãã ãããµãŒã¯ã·ã¹ãã ãªãœãŒã¹ãå ±æããç¹°ãè¿ãéãããéãããã§ãããšæ³å®ãããŠããŸãã ä»ã®ãã£ãã«ã¯ãéããåŸã®åéããµããŒãããå Žåãšããªãå ŽåããããŸãã äžè¬ã«ãç·ãéãã¡ã«ããºã ã¯ããµãã¿ã€ãã«ãã£ãŠç°ãªããŸãã
ãããŠä»ãç©èªã®çµãã
ããã§ãããã§ã¯ãã³ã³ãã¥ãŒã¿ãŒã®å éšã¡ã¢ãªãããµãŠã³ãã«ãŒããžã®ãªãŒãã£ãªããŒã¿ã®é ä¿¡ãä¿èšŒããããã«ãããã°ã©ã ãJava Sound APIã䜿çšããæ¹æ³ã«ã€ããŠèª¬æããŸããã
ããã°ã©ã ãå®è¡ãã
ããã§ããªã¹ã11ã®ããã°ã©ã ãã³ã³ãã€ã«ããŠå®è¡ã§ããããã«ãªããã¬ãã¹ã³ã®æåŸã«ãªããŸãã
ãªãŒãã£ãªããŒã¿ããã£ããã£ããŠåçãã
ãã®ããã°ã©ã ã¯ããã€ã¯ããããŒã¿ãèšé²ããã³ã³ãã¥ãŒã¿ãŒã®ãµãŠã³ãã«ãŒããä»ããŠåçããæ©èœã瀺ããŠããŸãã 䜿çšæ¹æ³ã¯éåžžã«ç°¡åã§ãã
ããã°ã©ã ãå®è¡ããŸãã å³6ã«ç€ºãã·ã³ãã«ãªGUI GUIãç»é¢ã«è¡šç€ºãããŸãã

- [ãã£ããã£]ãã¿ã³ãã¯ãªãã¯ããŠããµãŠã³ãããã€ã¯ã«é²é³ããŸãã
- åæ¢ãã¿ã³ãã¯ãªãã¯ããŠèšé²ãåæ¢ããŸãã
- [åç]ãã¿ã³ãã¯ãªãã¯ããŠãã³ã³ãã¥ãŒã¿ãŒã®é³å£°åºåããé²é³ãåçããŸãã
äœãèãããªãå Žåã¯ããã€ã¯ã®æ床ãŸãã¯ã¹ããŒã«ãŒã®é³éãäžããŠã¿ãŠãã ããã
ããã°ã©ã ã¯ã³ã³ãã¥ãŒã¿ã®ã¡ã¢ãªã«ã¬ã³ãŒããä¿åããŸãã®ã§ã泚æããŠãã ããã ãªãŒãã£ãªããŒã¿ã倧éã«ä¿åããããšãããšãRAMãäžè¶³ããå¯èœæ§ããããŸãã
ãããã«
- Java Sound APIã¯ããã£ã³ãã«ãšãããµãŒã®æŠå¿µã«åºã¥ããŠããããšãããããŸããã
- ãªãŒãã£ãªãããµãŒã®ããã€ã¹ãç解ããããã«ãã¢ããã°ãµãŠã³ãã®ç©ççããã³é»æ°çç¹æ§ã«é¢ããåææ å ±ãåãåããŸããã
- ãªãŒãã£ãªãããµãŒã䜿çšããå¯èœæ§ã説æããããã«ã6ã€ã®ãã€ã¯ãš2ã€ã®ã¹ãã¬ãªã¹ããŒã«ãŒã䜿çšããã¢ããã¥ã¢ããã¯ã³ã³ãµãŒãã¹ã¯ãªããã䜿çšããŸããã
- ãããµãŒããã£ã³ãã«ãããŒã¿åœ¢åŒãªã©ãå€ãã®Java Soundããã°ã©ãã³ã°ã®ãããã¯ã«ã€ããŠè°è«ããŸããã
- SourceDataLineãClipãMixerãAudioFormatã®åãªããžã§ã¯ããšåçŽãªãªãŒãã£ãªåºåããã°ã©ã ã®ããŒãã®éã®äžè¬çãªé¢ä¿ã«ã€ããŠèª¬æããŸããã
- æåã«ãªãŒãã£ãªããŒã¿ãé²é³ããŠããåçã§ããããã°ã©ã ã«æ £ããŸããã
- ã³ã³ãã¥ãŒã¿ã®ã¡ã¢ãªã«ä»¥åã«èšé²ããããªãŒãã£ãªããŒã¿ãåçããããã«äœ¿çšãããã³ãŒãã®è©³çŽ°ãªèª¬æãåããŸããã
次ã¯ïŒ
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãJava Sound APIã¯ãããµãŒãšãã£ã³ãã«ã®æŠå¿µã«åºã¥ããŠããããšãããããŸããã ãã ãã説æããã³ãŒãã«ã¯ãããµãŒãæ瀺çã«å«ãŸããŠããŸããã§ããã AudioSystemã¯ã©ã¹ã¯ããããµãŒã«çŽæ¥ã¢ã¯ã»ã¹ããã«ãªãŒãã£ãªåŠçããã°ã©ã ãäœæã§ããéçã¡ãœãããæäŸããŸããã ã€ãŸãããããã®éçã¡ãœããã¯ãããµãŒãç§ãã¡ããé ãããŸãã
次ã®ã¬ãã¹ã³ã§ã¯ããã®ã¬ãã¹ã³ã§ç€ºãããã®ãšæ¯èŒããŠå€æŽãããããŒã¿ãã£ããã£ã³ãŒãã瀺ããŸããæ°ããããŒãžã§ã³ã§ã¯ãæ¬åœã«å¿ èŠãªãšãã«ãããµãŒã䜿çšããæ¹æ³ã瀺ãããã«ããããµãŒãæ瀺çã«äœ¿çšããŸãã
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.sound.sampled.*; public class AudioCapture01 extends JFrame{ boolean stopCapture = false; ByteArrayOutputStream byteArrayOutputStream; AudioFormat audioFormat; TargetDataLine targetDataLine; AudioInputStream audioInputStream; SourceDataLine sourceDataLine; public static void main( String args[]){ new AudioCapture01(); }//end main public AudioCapture01(){ final JButton captureBtn = new JButton("Capture"); final JButton stopBtn = new JButton("Stop"); final JButton playBtn = new JButton("Playback"); captureBtn.setEnabled(true); stopBtn.setEnabled(false); playBtn.setEnabled(false); captureBtn.addActionListener( new ActionListener(){ public void actionPerformed( ActionEvent e){ captureBtn.setEnabled(false); stopBtn.setEnabled(true); playBtn.setEnabled(false); // // // Stop captureAudio(); } } ); getContentPane().add(captureBtn); stopBtn.addActionListener( new ActionListener(){ public void actionPerformed( ActionEvent e){ captureBtn.setEnabled(true); stopBtn.setEnabled(false); playBtn.setEnabled(true); // // stopCapture = true; } } ); getContentPane().add(stopBtn); playBtn.addActionListener( new ActionListener(){ public void actionPerformed( ActionEvent e){ // // playAudio(); } } ); getContentPane().add(playBtn); getContentPane().setLayout( new FlowLayout()); setTitle("Capture/Playback Demo"); setDefaultCloseOperation( EXIT_ON_CLOSE); setSize(250,70); setVisible(true); } // // // ByteArrayOutputStream private void captureAudio(){ try{ // audioFormat = getAudioFormat(); DataLine.Info dataLineInfo = new DataLine.Info( TargetDataLine.class, audioFormat); targetDataLine = (TargetDataLine) AudioSystem.getLine( dataLineInfo); targetDataLine.open(audioFormat); targetDataLine.start(); // // // // Thread captureThread = new Thread( new CaptureThread()); captureThread.start(); } catch (Exception e) { System.out.println(e); System.exit(0); } } // // , // ByteArrayOutputStream private void playAudio() { try{ // // byte audioData[] = byteArrayOutputStream. toByteArray(); InputStream byteArrayInputStream = new ByteArrayInputStream( audioData); AudioFormat audioFormat = getAudioFormat(); audioInputStream = new AudioInputStream( byteArrayInputStream, audioFormat, audioData.length/audioFormat. getFrameSize()); DataLine.Info dataLineInfo = new DataLine.Info( SourceDataLine.class, audioFormat); sourceDataLine = (SourceDataLine) AudioSystem.getLine( dataLineInfo); sourceDataLine.open(audioFormat); sourceDataLine.start(); // // // // Thread playThread = new Thread(new PlayThread()); playThread.start(); } catch (Exception e) { System.out.println(e); System.exit(0); } } // // AudioFormat private AudioFormat getAudioFormat(){ float sampleRate = 8000.0F; //8000,11025,16000,22050,44100 int sampleSizeInBits = 16; //8,16 int channels = 1; //1,2 boolean signed = true; //true,false boolean bigEndian = false; //true,false return new AudioFormat( sampleRate, sampleSizeInBits, channels, signed, bigEndian); } //===================================// // // class CaptureThread extends Thread{ byte tempBuffer[] = new byte[10000]; public void run(){ byteArrayOutputStream = new ByteArrayOutputStream(); stopCapture = false; try{ while(!stopCapture){ int cnt = targetDataLine.read( tempBuffer, 0, tempBuffer.length); if(cnt > 0){ // byteArrayOutputStream.write( tempBuffer, 0, cnt); } } byteArrayOutputStream.close(); }catch (Exception e) { System.out.println(e); System.exit(0); } } } //===================================// // // class PlayThread extends Thread{ byte tempBuffer[] = new byte[10000]; public void run(){ try{ int cnt; // -1 while((cnt = audioInputStream. read(tempBuffer, 0, tempBuffer.length)) != -1){ if(cnt > 0){ // // // // sourceDataLine.write( tempBuffer, 0, cnt); } } sourceDataLine.drain(); sourceDataLine.close(); }catch (Exception e) { System.out.println(e); System.exit(0); } } } //===================================// }//end outer class AudioCapture01.java
ãªã¹ã11