[[How2Computing]] #author("2022-01-13T19:18:06+09:00","","") *音を鳴らすためのプログラミング [#l3c32aba] **適当な効果音を探す [#ydd14ea6] Mac OS Xでは、 /System/Library/Sounds/ にシステムが使う効果音があります。高品位なのでおすすめです。 **iOS で短いオーディオファイルを鳴らす [#u0e70eef] 上記にあるaiffファイルの一つを鳴らしてみます。 以下の方法では短い音ファイル(30秒以下)だけに対応しているようです。 +XcodeのResources に音ファイルをコピーします。ここではPurr.aiffを選びました。&br; http://gyazo.com/fe35dd58df78a225f23fecf3e6a1782c.png +XcodeのFrameworksを右クリックして、「追加」「既存のフレームワーク」を選んで、 その中から、Audio Toolbox. Framework を追加します&br; http://gyazo.com/e2186e6a371c778c0bb41b930a1ae1be.png +音を出したいプログラムの.hファイルで、 #import <AudioToolbox/AudioToolbox.h> および、変数を定義しておきます SystemSoundID soundID; +音を出したいプログラムの.mファイルの初期化部分で、 NSString *path = [[NSBundle mainBundle] pathForResource:@"Purr" ofType:@"aiff"]; NSURL *url = [NSURL fileURLWithPath:path]; AudioServicesCreateSystemSoundID((CFURLRef)url, &soundID); と用意しておき +.mで音を出したい部分で AudioServicesPlaySystemSound(soundID); を実行すれば音が出ます。 ** Javaでオーディオファイルを鳴らす [#g37f682c] 上記にあるaiffファイルの一つを鳴らしてみます。 import java.io.*; import javax.sound.sampled.*; public class AudioPlay { public static void main(String[] args) { try{ File audioFile = new File("/System/Library/Sounds/Ping.aiff"); AudioFormat format = AudioSystem.getAudioFileFormat(audioFile).getFormat(); DataLine.Info info = new DataLine.Info(Clip.class, format); Clip clip = (Clip)AudioSystem.getLine(info); clip.open(AudioSystem.getAudioInputStream(audioFile)); clip.start(); clip.drain(); clip.close(); } catch(Exception e){ e.printStackTrace(); } } } ** Javaで矩形波を鳴らす [#wbe90186] 純粋な矩形波、しかも高音の矩形波の場合、 サンプリングして作ったファイルを鳴らすよりも、 矩形波のデータを用意して鳴らしたほうが、当然ですが綺麗な波形が出ます。 以下は、 サンプル周波数20kHz, 8ビット分解能で作った10kHzの矩形波 (長さは1秒, うち前半0.5秒は音あり、後半0.5秒は無音) を再生する手順です。 import javax.sound.sampled.*; class sqwave { public static void main (String args[]) { byte wave05[]; int length05; //data length for 0.5 sec final int SAMPLE_RATE = 20000; //samling rate in Hz AudioFormat audioformat; //for audio SourceDataLine sourcedataline=null; //for audio audioformat = new AudioFormat(SAMPLE_RATE, 8, 1, true, true); //audio format DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioformat); if(!AudioSystem.isLineSupported(info)){ System.out.println("Line type not supported: "+info); System.exit(1); } try { sourcedataline = (SourceDataLine)AudioSystem.getLine(info); sourcedataline.open(audioformat, SAMPLE_RATE ); //try to open the sourcedataline } catch(LineUnavailableException e) { System.out.println(e); System.exit(1); } //prepare the sound data for 0.5 sec square wave and 0.5 sec no sound //number of data for 0.5sec length05=SAMPLE_RATE / 2; //prepare wave form data for 05 sec wave05= new byte[SAMPLE_RATE]; for(int i=0; i< wave05.length;i++) { if(i<length05) { if( (i % 2) == 0) wave05[i]=120; //square wave else wave05[i]=-120; //square wave } else { wave05[i]=0; //no sound for last 0.5sec } } sourcedataline.start(); sourcedataline.write(wave05, 0, wave05.length); } } これで音が鳴ります。音が鳴っている間に出来るコントロールには、 以下のようなものがあります。 sourcedataline.start(); sourcedataline.stop(); sourcedataline.drain(); sourcedataline.flush();