ãã®èšäºã§ã¯ãã¬ããã¹ã¿ã€ã«ã®ã²ãŒã çšã®ãµãŠã³ããçæã§ããã·ã³ã»ãµã€ã¶ãŒããŒã¹ã®ãªãŒãã£ãªãšã³ãžã³ãäœæããæ¹æ³ãåŠã³ãŸãã ãµãŠã³ããšã³ãžã³ã¯å®è¡æã«ãã¹ãŠã®ãµãŠã³ããçæããMP3ãWAVãã¡ã€ã«ãªã©ã®å€éšäŸåé¢ä¿ãå¿
èŠãšããŸããã æçµçã«ãã²ãŒã ã«äŸ¿å©ã«åã蟌ãããšãã§ããäœæ¥ã©ã€ãã©ãªãååŸããŸãã
ãªãŒãã£ãªãšã³ãžã³ã®äœæãéå§ããåã«ãããã€ãã®æŠå¿µã«å¯ŸåŠããå¿
èŠããããŸãã ãŸãããšã³ãžã³ãé³ãçæããããã«äœ¿çšããæ³¢ã«ã€ããŠã 次ã«ãé³æ³¢ãããžã¿ã«åœ¢åŒã§ã©ã®ããã«ä¿åããã©ãã«ä»ããããããç解ããå¿
èŠããããŸãã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãActionScript 3.0ããã°ã©ãã³ã°èšèªã䜿çšããŸããã䜿çšããææ³ãšæŠå¿µã¯ãäœã¬ãã«ãªãŒãã£ãªAPIãžã®ã¢ã¯ã»ã¹ãæäŸããä»ã®èšèªã«ç°¡åã«å€æã§ããŸãã
æ³¢
äœæãããªãŒãã£ãªãšã³ãžã³ã¯ã4ã€ã®åºæ¬çãªçš®é¡ã®æ³¢ïŒåºæ¬çãªåœ¢åŒãå®æçã«ç¹°ãè¿ãããããã
åšæçãªæ³¢ãšãåŒã°ããŸãïŒã䜿çšããŸãã ãããã¯ãã¹ãŠãã¢ããã°ã·ã³ã»ãµã€ã¶ãŒãšããžã¿ã«ã·ã³ã»ãµã€ã¶ãŒã®äž¡æ¹ã§éåžžã«é »ç¹ã«äœ¿çšãããŸãã å波圢ã«ã¯ç¬èªã®ãµãŠã³ãç¹æ§ããããŸãã
以äžã¯ãå波圢ã®èŠèŠçè¡šçŸããµãŠã³ãã®äŸãããã³å波圢ããµã³ããªã³ã°ãããããŒã¿ã®é
åãšããŠçæããããã«å¿
èŠãªã³ãŒãã§ãã
ãã«ã¹

ãã«ã¹æ³¢ã¯ãã·ã£ãŒãã§èª¿åã®åããé³ãäœæããŸãã
MP3ãããŠã³ããŒãããŸãã
é
åã®ãã«ã¹æ³¢ïŒ-1.0ã1.0ã®ç¯å²ïŒãè¡šãå€ãçæããã«ã¯ã次ã®ã³ãŒãã䜿çšã§ããŸã
n
ã¯é
åãæºããã®ã«å¿
èŠãªå€ã®æ°ã
a
ã¯é
åã
p
ã¯æ³¢å
ã®æ£èŠåãããäœçœ®ã§ãã
var i:int = 0; var n:int = 100; var p:Number; while( i < n ) { p = i / n; a[i] = p < 0.5 ? 1.0 : -1.0; i ++; }
èŠã

ã®ãããæ³¢ã¯ãã·ã£ãŒãã§è³éããªé³ãäœããŸãã
MP3ãããŠã³ããŒãããŸãã
ãã³ã®ãªæ³¢ïŒ-1.0ãã1.0ã®ç¯å²ïŒãè¡šãå€ã®é
åãçæããã«ã¯ã
n
ã¯é
åãæºããã®ã«å¿
èŠãªå€ã®æ°ã
a
ã¯é
åã
p
ã¯æ³¢å
ã®æ£èŠåãããäœçœ®ã§ãã
var i:int = 0; var n:int = 100; var p:Number; while( i < n ) { p = i / n; a[i] = p < 0.5 ? p * 2.0 : p * 2.0 - 2.0; i ++; }
æ£åŒŠæ³¢

æ£åŒŠæ³¢ã¯ãæ»ããã§ã¯ãªã¢ãªãµãŠã³ããäœæããŸãã
MP3ãããŠã³ããŒãããŸãã
æ£åŒŠæ³¢ïŒ-1.0ã1.0ã®ç¯å²ïŒãè¡šãå€ã®é
åãçæããã«ã¯ã次ã®ã³ãŒãã䜿çšã§ããŸã
n
ã¯é
åãæºããããã«å¿
èŠãªå€ã®æ°ã
a
ã¯é
åã
p
ã¯æ³¢å
ã®æ£èŠåãããäœçœ®ã§ãã
var i:int = 0; var n:int = 100; var p:Number; while( i < n ) { p = i / n; a[i] = Math.sin( p * 2.0 * Math.PI ); i ++; }
ãã©ã€ã¢ã³ã°ã«

äžè§æ³¢ã¯æ»ããã§èª¿åã®ãšããé³ãäœããŸãã
MP3ãããŠã³ããŒãããŸãã
äžè§æ³¢ïŒ-1.0ãã1.0ã®ç¯å²ïŒãè¡šãå€ã®é
åãçæããã«ã¯ã次ã®ã³ãŒãã䜿çšã§ããŸã
n
ã¯é
åãæºããããã«å¿
èŠãªå€ã®æ°ã
a
ã¯é
åã
p
ã¯æ³¢å
ã®æ£èŠåãããäœçœ®ã§ãã
var i:int = 0; var n:int = 100; var p:Number; while( i < n ) { p = i / n; a[i] = p < 0.25 ? p * 4.0 : p < 0.75 ? 2.0 - p * 4.0 : p * 4.0 - 4.0; i ++; }
6è¡ç®ã®æ¡åŒµããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãã
if (p < 0.25) { a[i] = p * 4.0; } else if (p < 0.75) { a[i] = 2.0 - (p * 4.0); } else { a[i] = (p * 4.0) - 4.0; }
æ³¢ã®æ¯å¹
ãšåšæ³¢æ°
é³æ³¢ã«ã¯2ã€ã®éèŠãªç¹æ§ããããŸã-æ³¢ã®
æ¯å¹
ãš
åšæ³¢æ° ïŒ
ããªã¥ãŒã ãš
ãããã¯ããããããããã«äŸåããŸãã æ¯å¹
ã¯æ³¢ã®çµ¶å¯ŸããŒã¯å€ã§ãããåšæ³¢æ°ã¯æ³¢ã1ç§éã«ç¹°ãè¿ãåæ°ã§ãã éåžžãåšæ³¢æ°ã¯
ãã«ãïŒHzãHzïŒã§æž¬å®ãããŸãã
次ã®å³ã¯ãæ¯å¹
ã0.5ãåšæ³¢æ°ã20 Hzã®ã®ãããæ³¢ã®200ããªç§ã®ã¹ãããã·ã§ããã瀺ããŠããŸãã

æ³¢ã®åšæ³¢æ°ããããã«çŽæ¥ã©ã®ããã«åœ±é¿ãããã®äŸã瀺ããŸããåšæ³¢æ°ã440 Hzã®æ³¢ã¯ãçŸä»£ã®ã³ã³ãµãŒããã¢ãã®æåã®ãªã¯ã¿ãŒãïŒA4ïŒã®æšæºé³ãšåãé«ãã§ãã ãã®é »åºŠãèãããšã次ã®ã³ãŒãã䜿çšããŠä»ã®ããŒãã®é »åºŠãèšç®ã§ããŸãã
f = Math.pow( 2, n / 12 ) * 440.0;
ãã®ã³ãŒãã®å€æ°
n
ã¯ãA4ãã察象ã®ããŒããŸã§ã®ããŒãã®æ°ã§ãã ããšãã°ã2ãªã¯ã¿ãŒãïŒA5ïŒã®åšæ³¢æ°ïŒA4ãã1ãªã¯ã¿ãŒãé«ãïŒãèŠã€ããã«ã¯ãA5ãA4ãã12é³é«ãããã
n
ã
12
ã«èšå®ããå¿
èŠããããŸãã 倧ããªãªã¯ã¿ãŒãïŒE2ïŒã®miåšæ³¢æ°ãèŠã€ããã«ã¯ãE2ãA4ã®5ããŒãäžã«ããããã
n
ã«
-5
å€ãå²ãåœãŠãå¿
èŠããããŸãã ãŸããéã®æäœãè¡ã£ãŠãç¹å®ã®é »åºŠã§ïŒA4ã«é¢é£ããïŒããŒããèŠã€ããããšãã§ããŸãã
n = Math.round( 12.0 * Math.log( f / 440.0 ) * Math.LOG2E );
ãããã®èšç®ã¯ãé³ã®åšæ³¢æ°ã
察æ°ã§ããããæ©èœããŸããåšæ³¢æ°ã2åãããšé³ã1ãªã¯ã¿ãŒãäžã«ã·ãããã2ã§é€ç®ãããš1ãªã¯ã¿ãŒãé³ãäœããªããŸãã
ããžã¿ã«é³æ³¢
ããžã¿ã«ã®äžçã§ã¯ãé³æ³¢ã¯ãã€ããªããŒã¿ãšããŠä¿åããå¿
èŠããããããã¯éåžžãé³æ³¢ã®ç¶æ
ïŒãŸãã¯ãµã³ãã«ïŒã®å®æçãªã¹ãããã·ã§ãããäœæããããšã«ãã£ãŠè¡ãããŸãã é³ã®æç¶æéã®1ç§ããšã«åä¿¡ãããæ³¢ã®ãµã³ãã«ã®æ°ã¯
ããµã³ããªã³ã°åšæ³¢æ°ãšåŒã°ã
ãŸã ãã€ãŸãããµã³ããªã³ã°åšæ³¢æ°44100ã®é³ã«ã¯ãé³ã®æç¶æéã®1ç§ããã44100ã®æ³¢ã®ãµã³ãã«ãå«ãŸããŸãã
以äžã®å³ã¯ãé³æ³¢ããµã³ããªã³ã°ããæ¹æ³ã瀺ããŠããŸãã

å³ã®çœãç¹ã¯ããµã³ããªã³ã°ãããŠããžã¿ã«åœ¢åŒã§ä¿åãããæ³¢ã®æ¯å¹
ãã€ã³ãã瀺ããŠããŸãã ããããããã®è§£å床ãšããŠãããã䜿çšã§ããŸãïŒããããããã«ãã¯ã»ã«ãå€ãã»ã©ãæ ŒçŽã§ããèŠèŠæ
å ±ãå€ããªããæ
å ±éãå¢ãããšãã¡ã€ã«ãµã€ãºã倧ãããªããŸãïŒããã§ã¯å§çž®ãèæ
®ããŸããïŒã åãããšãããžã¿ã«ãµãŠã³ãã«ãåœãŠã¯ãŸããŸãããµãŠã³ããã¡ã€ã«ã«å«ãŸãããŠã§ãŒããµã³ãã«ãå€ãã»ã©ãåçŸããããµãŠã³ããŠã§ãŒãã¯ããæ£ç¢ºã«ãªããŸãã
ãµã³ããªã³ã°åšæ³¢æ°ã«å ããŠãããžã¿ã«ãµãŠã³ãã«ã¯ããã/ç§ã§æž¬å®ãããããã
ã¬ãŒãããããŸãã ãããã¬ãŒãïŒãããã¬ãŒãïŒã¯ãå波圢ãµã³ãã«ã®ä¿åã«äœ¿çšããããã€ããªãããã®æ°ã«ãã£ãŠç°ãªããŸãã ããã¯ãããããããã®åãã¯ã»ã«ã®ARGBæ
å ±ãæ ŒçŽããããã«äœ¿çšããããããæ°ã«äŒŒãŠããŸãã ããšãã°ããµã³ããªã³ã°åšæ³¢æ°ã44100ã§ãããã¬ãŒãã705600ã®ãµãŠã³ãã¯ãåæ³¢ã®ãµã³ãã«ã16ãããå€ãšããŠä¿åããŸãã次ã®ã³ãŒãã䜿çšãããšãéåžžã«ç°¡åã«èšç®ã§ããŸãã
bitsPerSample = bitRate / sampleRate;
äžèšã®å€ã䜿çšããå®çšçãªäŸã次ã«ç€ºããŸãã
trace( 705600 / 44100 );
ããã§æãéèŠãªããšã¯ããµãŠã³ããµã³ãã«ãšã¯äœããç解ããããšã§ãã äœæãããšã³ãžã³ã¯ãçã®ãµãŠã³ããµã³ãã«ãçæããã³æäœããŸãã
å€èª¿åš
ãµãŠã³ããšã³ãžã³ã®ããã°ã©ãã³ã°ãéå§ããåã«ãã¢ããã°ã·ã³ã»ãµã€ã¶ãŒãšããžã¿ã«ã·ã³ã»ãµã€ã¶ãŒã®äž¡æ¹ã§ç©æ¥µçã«äœ¿çšãããŠãã
å€èª¿åšãšããå¥ã®æŠå¿µãç解ããå¿
èŠããããŸãã æ¬è³ªçã«ãå€èª¿åšã¯æšæºçãªæ³¢ã§ãããéåžžã¯é³ãäœæãã代ããã«ãé³æ³¢ã®1ã€ãŸãã¯è€æ°ã®ããããã£ïŒã€ãŸããæ¯å¹
ãŸãã¯åšæ³¢æ°ïŒãå€èª¿ããããã«äœ¿çšãããŸãã
ããšãã°ã
vibratoã䜿çšããŸãã ããã©ãŒãã¯ãåšæçã«èåããé«ãã®å€åã§ãã å€èª¿åšã䜿çšããŠãã®ãããªå¹æãäœæããã«ã¯ãæ£åŒŠæ³¢ã®å€èª¿æ³¢ãèšå®ããå€èª¿åšæ³¢æ°ãããšãã°8 Hzã«èšå®ããŸãã ãã®åŸããã®å€èª¿åšãé³æ³¢ã®åšæ³¢æ°ã«æ¥ç¶ãããšãããã©ãŒãå¹æãåŸãããŸããå€èª¿åšã¯ãé³æ³¢ã®åšæ³¢æ°ïŒé«ãïŒã1ç§éã«8ååŸã
ã«å¢æžãããŸãã
äœæãããšã³ãžã³ã«ãããã¢ãžã¥ã¬ãŒã¿ãŒããµãŠã³ãã«ã¢ã¿ããããŠãããŸããŸãªãšãã§ã¯ããå¹
åºãæäŸã§ããŸãã
ãã¢ãªãŒãã£ãªãšã³ãžã³
ãã®ããŒãã§ã¯ãå®å
šãªãªãŒãã£ãªãšã³ãžã³ã«å¿
èŠãªãã¹ãŠã®åºæ¬ã³ãŒããèšè¿°ããŸãã ãªãŒãã£ãªãšã³ãžã³ïŒFlashïŒã®ç°¡åãªãã¢ã次ã«ç€ºããŸã
ãdemo ã
ãã®ãã¢ã§ã¯ã1ã€ã®ãµãŠã³ãã®ã¿ãåçãããŸããããµãŠã³ãã®åšæ³¢æ°ã¯ã©ã³ãã ã«å€åããŸãã ã¢ãžã¥ã¬ãŒã¿ãŒããµãŠã³ãã«æ¥ç¶ãããããã©ãŒãå¹æãäœæããŸãïŒãµãŠã³ãã®æ¯å¹
ãå€èª¿ããããšã«ããïŒãã¢ãžã¥ã¬ãŒã¿ãŒã®åšæ³¢æ°ãã©ã³ãã ã«å€åããŸãã
ã¯ã©ã¹AudioWaveform
æåã«äœæããã¯ã©ã¹ã¯ããšã³ãžã³ããµãŠã³ããçæããããã«äœ¿çšãããŠã§ãŒãã®å®æ°å€ãä¿åããã ãã§ãã
noise
ãšããæ°ããã¯ã©ã¹ããã±ãŒãžãäœæããŠããã次ã®ã¯ã©ã¹ããã®ããã±ãŒãžã«è¿œå ããŸãã
package noise { public final class AudioWaveform { static public const PULSE:int = 0; static public const SAWTOOTH:int = 1; static public const SINE:int = 2; static public const TRIANGLE:int = 3; } }
ãŸããã¯ã©ã¹ã«éçãªäžè¬ã¡ãœãããè¿œå ããŸããããã¯ãæ³¢ã®å€ã確èªããããã«äœ¿çšã§ããŸãã ãã®ã¡ãœããã¯ãæ³¢ã®å€ã®æ£ç¢ºãã«å¿ããŠ
true
ãŸãã¯
false
ãè¿ããŸãã
static public function validate( waveform:int ):Boolean { if( waveform == PULSE ) return true; if( waveform == SAWTOOTH ) return true; if( waveform == SINE ) return true; if( waveform == TRIANGLE ) return true; return false; }
æåŸã«ãã¯ã©ã¹ãäœæããçç±ããªããããã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åããä¿è·ããå¿
èŠããããŸãã ããã¯ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒå
ã§å®è¡ã§ããŸãã
public function AudioWaveform() { throw new Error( "AudioWaveform class cannot be instantiated" ); }
ããã§ãã¯ã©ã¹ã®äœæãå®äºããŸããã
åæåã®ã¯ã©ã¹ãå®å
šã«éçãªã¯ã©ã¹ãããã³ã·ã³ã°ã«ãã³ã¯ã©ã¹ãçŽæ¥ã€ã³ã¹ã¿ã³ã¹åããªãããã«ä¿è·ããããšããå§ãããŸãããã®ãããªã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯äœæããªãã§ãã ãããããã«ã¯çç±ããããŸããã Javaãªã©ã®äžéšã®ããã°ã©ãã³ã°èšèªã§ã¯ããããã®ã¿ã€ãã®ã¯ã©ã¹ã®ã»ãšãã©ã§ããã¯èªåçã«è¡ãããŸãããActionScript 3.0ã§ã¯ãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒå
ã§ãã®åäœã匷å¶ããå¿
èŠããããŸãã
ãªãŒãã£ãªã¯ã©ã¹
ãªã¹ãã®æ¬¡ã¯
Audio
ã¯ã©ã¹ã§ãã ãã®æ§è³ªäžããã®ã¯ã©ã¹ã¯ãã€ãã£ãActionScript 3.0
Sound
ã¯ã©ã¹ã«äŒŒãŠãããåãªãŒãã£ãªãšã³ãžã³ã¯
Audio
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãšããŠæ瀺ãããŸãã
次ã®ã¹ã±ã«ãã³ã
noise
ããã±ãŒãžã«è¿œå ããŸãã
package noise { public class Audio { public function Audio() {} } }
ã¯ã©ã¹ã«æåã«è¿œå ããå¿
èŠãããã®ã¯ããµãŠã³ããåçãããšãã«ãªãŒãã£ãªãšã³ãžã³ã«ãµãŠã³ããŠã§ãŒããçæããæ¹æ³ãäŒããããããã£ã§ãã ãããã®ããããã£ã¯ããµãŠã³ãã§äœ¿çšãããæ³¢ã®çš®é¡ãæ³¢ã®åšæ³¢æ°ãšæ¯å¹
ãé³ã®æç¶æéãæžè¡°æéã§ãã ãããã®ããããã£ã¯ãã¹ãŠãã©ã€ããŒãã§ãããããããžã®ã¢ã¯ã»ã¹ã¯ã²ãã¿ãŒ/ã»ãã¿ãŒãä»ããŠè¡ãããŸãã
private var m_waveform:int = AudioWaveform.PULSE; private var m_frequency:Number = 100.0; private var m_amplitude:Number = 0.5; private var m_duration:Number = 0.2; private var m_release:Number = 0.2;
ã芧ã®ãšãããåããããã£ã«é©åãªããã©ã«ãå€ãèšå®ããŠããŸãã
amplitude
ã¯
0.0
ã®ç¯å²ã®å€ã§ã
frequency
Hzåäœã§ã
duration
ãš
release
ã¯ç§åäœã§ãã
ãŸãããµãŠã³ãã«æ¥ç¶ãããã¢ãžã¥ã¬ãŒã¿ãŒã®ãã©ã€ããŒãããããã£ã2ã€è¿œå ããå¿
èŠããããŸãã ãããã®ããããã£ãžã®ã¢ã¯ã»ã¹ã¯ãã²ãã¿ãŒ/ã»ãã¿ãŒçµç±ã§ãè¡ãããŸãã
private var m_frequencyModulator:AudioModulator = null; private var m_amplitudeModulator:AudioModulator = null;
æåŸã«ã
Audio
ã¯ã©ã¹ã«ã¯ã
AudioEngine
ã¯ã©ã¹ã®ã¿ãã¢ã¯ã»ã¹ã§ããããã€ãã®å
éšããããã£ãå«ãŸããŠããå¿
èŠããããŸãïŒããã«èšè¿°ããŸãïŒã ãããã®ããããã£ã¯ãã²ãã¿ãŒ/ã»ãã¿ãŒã®åŸãã«é ãå¿
èŠã¯ãããŸããã
internal var position:Number = 0.0; internal var playing:Boolean = false; internal var releasing:Boolean = false; internal var samples:Vector.<Number> = null;
position
ã¯ç§åäœã§èšå®ããã
AudioEngine
ã¯ã©ã¹
AudioEngine
åçäžã®ãµãŠã³ãã®äœçœ®
AudioEngine
远跡ã§ããããã«ããŸãã ããã¯ãé³æ³¢ãµã³ãã«ãèšç®ããããã«å¿
èŠã§ãã
playing
ãš
releasing
ã¯ã
AudioEngine
ã¯ã©ã¹ã«ãµãŠã³ãã®ç¶æ
releasing
äŒãã
samples
ããããã£ã¯ããµãŠã³ãã§äœ¿çšããããã£ãã·ã¥ããããŠã§ãŒããµã³ãã«ãžã®åç
§ã§ãã ãããã®ããããã£ã®äœ¿çšæ¹æ³ã¯ã
AudioEngine
ã¯ã©ã¹ãèšè¿°ãããšãã«ããããŸãã
Audio
ã¯ã©ã¹ãçµäºããã«ã¯ãã²ãã¿ãŒ/ã»ãã¿ãŒãè¿œå ããå¿
èŠããããŸãã
Audio. waveform
public final function get waveform():int { return m_waveform; } public final function set waveform( value:int ):void { if( AudioWaveform.isValid( value ) == false ) { return; } switch( value ) { case AudioWaveform.PULSE: samples = AudioEngine.PULSE; break; case AudioWaveform.SAWTOOTH: samples = AudioEngine.SAWTOOTH; break; case AudioWaveform.SINE: samples = AudioEngine.SINE; break; case AudioWaveform.TRIANGLE: samples = AudioEngine.TRIANGLE; break; } m_waveform = value; }
Audio. frequency
[Inline] public final function get frequency():Number { return m_frequency; } public final function set frequency( value:Number ):void {
Audio. amplitude
[Inline] public final function get amplitude():Number { return m_amplitude; } public final function set amplitude( value:Number ):void {
Audio. duration
[Inline] public final function get duration():Number { return m_duration; } public final function set duration( value:Number ):void {
Audio. release
[Inline] public final function get release():Number { return m_release; } public function set release( value:Number ):void {
Audio. frequencyModulator
[Inline] public final function get frequencyModulator():AudioModulator { return m_frequencyModulator; } public final function set frequencyModulator( value:AudioModulator ):void { m_frequencyModulator = value; }
Audio. amplitudeModulator
[Inline] public final function get amplitudeModulator():AudioModulator { return m_amplitudeModulator; } public final function set amplitudeModulator( value:AudioModulator ):void { m_amplitudeModulator = value; }
ãã¡ãããããã€ãã®ã²ãã¿ãŒé¢æ°ã«é¢é£ä»ãããã
[Inline]
ã¡ã¿ããŒã¿ã©ãã«ã«æ°ã¥ããŸãã ãã®ã¡ã¿ããŒã¿ã©ãã«ã¯
ActionScript 3.0ã³ã³ãã€ã©ã®æ©èœã§ããããã®ååã瀺ããšããã«æ©èœããŸããã€ãŸããé¢æ°ã®ã³ã³ãã³ãã
åã蟌㿠ïŒæ¡åŒµïŒããŸãã è³¢æã«äœ¿çšãããšããã®æ©èœã¯æé©åã«éåžžã«åœ¹ç«ã¡ãæé©åããã°ã©ã ã®å®è¡äžã«ãã€ãããã¯ãªãŒãã£ãªä¿¡å·ãçæããã¿ã¹ã¯ã¯ééããªãå¿
èŠã§ãã
AudioModulatorã¯ã©ã¹
AudioModulator
ã®
AudioModulator
ã
Audio
ã€ã³ã¹ã¿ã³ã¹ã®æ¯å¹
ãšåšæ³¢æ°ãå€èª¿ããŠãããŸããŸãªæçšãªãšãã§ã¯ããäœæããæ©èœãæäŸããããšã§ãã ã¢ãžã¥ã¬ãŒã¿ãŒã¯å®éã«ã¯
Audio
ã€ã³ã¹ã¿ã³ã¹ã«äŒŒãŠããã波圢ãæ¯å¹
ãããã³åšæ³¢æ°ãæã£ãŠããŸãããå¯èŽé³ã¯äœæãããä»ã®é³ã®ã¿ãå€æŽããŸãã
æåããå§ããŸããã
noise
ããã±ãŒãžã«æ¬¡ã®ã¯ã©ã¹ã¹ã±ã«ãã³ãäœæããŸãã
package noise { public class AudioModulator { public function AudioModulator() {} } }
次ã«ããã©ã€ããŒãããããã£ãè¿œå ããŸãã
private var m_waveform:int = AudioWaveform.SINE; private var m_frequency:Number = 4.0; private var m_amplitude:Number = 1.0; private var m_shift:Number = 0.0; private var m_samples:Vector.<Number> = null;
ããã
Audio
ã¯ã©ã¹ã«éåžžã«äŒŒãŠãããšæãããå ŽåãééããããŸãããããã§ã¯ã
shift
ããããã£ãé€ããŠãã¹ãŠãåãã§ãã
shift
ããããã£ã®æ©èœãç解ããã«ã¯ããªãŒãã£ãªãšã³ãžã³ã§äœ¿çšãããåºæ¬çãªæ³¢ïŒãã«ã¹ããã³ã®ãªæ³¢ãæ£åŒŠæ³¢ããŸãã¯äžè§åœ¢ïŒã®1ã€ãèŠããŠãã©ãã§ãæ³¢ãéãåçŽç·ãæ³åããŠãã ããã ãã®åçŽç·ã®æ°Žå¹³äœçœ®ã
shift
å€ã«ãªããŸãã ãã®å€ã®ç¯å²ã¯
0.0
ãå€èª¿åšã«æ³¢ã®èªã¿åããéå§ããå Žæãæ瀺ããŸãã ãŸããã¢ãžã¥ã¬ãŒã¿ãŒã«ãã£ãŠãµãŠã³ãã®æ¯å¹
ãŸãã¯åšæ³¢æ°ã«å ããããå€æŽã«çµ¶å¯Ÿçãªåœ±é¿ãåãŒããŸãã
ããšãã°ãå€èª¿åšãæ£åŒŠæ³¢ã䜿çšããŠé³ã®åšæ³¢æ°ãå€èª¿ãã
shift
ã
0.0
ã«èšå®ãããŠããå Žåãé³ã®åšæ³¢æ°ã¯æåã«å¢å ããæ£åŒŠæ³¢ã®æ²çã«å¿ããŠäœäžããŸãã ãã ãã
shift
0.5
ã«èšå®ãããŠããå Žåãé³ã®åšæ³¢æ°ã¯æåã«æžå°ãããããã£ãŠå¢å ããŸãã
ããŠãã³ãŒãã«æ»ããŸãã
AudioModulator
ã¯ã
AudioEngine
ã®ã¿äœ¿çšãããå
éšã¡ãœããã1ã€å«ãŸããŠããŸãã ã¡ãœããã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
[Inline] internal final function process( time:Number ):Number { var p:int = 0; var s:Number = 0.0; if( m_shift != 0.0 ) { time += ( 1.0 / m_frequency ) * m_shift; } p = ( 44100 * m_frequency * time ) % 44100; s = m_samples[p]; return s * m_amplitude; }
ãã®æ©èœã¯é »ç¹ã«äœ¿çšãããããããã«ãã€ã³ã§ãããŸããå€èª¿åšãæ¥ç¶ãããŠããåçé³ããšã«ãå€ãã®å Žåããæ¯ç§44100åããšããæå³ã§ãïŒããã¯ãåã蟌ã¿ãéåžžã«äŸ¿å©ã§ãïŒã ãã®é¢æ°ã¯ãå€èª¿åšã䜿çšãã波圢ãããµãŠã³ããµã³ãã«ãåä¿¡ãããµã³ãã«ã®æ¯å¹
ãå€æŽããŠãçµæãè¿ããŸãã
AudioModulator
ã¯ã©ã¹ãå®äºããã«ã¯ãã²ãã¿ãŒ/ã»ãã¿ãŒãè¿œå ããŸãã
AudioModulator. waveform
public function get waveform():int { return m_waveform; } public function set waveform( value:int ):void { if( AudioWaveform.isValid( value ) == false ) { return; } switch( value ) { case AudioWaveform.PULSE: m_samples = AudioEngine.PULSE; break; case AudioWaveform.SAWTOOTH: m_samples = AudioEngine.SAWTOOTH; break; case AudioWaveform.SINE: m_samples = AudioEngine.SINE; break; case AudioWaveform.TRIANGLE: m_samples = AudioEngine.TRIANGLE; break; } m_waveform = value; }
AudioModulator. frequency
public function get frequency():Number { return m_frequency; } public function set frequency( value:Number ):void {
AudioModulator. amplitude
public function get amplitude():Number { return m_amplitude; } public function set amplitude( value:Number ):void {
AudioModulator. shift
public function get shift():Number { return m_shift; } public function set shift( value:Number ):void {
ãŸãããã®
AudioModulator
ã¯ã©ã¹ã¯å®å
šãšèŠãªãããšãã§ããŸãã
AudioEngineã¯ã©ã¹
ææŠã®ããã«ïŒ
AudioEngine
ã¯ã©ã¹ã ããã¯å®å
šã«éçãªã¯ã©ã¹ã§ãã
Audio
ã€ã³ã¹ã¿ã³ã¹ãšãµãŠã³ãçæã«é¢é£ããã»ãŒãã¹ãŠã管çããŸãã
noise
ã®ããã¯ã©ã¹ã®ã¹ã±ã«ãã³ããéåžžéãå§ããŸãããïŒ
package noise { import flash.events.SampleDataEvent; import flash.media.Sound; import flash.media.SoundChannel; import flash.utils.ByteArray;
åè¿°ã®ããã«ãå®å
šã«éçãªã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯äœæããªãã§ãã ããããããã£ãŠã誰ããã€ã³ã¹ã¿ã³ã¹ãäœæããããšãããšãã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§äŸå€ãã¹ããŒãããŸãã å®å
šã«éçãªã¯ã©ã¹ãæ¡åŒµããçç±ããªããããã¯ã©ã¹ã
final
ã§ãã
ãã®ã¯ã©ã¹ã«æåã«è¿œå ããã®ã¯ãå
éšå®æ°ã§ãã ãããã®å®æ°ã¯ããªãŒãã£ãªãšã³ãžã³ã§äœ¿çšããã4ã€ã®å波圢ã®ãµã³ãã«ããã£ãã·ã¥ããããã«äœ¿çšãããŸãã åãã£ãã·ã¥ã«ã¯44,100åã®ãµã³ãã«ãå«ãŸããŠãããããã¯1 Hzã®æ³¢åœ¢ã«çžåœããŸãã ããã«ããããªãŒãã£ãªãšã³ãžã³ã¯éåžžã«ã¯ãªãŒã³ã§äœåšæ³¢ã®é³æ³¢ãäœæã§ããŸãã
次ã®å®æ°ã䜿çšãããŸãã
static internal const PULSE:Vector.<Number> = new Vector.<Number>( 44100 ); static internal const SAWTOOTH:Vector.<Number> = new Vector.<Number>( 44100 ); static internal const SINE:Vector.<Number> = new Vector.<Number>( 44100 ); static internal const TRIANGLE:Vector.<Number> = new Vector.<Number>( 44100 );
ãã®ã¯ã©ã¹ã¯ã2ã€ã®ãã©ã€ããŒãå®æ°ã䜿çšããŸãã
static private const BUFFER_SIZE:int = 2048; static private const SAMPLE_TIME:Number = 1.0 / 44100.0;
BUFFER_SIZE
ã¯ããªãŒãã£ãªãµã³ãã«ããªã¯ãšã¹ããããšãã«ActionScript 3.0ãªãŒãã£ãªAPIã«è»¢éããããµãŠã³ããµã³ãã«ã®æ°ã§ãã ããã¯ãèš±å¯ããããµã³ãã«ã®æå°æ°ã§ãããé³ã®ã¬ã€ãã³ã·ãå¯èœãªéãå°ããããŸãã ãµã³ãã«ã®æ°ãå¢ãããŠCPUã®è² è·ãæžããããšãã§ããŸãããããã«ãããµãŠã³ãã®ã¬ã€ãã³ã·ãå¢å ããŸãã
SAMPLE_TIME
ã¯ã1ã€ã®ãµãŠã³ããµã³ãã«ã®é·ãïŒç§ïŒã§ãã
ãããŠä»ããã©ã€ããŒãå€æ°ïŒ
static private var m_position:Number = 0.0; static private var m_amplitude:Number = 0.5; static private var m_soundStream:Sound = null; static private var m_soundChannel:SoundChannel = null; static private var m_audioList:Vector.<Audio> = new Vector.<Audio>(); static private var m_sampleList:Vector.<Number> = new Vector.<Number>( BUFFER_SIZE );
m_position
ããµãŠã³ãã¹ããªãŒãã³ã°æéãç§åäœã§è¿œè·¡ããããã«äœ¿çšãããŸããm_amplitude
ã¯ããã¹ãŠã®åçå¯èœãªAudio
ã€ã³ã¹ã¿ã³ã¹ã®ã°ããŒãã«ãªã»ã«ã³ããªæ¯å¹
ã§ããm_soundStream
ããã³m_soundChannel
ã¯èª¬æã¯äžèŠã§ããm_audioList
ã¯ã Audio
ãã¹ãŠã®è€è£œã€ã³ã¹ã¿ã³ã¹ãžã®ãªã³ã¯ãå«ãŸããŠããŸããm_sampleList
ã¯ãActionScript 3.0ãªãŒãã£ãªAPIããèŠæ±ããããµãŠã³ããµã³ãã«ãæ ŒçŽããããã«äœ¿çšãããäžæãããã¡ãŒã§ãã
次ã«ãã¯ã©ã¹ãåæåããå¿
èŠããããŸãã ãããè¡ãã«ã¯å€ãã®æ¹æ³ããããŸãããç§ã¯ã·ã³ãã«ã§ç°¡åãªéçã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ã奜ã¿ãŸãïŒ
static private function $AudioEngine():void { var i:int = 0; var n:int = 44100; var p:Number = 0.0;
ãã®ã³ãŒãã§ã¯ã次ã®ããšãè¡ãããŸãã4ã€ã®æ³¢åœ¢ã®ããããã«å¯ŸããŠãµã³ãã«ãçæããã³ãã£ãã·ã¥ãããããã¯1åã ãçºçããŸãã ãªãŒãã£ãªã¹ããªãŒã ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããã¢ããªã±ãŒã·ã§ã³ãå®äºãããŸã§éå§ããã³åçãããŸãã
AudioEngine
ã¯ã©ã¹ã«ã¯ã
Audio
ã€ã³ã¹ã¿ã³ã¹ãåçããã³åæ¢ããããã«äœ¿çšããã3ã€ã®äžè¬çãªã¡ãœããããããŸãã
AudioEngine. play()
static public function play( audio:Audio ):void { if( audio.playing == false ) { m_audioList.push( audio ); }
AudioEngine. stop()
static public function stop( audio:Audio, allowRelease:Boolean = true ):void { if( audio.playing == false ) {
AudioEngine. stopAll()
static public function stopAll( allowRelease:Boolean = true ):void { var i:int = 0; var n:int = m_audioList.length; var o:Audio = null;
ãããŠãããã§ã¯ããµãŠã³ãåŠçã®åºæ¬çãªæ¹æ³ã«é²ã¿ãŸããåæ¹æ³ã¯ãã©ã€ããŒãã§ããAudioEngine. onSampleData()
static private function onSampleData( event:SampleDataEvent ):void { var i:int = 0; var n:int = BUFFER_SIZE; var s:Number = 0.0; var b:ByteArray = event.data;
ãã®ãããæåã®æ§æif
ã§m_soundChannel
ã¯ããŸã nullã§ãããã©ããã確èªããŸãããããå¿
èŠãªã®ã¯SAMPLE_DATA
ãã¡ãœãããåŒã³åºããããšãm_soundStream.play()
ã¡ãœãããã€ã³ã¹ã¿ã³ã¹ãè¿ãæ©äŒãåŸãåã§ãã£ãŠããã€ãã³ããããã«ãã£ã¹ããããããããSoundChannel
ã§ããã«ãŒãwhile
ã¯ãèŠæ±ããããµãŠã³ããµã³ãã«ããã€ãã¹m_soundStream
ããã€ã³ã¹ã¿ã³ã¹ã«æžã蟌ã¿ãŸãByteArray
ããµãŠã³ããµã³ãã«ã¯ã次ã®æ¹æ³ã§çæãããŸããAudioEngine. generateSamples()
static private function generateSamples():void { var i:int = 0; var n:int = m_audioList.length; var j:int = 0; var k:int = BUFFER_SIZE; var p:int = 0; var f:Number = 0.0; var a:Number = 0.0; var s:Number = 0.0; var o:Audio = null;
æåŸã«ããã¹ãŠãå®äºããããã«ããã©ã€ããŒãå€æ°ã®ã²ãã¿ãŒ/ã»ãã¿ãŒãè¿œå ããå¿
èŠããããŸãm_amplitude
ã static public function get amplitude():Number { return m_amplitude; } static public function set amplitude( value:Number ):void {
ãªãŒãã£ãªããã»ããµã®ãã¢
ãã®ããŒãã§ã¯ãããŒã¹ãšã³ãžã³ã«ãªãŒãã£ãªããã»ããµãè¿œå ããåçŽãªé
延ããã»ããµãäœæããŸãããã®ãã¢ã¯ãåäœäžã®é
延ããã»ããµãŒïŒFlashïŒã瀺ããŠããŸãïŒdemoããã®ãã¢ã§ã¯ã1ã€ã®é³ã®ã¿ãåçãããŸãããé³ã®åšæ³¢æ°ã¯ã©ã³ãã ã«å€åãããšã³ãžã³ã«ãã£ãŠçæããããµã³ãã«ã¯é
延ããã»ããµãŒãééãããã§ãŒãã£ã³ã°ãšã³ãŒå¹æãäœæããŸãã
ã¯ã©ã¹AudioProcessor
æåã«è¡ãããšã¯ããªãŒãã£ãªããã»ããµã®åºæ¬ã¯ã©ã¹ãäœæããããšã§ãã package noise { public class AudioProcessor {
ã芧ã®ãšããããã®ã¯ã©ã¹ã¯éåžžã«åçŽã§ããµã³ãã«ã®åŠçãå¿
èŠãªãšãã«process()
ã¯ã©ã¹ã«ãã£ãŠåŒã³åºãããå
éšã¡ãœãããšãããã»ããµã®ãªã³ãšãªããåãæ¿ããããã«äœ¿çšã§ããAudioEngine
äžè¬çãªããããã£enabled
ãå«ãŸããŠããŸãã
AudioDelayã¯ã©ã¹
ã¯ã©ã¹AudioDelay
ã¯ãé³ã®é
ãèªäœãäœæããã¯ã©ã¹ã§ãã圌ã¯ã¯ã©ã¹ãåºããŠãAudioProcessor
ãŸãã以äžã¯ã䜿çšãã空ã®ã¯ã©ã¹ã®ã¹ã±ã«ãã³ã§ãã package noise { public class AudioDelay extends AudioProcessor {
time
ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããåŒæ°ã¯ãé
延ã·ãŒã±ã³ã¹ã®æéïŒç§åäœïŒãã€ãŸãåãµãŠã³ãé
延éã®æéã§ãããã©ã€ããŒãããããã£ãè¿œå ããŸãããã private var m_buffer:Vector.<Number> = new Vector.<Number>(); private var m_bufferSize:int = 0; private var m_bufferIndex:int = 0; private var m_time:Number = 0.0; private var m_gain:Number = 0.8;
ãã¯ãã«m_buffer
ã¯ãã£ãŒãããã¯ã«ãŒãã§ããã¡ãœããprocess
ã«éä¿¡ããããã¹ãŠã®ãµãŠã³ããµã³ãã«ãå«ãŸãããããã®ãµã³ãã«ã¯m_bufferIndex
ãããã¡ãŒãééããéãåžžã«å€æŽãããŸãïŒãã®å Žåãæ¯å¹
ãæžå°ããŸãïŒãããã¯ãã¡ãœããã«å°éãããšãã«æå³ãããprocess()
ãŸããããããã£m_bufferSize
ãšm_bufferIndex
ã¯ããããã¡ã®ã¹ããŒã¿ã¹ãç£èŠããããã«äœ¿çšãããŸããããããã£m_time
ã¯ãç§åäœã®é
延æéã§ããããããã£m_gain
ã¯ããããã¡ãªã³ã°ããããµãŠã³ããµã³ãã«ã®æ¯å¹
ãçµæçã«æžå°ãããããã«äœ¿çšãããèŠå ã§ãããã®ã¯ã©ã¹ã«ã¯ã¡ãœããã1ã€ãããªããã¯ã©ã¹å
ã®ã¡ãœããprocess()
ããªãŒããŒã©ã€ãããå
éšã¡ãœããã§ããprocess()
AudioProcessor
internal override function process( samples:Vector.<Number> ):void { var i:int = 0; var n:int = samples.length; var v:Number = 0.0;
æåŸã«ãæã
ã¯ããã©ã€ããŒãããããã£ã®ã²ãã¿ãŒ/ã»ãã¿ãŒãè¿œå ããå¿
èŠããããŸãm_time
ãšm_gain
ïŒ public function get time():Number { return m_time; } public function set time( value:Number ):void {
public function get gain():Number { return m_gain; } public function set gain( value:Number ):void {
ä¿¡ããããªããããããŸããããããã§ã¯ã©ã¹ã¯AudioDelay
çµããã§ããå®éããã£ãŒãããã¯ã«ãŒãïŒããããã£m_buffer
ïŒã®ä»çµã¿ãç解ããŠããã°ããµãŠã³ãé
延ã®å®è£
ã¯éåžžã«ç°¡åã§ãã
ã¯ã©ã¹ã®æŽæ° AudioEngine
æåŸã«è¡ãAudioEngine
ããšã¯ããªãŒãã£ãªããã»ããµãè¿œå ã§ããããã«ã¯ã©ã¹ãæŽæ°ããããšã§ãããŸãããªãŒãã£ãªããã»ããµã®ã€ã³ã¹ã¿ã³ã¹ãä¿æãããã¯ãã«ãè¿œå ããŸãããã static private var m_processorList:Vector.<AudioProcessor> = new Vector.<AudioProcessor>();
å®éã«ã¯ã©ã¹AudioEngine
ã«ããã»ããµãè¿œå ããã³åé€ããã«ã¯ã2ã€ã®äžè¬çãªã¡ãœããã䜿çšããå¿
èŠããããŸããAudioEngine. addProcessor()
static public function addProcessor( processor:AudioProcessor ):void { if( m_processorList.indexOf( processor ) == -1 ) { m_processorList.push( processor ); } }
AudioEngine. removeProcessor()
static public function removeProcessor( processor:AudioProcessor ):void { var i:int = m_processorList.indexOf( processor ); if( i != -1 ) { m_processorList.splice( i, 1 ); } }
ãã¹ãŠãéåžžã«ç°¡åã§ãããããã®ã¡ãœããã¯ãã¹ãŠAudioProcessor
ããã¯ã¿ãŒã«ã€ã³ã¹ã¿ã³ã¹ãè¿œå ããã³åé€ããŸãm_processorList
ãæåŸã«è¿œå ããã¡ãœããã¯ããªãŒãã£ãªããã»ããµã®ãªã¹ãã調ã¹ãããã»ããµããªã³ã«ãªã£ãŠããå ŽåããµãŠã³ãã¡ãœãããããã»ããµã¡ãœããã«éä¿¡ããŸãprocess()
ã static private function processSamples():void { var i:int = 0; var n:int = m_processorList.length;
ã³ãŒãã®æåŸã®éšåãè¿œå ãããšããæ¥ãŸããããããããã©ã€ããŒãonSampleData()
ã¯ã©ã¹ã¡ãœããã«è¿œå ããå¿
èŠãããå¯äžã®è¡ã§ãAudioEngine
ã if( m_soundChannel == null ) { while( i < n ) { b.writeFloat( 0.0 ); b.writeFloat( 0.0 ); i++; } return; }
ã³ãŒãè¡ãã¯ã©ã¹ã«è¿œå ããŸã processSamples();
ã
processSamples()
å
ã»ã©è¿œå ããã¡ãœãããåŒã³åºãã ãã§ãã
ãããã«
å®éãããããã¹ãŠã§ãã
ãã¥ãŒããªã¢ã«ã®æåã®éšåã§ã¯ãããŸããŸãªæ³¢åœ¢ãšãé³æ³¢ãããžã¿ã«åœ¢åŒã§ä¿åããæ¹æ³ã«æ³šç®ããŸããã次ã«ãããŒã¹ã®ãªãŒãã£ãªãšã³ãžã³ã³ãŒããäœæãããªãŒãã£ãªããã»ããµãè¿œå ããŸããããã®ã³ãŒãã䜿çšãããšããã«å€ãã®ããšãã§ããŸãããå®è¡æã«ãªãŒãã£ãªãšã³ãžã³ãå®è¡ããå¿
èŠãããäœæ¥å
šäœãå¿ããªãããã«ããããšãéèŠã§ãããšã³ãžã³ãããŸãã«ãé«åºŠã«ïŒéåžžã«ç°¡åã«ïŒãããšãã²ãŒã å
šäœã®ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸã-ãªãŒãã£ãªãšã³ãžã³ãå¥ã®ã¹ããªãŒã ïŒãŸãã¯ã¯ãŒã«ãŒActionScript 3.0ïŒã«è»¢éããå Žåã§ããæ£ããå®è£
ãããŠããªããšãCPUæéã®å€§éšåãå æããŸãããã ããå€ãã®ãããã§ãã·ã§ãã«ã²ãŒã ããã³ããã»ã©å°éçã§ã¯ãªãã²ãŒã ã¯ãå®è¡æã«ãµãŠã³ãåŠçã®ã»ãšãã©ãå®è¡ããŸããããã¯ãåçãªãµãŠã³ããšãã§ã¯ããšé³æ¥œãã²ãŒã ãã¬ã€ã倧å¹
ã«è±ãã«ãããã¬ã€ã€ãŒãã²ãŒã ã®äžçãæ·±ãæãäžããããšãã§ããããã§ããäœæãããªãŒãã£ãªãšã³ãžã³ã¯ããã¡ã€ã«ããèªã¿èŸŒãŸãããµãŠã³ããšãã§ã¯ãã®éåžžã®ïŒçæãããŠããªãïŒãµã³ãã«ãç°¡åã«åŠçã§ããŸããæ¬è³ªçã«ãæãåçŽãªåœ¢åŒã®ãã¹ãŠã®ããžã¿ã«ãµãŠã³ãã¯ãµã³ãã«ã®ã·ãŒã±ã³ã¹ã§ããå¥ã®åŽé¢ãæ€èšãã䟡å€ããããŸãããµãŠã³ãã¯ã²ãŒã ã®éèŠãªéšåã§ãããèŠèŠçãªã³ã³ããŒãã³ããšåæ§ã«éèŠãã€åŒ·åã§ããã²ãŒã ã®å質ãå¿é
ãªå Žåã¯ãéçºã®æåŸã®ç¬éã«ã²ãŒã ã«èœãšããããã蟌ãã ãããªãã§ãã ãããé³ã®èšèšã«æéãããããšãæ°ä»ãããããšã¯ãããŸããããã¥ãŒããªã¢ã«ã楜ããã§ãããããäœã圹ã«ç«ã€ããšãåŠã¹ãããšãé¡ã£ãŠããŸããã²ãŒã ã®ãµãŠã³ãã«ã€ããŠããå°ãèãããšããŠããç§ã®ä»äºã¯ç¡é§ã«ãªã£ãŠãããšæããŸãããã¹ãŠã®ãœãŒã¹ã³ãŒããªãŒãã£ãªãšã³ãžã³ã¯ããããããŠã³ããŒãã§ããŸãã楜ããã§ãã ããïŒ