- ベストアンサー
javaで周波数や鳴る長さを設定できるプログラムを作りたいのですが
javaで周波数や鳴る長さを設定できるプログラムを作りたいのですが どんな方法で作れるのか分かりません。 ただのBeep音なら鳴らせるのですが周波数や長さを指定するにはどうしたらよいでしょう。 jBeepMakerというプログラムを見つけましたがplayボタンを押してもエラーが出て音がなりません。 javaでは無理なのでしょうか
- tranceporter
- お礼率58% (49/84)
- Java
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
どうも、#1です。 >せめてこのソースを理解できるようになるプログラミングの >良書など紹介していただけたらと思います Javaでピコピコシンセを作ってみよう! http://www.hakkaku.net/series/java%e3%81%a7%e3%83%94%e3%82%b3%e3%83%94%e3%82%b3%e3%82%b7%e3%83%b3%e3%82%bb%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86%ef%bc%81 このサイトを参考にしました。 ここを読んでもらった方がわかりやすいと思います。 あと、ご質問についてですが、 >SquareWaveのパラメータの440Fってどうして16進数なんでしょう これは、16進数ではなく、float型の440ってことです。 ラの音が440Hzだそうなので、そうしました。 と言うことで、frequency は、音波の周波数です。 >振幅(長さ?)をbyteでキャストしてるのもわかりません ここは長さというより、波動の上下の振り幅です。 音波でいうと、音の大きさですね。 コンピューターでは、波動を、それぞれの瞬間の振幅値を格納したbyte配列として表すので、最初から引数をbyte型にしたので、キャストしています。 >サンプリングレートと周波数の違いが分かりません ここでいう周波数は音波の周波数です。この値が大きくなると、音程は高くなり、逆だと低くなります。 サンプリングレートは、どれくらい細かく音波をデータ化するかを表します。 具体的にいうと、今回は、44100という数値を使っていますが、これは、CDのサンプリングレートが、44.1kHzなので、こうしました。 つまり、1秒分の音の波を44100個のbyte配列で表しているわけです。 この値が多くなればなるほど、細かくサンプル化することでできるので、オリジナルの波の形に近づきます。 逆に少なければ、データサイズは小さくてすみますが、波の形は、オリジナルの形より、デコボコになります。 >SquareWaveクラスのコンストラクタの中で 1/frequency * sampleRate >としているのはなんのためだか・・・ これは、波の一周期分が何個のbyte配列で表せるかを計算しています。 具体的にすると、 (1 / 440Hz) * 44100Hz ラの音は1秒間に440回振動します。逆に言えば、1周期分にかかる時間は、1/440 秒です。 サンプリングレートは、44100です。つまり、一秒分の波を44100個のbyte配列で表します。 では、今回の一周期分の波に使われるbyte配列の数は、44100 * 1/440 で、100.227 つまり、ラの音は、一周期分の波を100個のbyte配列で表すことができる、となります。
その他の回答 (2)
- PecoPlus
- ベストアンサー率76% (144/188)
続きです。 矩形波データのクラスです。 public class SquareWave { //周波数 private float frequency; //振幅 private byte amplitude; //サンプリングレート private float sampleRate; private byte[] data; public SquareWave(float frequency, byte amplitude, float sampleRate) { this.frequency = frequency; this.amplitude = amplitude; this.sampleRate = sampleRate; int dataSize = (int)((1 / frequency) * sampleRate); data = new byte[dataSize]; makeWave(); } private void makeWave() { for (int i = 0; i < data.length; i++) { byte d = amplitude; if (i >= data.length / 2) d = (byte)(d * -1); data[i] = d; } } public AudioFormat getAudioFormat() { return new AudioFormat(sampleRate, 8, 1, true, true); } public InputStream getInputStream(int playTime) { return new WaveInputStream(playTime); } //データのアクセス用に InputStream を使うことにしました。 private class WaveInputStream extends InputStream { private long frameLength; private long framePos; private int index; private WaveInputStream(int playTime) { frameLength = (long)((sampleRate / 1000) * playTime); framePos = 0; index = 0; } @Override public int read() throws IOException { if (framePos >= frameLength) { return -1; } framePos++; if (index >= data.length) index = 0; int i = index; index++; return 0xFF & data[i]; } } }
お礼
「プーー」と鳴りました ありがとうございます でもまだわからないことだらけで・・・ 短形波ってなんでしょう。周波数が一定なら波形(サインカーブ?)を描くことが想像できません。 SquareWaveのパラメータの440Fってどうして16進数なんでしょう 振幅(長さ?)をbyteでキャストしてるのもわかりません サンプリングレートと周波数の違いが分かりません SquareWaveクラスのコンストラクタの中で 1/frequency * sampleRate としているのはなんのためだか・・・ せっかく貴重な時間を使ってサンプルを書いてもらったのにこんなに質問づくしでご迷惑だと思います・・・ せめてこのソースを理解できるようになるプログラミングの良書など紹介していただけたらと思います ありがとうございました
補足
あ、周波数って波形ですよね、FMとAMを思い出しました。 もうどこがわからないか分からなくなってきました。 とにかく実現できるということがわかっただけでも感謝です。 ありがとうございました。
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは。 私も音を鳴らすのは初めてなのですが、サウンドAPIを使うのだと思います。 ビープ音は矩形波だと聞いたので、ちょっとサンプルを作ってみました。 一応、音が鳴ったので、こんな感じでいいと思うのですが。 public class App { public static void main(String[] args) throws LineUnavailableException { SquareWave wave = new SquareWave(440F, (byte)10, 44100); SourceDataLine line = AudioSystem.getSourceDataLine(wave.getAudioFormat()); line.open(wave.getAudioFormat()); line.start(); InputStream in = wave.getInputStream(1000); byte[] b = new byte[1024]; int len = 0; try { while ((len = in.read(b)) > -1) { line.write(b, 0, len); } line.drain(); } catch (IOException ex) { ex.printStackTrace(); } line.close(); } }
関連するQ&A
- 異なった周波数のBEEP音を左右別々に鳴らす
ヘッドホンまたはスピーカーから異なった周波数のBEEP音を左右別々に鳴らしたり,左右の音量を変えたりするにはどのようにしたらよいでしょうか? あらかじめ用意した音声ファイルを利用する以外の方法はありますか? Visual C++.netを利用しています.
- ベストアンサー
- C・C++・C#
- 計測器の設定について(周波数)
計測器の設定について(周波数) 計測器の周波数の設定方法についてご質問いたします。 現在、試験をするために計測器とデータロガーを接続しております。 周波数の設定として 計測器側が最大で2500Hz(400μs)まで設定できますのでこの周波数で計測したいと考えております。 ただ、データロガーの設定が計測間隔250μsと500μsしか設定できません。 この場合、計測器とデータロガーの計測間隔が違うとどういった問題が発生するでしょうか? 取得されたデータに問題はありますでしょうか?
- 締切済み
- その他(学問・教育)
- Audacityで音を録音するときにサンプリング周波数を設定して決めることはできますか?
よく、音の編集などでAudacityを使うことがあるのですが、このソフトで、音を録音するときに事前にサンプリング周波数を決めて録音することはできないのでしょうか? 録音ボタンを押して録音を始めると、必ず44.1kHzの32bitの設定で録音するのですが、この設定を変えることはできるのでしょうか?
- ベストアンサー
- その他([技術者向] コンピューター)
- Debian4.0インストール時の水平周波数・垂直周波数について
Debian4.0をインストールすると、 水平周波数・垂直周波数が範囲を超えている というエラーメッセージが表示されます。 そこで、xorg.confで解像度と水平周波数・垂直周波数を ディスプレイの使用を参考にして設定しました。 しかし、同様のエラーメッセージが表示されます。 解決方法を教えてください。 よろしくお願いします。
- ベストアンサー
- Linux系OS
- 周波数の変更
いろいろ接続完了したが、ラテックシステムのスマート家電リモコンに接続できない。指定の周波数は、2.4gになってるが、本ルータの周波数は5.0gに設定されており、それが原因と思う 変更する方法、教えて欲しい。 ※OKWAVEより補足:「エレコム株式会社の製品」についての質問です。
- 締切済み
- Wi-Fi・無線LAN
- iTripの周波数の設定方法
iPod用のFMトランスミッター、iTripの海外仕様を入手したのですが、好みの周波数に設定できません。といいますか方法が分かりません。 現在は自動的に89.7MHzに設定されていますが、これを任意の周波数に変更する方法がありましたら、どなたかお教えくださいますようお願いいたします。
- ベストアンサー
- Mac
- カーラジオの選局ボタンの周波数設定
FMトランスミッターを使用しカーラジオで音楽を聞こうとしてます。 ところが、FMトランスミッターの数種の設定周波数とカーラジオのボタンに割当てられてる周波数が違うため度々手動で設定しなおさなくてはなりません。 ラジオ側の特定のボタンを選んでFMトランスミッターの周波数に設定したいのですが車の取説を見ても分かりませんでした。 馬鹿な質問ですみませんが教えてください。 車は平成2年式トヨタラウム・・関係ないか?
- ベストアンサー
- その他(パソコン)
お礼
PCMとかの知識が必要なんでしょうか ピコピコシンセというサイトをよく読んでみようと思います。 また質問することがあったらよろしくお願いします。 ありがとうございました