FotranとかcobolとかBasicとかCとかC++とかjavaとか…(以下略)
■ メインページ ■ サブボード修正
なんか違う方向に走っちゃったきがするので、返事を書き直しです(^^; > MidiSystem.getSequencer() で得られるのは「デフォルトのシーケンサ」 > だと思うのですが、違うでしょうか? その通りです。デフォルト以外のデバイスは MidiDevice.Info[] MidiSystem.getMidiDeviceInfo() で調べ、 MidiDevice MidiSystem.getMidiDevice(MidiDevice.Info info) でデバイスを取得と言うことになります。 他のデバイスの Sequencer は手に入れることはできないのです。 ファイルから手に入れた Sequence クラスのデータをセットして 再生するメソッドを持つのは Sequencer だけであるにもかかわらずです。 > そして、シーケンサ は デバイスの一種で、デバイス同士をトランスミッタと > レシーバを接続することによって、MIDIデータを処理し演奏するんだと > 思います。 〜 > よって、シーケンサのトランスミッタと、(MIDI音源)デバイスのレシーバを > 接続することによって、音が鳴るようになるのではないでしょうか? Sequencer extend MidiDevice なので、デバイスの一種なのは確かです。 そして、MidiDevice はレシーバとトランスミッタを持っていて、 シーケンサがもつトランスミッタを他のデバイスのレシーバに接続させ、 シーケンサを再生スタートさせれば tos さんが言うように他のデバイスが 鳴るはずです。しかし、そもそもシーケンサが手に入らないのです。 特にデフォルトデバイスがうちの環境でよく死ぬので・・・ って、ここまで書いて気づきましたが、最初に選択するデバイスは デフォルトシーケンサの取得でチェックしています。これ自体が分かると 言うことはシーケンサ自体は手に入れられているわけで、 その中のデバイスは死んでいるということになるのでしょうか。 つまり、シーケンサは再生するためのものであって、 デフォルトデバイスがついているのはおまけのようなものなんでしょうか? デフォルトではシーケンサが持つレシーバにシーケンサのトランスミッタが つながっていると。そういうわけでしょうか。 もしそうだったら tos さんの言うとおりで、私は大きな勘違いをしていた ようです(^^; シーケンサがデバイスであるということに惑わされていたわけですね。 まあ、とにかく試してみます。 GOO E-Mail: goo_n@hotmail.com
> ただ、勝手に IME-97 が出てきました。普段は ATOK13 を使っているのですが。 JAVA VM がそういうことをするようです。 Forte とか JBuilder も JAVA アプリケーションなので なぜか勝手に IME にされてしまってそうさが違うので困ってしまいます。 変換キーで ATOK 起動するようにしているので、 半角/全角キーに手を伸ばさなくてはならないだけで苦痛です。 と思ったら IME2000 の方でもこのようにキー設定を変えられました。 これで変換精度の違いくらいで我慢できるようになりました(^^; > あと、MIDIデバイスリストの日本語と思われる部分が文字化けしています。 これ、何かコード変換すれば表示できるんでしょうかね? コード変換の API あるかな... GOO E-Mail: goo_n@hotmail.com
自己レス > MidiDevice で渡されるけどインスタンスは Sequencer なんでしょうかね。 instanceof で調べてみたところ、JAVA Sound Sequencer に限って、 MidiDevice MidiSystem.getMidiDevice(MidiDevice.Info info) で得られる、MidiDevice が Sequencer でもあることが分かりました。 他のデバイスは全部 Sequencer ではないので (Sequencer)MidiDevice の キャストはできないんですね。 > このために例の見つけたコードでも (Sequencer)MidiDevice というキャストを > やっていたのかもしれません。JAVA Sound Sequencer が > Synthesizer でもあるというあたりがポイントでしょうか。 > これは説明にも書いてありますが MidiDevice instanceof Synthesizer > で調べられるらしいのでとりあえず表示できるようにしてみますね。 表示するようにしてみましたが、シンセサイザーってのはプログラム内で 音声合成を行うデバイスですので、JAVA Sound Synthesizer と JAVA Sound Sequencer がそれにあたると言うことが分かりました。 MidiDevice が Synthesizer であるかどうかは Sequencer で あるかどうかとは関係がないわけですね。とにかく JAVA Sound Sequencer だけ特別扱いなのははっきりしました。 GOO E-Mail: goo_n@hotmail.com
> そして、シーケンサ は デバイスの一種で、デバイス同士をトランスミッタと > レシーバを接続することによって、MIDIデータを処理し演奏するんだと > 思います。 なんで getSequencer(指定のデバイス) といった指定の仕方が 用意されていないのかが納得いかないところですが、 もしかしたら Sequencer ってのはデバイス情報だけでなく tos さんが言うようにつなぎ方などもできあがっていないと いけないためにそれがよく分かっているデフォルトデバイスに 限ってこういうわかりやすいインターフェイスを用意している のかなぁとか考えたりもします。 とにかく、tos さんはそっちの方向が正しいのではないかと あの説明からは読みとったわけですね。私もそっちしか残っていないと 思うのでその方向で考えてみようと思います。 > よって、シーケンサのトランスミッタと、(MIDI音源)デバイスのレシーバを > 接続することによって、音が鳴るようになるのではないでしょうか? そのシーケンサってのはシーケンスをセット(Sequencer.setSequence(Sequence)) してデバイス情報を持たない状態で再生するだけのデバイスとして 扱う形でしょうか。 ところで、今までデフォルトの JAVA Sound Sequencer が 死んでいて気づかなかったんですが、これに限っては例外違反が起きませんね。 MidiDevice で渡されるけどインスタンスは Sequencer なんでしょうかね。 このために例の見つけたコードでも (Sequencer)MidiDevice というキャストを やっていたのかもしれません。JAVA Sound Sequencer が Synthesizer でもあるというあたりがポイントでしょうか。 これは説明にも書いてありますが MidiDevice instanceof Synthesizer で調べられるらしいのでとりあえず表示できるようにしてみますね。 Synthesizer でない MidiDevice の場合は tos さんの言うような つなぎ合わせで実現する、と。 ちょっとあそこの説明ではわかりにくかったですが とりあえずシーケンスの再生スケジューリングはシーケンサしか やってくれないようなので、とりあえず試してみます。 GOO E-Mail: goo_n@hotmail.com
> ところで、うちではデフォルトデバイスである "JAVA Sound Sequencer" が > よく死んでしまってそれ以降ずっと使えない状態になってしまったりします。 > そういうことはありませんか? GOO さんのプログラムを操作していて、ハングしたことはありません。 ただ、勝手に IME-97 が出てきました。普段は ATOK13 を使っているのですが。 あと、MIDIデバイスリストの日本語と思われる部分が文字化けしています。 tos.
私は、GOO さんの示した資料を読んだだけなので本当の所は分かりませんが、 > Sequencer seq = MidiSystem.getSequencer(); でデフォルトデバイスの > Sequencer が手にはいるって言うのに ここが間違いだと思います。 MidiSystem.getSequencer() で得られるのは「デフォルトのシーケンサ」 だと思うのですが、違うでしょうか? そして、シーケンサ は デバイスの一種で、デバイス同士をトランスミッタと レシーバを接続することによって、MIDIデータを処理し演奏するんだと 思います。 第8章 MIDI パッケージの概要より シーケンサは、MIDI イベントのシーケンスの取り込み および再生を行うデバイスです。 よって、シーケンサのトランスミッタと、(MIDI音源)デバイスのレシーバを 接続することによって、音が鳴るようになるのではないでしょうか? tos.
シーケンサは、MIDI イベントのシーケンスの取り込み および再生を行うデバイスです。
> さっそくダウンロードしてみました。でも、先のデモを表示させようと > すると、再びインストール要求のウィンドウが出てきました。 > 私は一体何をダウンロードしたのでしょうか? ^^; インストールしてあるのにまた要求されたんですか?IE 用のは 入っていなかったんでしょうかね... > こちらは、ちゃんと実行することができました。とりあえず、これで > 安心と言ったところでしょうか。 とりあえずテストしてもらえる人がいてくれて心強いです(^^; ところで、うちではデフォルトデバイスである "JAVA Sound Sequencer" が よく死んでしまってそれ以降ずっと使えない状態になってしまったりします。 そういうことはありませんか? GOO E-Mail: goo_n@hotmail.com
> 眺めてみると Sequencer seq = (Sequencer)MidiDevice; > といったことをばっちりやっているではありませんか(^^; > というわけで、おそらく止まるのは別の理由だったのでしょう。 と思っていましたがやっぱりだめだったようです。 try & catch(JAVA 使うまで使ったことがなかった(ぉ してみたんですが、ClassCastExceprion が発生しています。 これはもう間違いないでしょう。 http://www.geocities.co.jp/SiliconValley-SanJose/4825/java/ ここで、デバイスが何か選択されていて、有効な MIDI ファイルの URL を 渡している状態で「再生・一時停止」を押すと Sequencer seq = (Sequencer)MidiDevice; の形の文を実行するように なっています。 最近になって多態性の使い方として、受け側にスーパークラスを使って 区別せずに済んでらくちん、ってのを何とか理解したところでして、 その逆なんてできるのか?いや、概念的にも何かおかしい、 とか思ってはいたんです。 さてこれでまた MidiDevice + Sequence = Sequencer でいけるはずの道が 閉ざされてしまいました。たぶん馬鹿なことで騒いでるんだと思うんです。 Sequencer seq = MidiSystem.getSequencer(); でデフォルトデバイスの Sequencer が手にはいるって言うのにデフォルト以外の Sequencer を得るための システムメソッドが用意されていないわけですし、説明の方でも MidiDevice から Sequencer への持っていき方はかかれていません。 順に見ていくと堂々巡りになります。 MidiDevice も Sequencer もインターフェイスなのが肝なのかなぁ。 両方を implement したクラスを作れば何とかなるんだろうか。 そもそもインターフェイス自体、コードを持たず implement した クラスの取り扱い方を増やすだけのもののように見ていたんで、 なんでそんなものがこうもたくさんの機能を持つのか不思議です。 インターフェイスにはまだ何か私の知らない秘密があるということでしょうか。 GOO E-Mail: goo_n@hotmail.com
>> とりあえず私は、GOO さんが制作したプログラムを実行できる環境を >> 整えないと行けないと言うことですかね。 (笑) > 自動ダウンロードされなかったんですか? > なんだったらここで直にダウンロードもできます。 > http://java.sun.com/j2se/1.3/ja/jre/index.html さっそくダウンロードしてみました。でも、先のデモを表示させようと すると、再びインストール要求のウィンドウが出てきました。 私は一体何をダウンロードしたのでしょうか? ^^; > GUI 部分を適当に作ってみました。 > http://www.geocities.co.jp/SiliconValley-SanJose/4825/java/ > MIDI アプリケーションらしいのは MIDI デバイスの列挙ができている > ところくらいですね(^^; こちらは、ちゃんと実行することができました。とりあえず、これで 安心と言ったところでしょうか。 ちなみに、その下にある MIDIファイルをクリックすると、ウチは TMIDIが起動するようになっています。(笑) tos.
> 試しに seq = (Sequencer)MidiDevice; とやってみましたがどうもそこで > 止まってしまうようです(^^; 自己レスですが、さまよってたらこんなコードがボンと出てきました。 http://tick.informatik.uni-stuttgart.de/~pfistere/jsexamples/MidiPlayer.java.html 眺めてみると Sequencer seq = (Sequencer)MidiDevice; といったことをばっちりやっているではありませんか(^^; というわけで、おそらく止まるのは別の理由だったのでしょう。 これさえできるならばとりあえず方向性ははっきりします。 なんか眺めていると JDK1.3 のバグとか回避の方法なんかも書いてあります。 JDK のバグに振り回されるのはいやだなぁ GOO E-Mail: goo_n@hotmail.com
というわけで MIDI プレイヤーアプレットを作っているわけですが、 セキュリティ関連がなかなか難しそうです。ローカルのファイルに基本的には アクセスできないですし。まあ、とりあえずそれは置いといて・・・ ちょっと再生デバイスとシーケンスとをつなげるのに苦労しています。 public interface Sequencer extends MidiDevice というインターフェイスがあって、 静的なメソッドが集まった MidiSystem クラスを使って、 Sequencer seq = MidiSystem.getSequencer(); seq.setSequence(MIDI ファイル); seq.start(); といった感じで再生できるはずなんですが、getSequencer() は デフォルトデバイスの Sequencer を返すメソッドなんです。 で、ほかのデバイスを選択するには、MidiDevice getDevice(Device.Info) しかないらしいんです。そこからはもっと低レベルなコントロールの方に 持っていくらしいんですが、できれば Sequencer の簡単なインターフェイスに 持っていきたいです。MidiDevice を Sequencer にできないものでしょうか? 試しに seq = (Sequencer)MidiDevice; とやってみましたがどうもそこで 止まってしまうようです(^^; GOO E-Mail: goo_n@hotmail.com WWW: http://homepage2.nifty.com/~goo/ GTET 置き場
> とりあえず私は、GOO さんが制作したプログラムを実行できる環境を > 整えないと行けないと言うことですかね。 (笑) 自動ダウンロードされなかったんですか? なんだったらここで直にダウンロードもできます。 http://java.sun.com/j2se/1.3/ja/jre/index.html > しかし、C++とJAVAを両方覚えようとすると、ごっちゃになって > 訳が分からなくなりそうだなぁ。 ^^; どうやら Forte があればほとんど覚えなくて良さそうですよ。 VS6 ばりの補完機能もあるし、ビジュアルに GUI を張り付けて イベントを選択し、それにイベントハンドラをコーディングするという、 わかりやすい構成になっています。Forte が担当する GUI 生成部は 一つの関数になっていてコンストラクタから呼ばれていて、編集不可(!) になっています。押しつけられるのはいやな人もいるかもしれませんが、 自分でやりたい初期化はコンストラクタに続けて書けばいいわけですし、 元々いろいろ従わなければならないビジュアル開発なのでこれでいいのかもしれません。 GUI 部分を適当に作ってみました。 http://www.geocities.co.jp/SiliconValley-SanJose/4825/java/ MIDI アプリケーションらしいのは MIDI デバイスの列挙ができている ところくらいですね(^^; GOO E-Mail: goo_n@hotmail.com WWW: http://homepage2.nifty.com/~goo/ GTET 置き場
> とりあえずいったん Forte の方を試してみようと思います。 とりあえず私は、GOO さんが制作したプログラムを実行できる環境を 整えないと行けないと言うことですかね。 (笑) しかし、C++とJAVAを両方覚えようとすると、ごっちゃになって 訳が分からなくなりそうだなぁ。 ^^; tos.
BeOS でも標準で統合環境(IDE)がついていましたが、 JAVA の方でも二つも無料の IDE があるのには驚きました。 JBuilder4Foundation http://www.borland.co.jp/jbuilder/foundation/index.html Forte for JAVA Community Edition http://www.sun.co.jp/forte/ffj/index.html 今日 JAVA PRESS なる本を立ち読みしたところ、 IDE の特集をしていました。 どうも Forte の方がパワフルで使いやすいようです。 JBuilder の方では GUI の編集がいまいちつかめなかったので、 とりあえずいったん Forte の方を試してみようと思います。 GOO E-Mail: goo_n@hotmail.com WWW: http://homepage2.nifty.com/~goo/ GTET 置き場
> すみません、よく見てみたら HTML に、標準の VM ではなくプラグインを使うように > JavaScript で指定されているようです。<A JavaScript の部分だけ私のテストアプレットを表示させる HTML にコピーしてみたら IE がハングアップしました(笑)中身を見てもそんなにおかしくはなさそうなんですが... と、FAQ をのぞいてみたら HTML Converter なるものがあるようです。 これで変換した HTML で表示させたらばっちりプラグインを使って swing の方も 動いてくれました。 http://java.sun.com/products/plugin/1.3/docs/ja/htmlconv.html HTML への applet タグの記述はこれに任せることにします。 GOO E-Mail: goo_n@hotmail.com WWW: http://homepage2.nifty.com/~goo/ GTET 置き場
> いえ、ダウンロードする以前に、表示を諦めてエラーになっているようです。 > 表示できる JAVAアプレットもあるのに、何か違うんでしょうか。 > 1.3 のプラグインとやらがない、と自動検出しているんでしょうか。 すみません、よく見てみたら HTML に、標準の VM ではなくプラグインを使うように JavaScript で指定されているようです。http://java.sun.com/products/plugin/1.3.0_01/ja/demos/index.html 1.3 のを動かすにはこういうことをしないといけないわけですね。 やっと安心して進められそうです。 > そう言えば、JBuilder で作ると、それ専用のライブラリとかは必要ないん > でしょうか。 みんな、jarファイルの中に含めてくれるのかな?? 分からないですね。まあ、基本的には標準クラスライブラリだけで やっていくつもりではありますが。 GOO E-Mail: goo_n@hotmail.com WWW: http://homepage2.nifty.com/~goo/ GTET 置き場
>> せっかく作っても、使える人が少なくなってしまいそう。 >> 私の所では、動くというデモが動きませんし。 ^^; > 1.3 のプラグインは手に入ったんですよね? > うちの場合そのページでは自動的にダウンロードされてきましたが。 いえ、ダウンロードする以前に、表示を諦めてエラーになっているようです。 表示できる JAVAアプレットもあるのに、何か違うんでしょうか。 1.3 のプラグインとやらがない、と自動検出しているんでしょうか。 > java.applet.Applet クラスだとふつうに動くんですが(そりゃそうだ)、 > javax.swing.JApplet クラスで作ると動いてくれない。 > というわけでふつうはあきらめるところなんですが、 > 先に書いたページでふつうに swing の GUI が動作しているので、 > 何かおかしいなと。調査続行中です。 そう言えば、JBuilder で作ると、それ専用のライブラリとかは必要ないん でしょうか。 みんな、jarファイルの中に含めてくれるのかな?? tos.
> せっかく作っても、使える人が少なくなってしまいそう。 > 私の所では、動くというデモが動きませんし。 ^^; 1.3 のプラグインは手に入ったんですよね? うちの場合そのページでは自動的にダウンロードされてきましたが。 > 開発環境も、ウチにはないです。 無料で手にはいるはずだとは思いますが。 JBuilder4Foundation は試していますが、 元々そんなにコードの量は多くならないですし、 そのまま swing を使ったようではどうもうまく動かない様子ですので、 勉強込みで最初のうちは手書きでやってみようと思っています。 java.applet.Applet クラスだとふつうに動くんですが(そりゃそうだ)、 javax.swing.JApplet クラスで作ると動いてくれない。 というわけでふつうはあきらめるところなんですが、 先に書いたページでふつうに swing の GUI が動作しているので、 何かおかしいなと。調査続行中です。 GOO E-Mail: goo_n@hotmail.com WWW: http://homepage2.nifty.com/~goo/ GTET 置き場
> とりあえずサウンド関係が実装されたのは 1.3 からのようなので、 > JAVA1.3 plug-in(7.5MB) を自動ダウンロードしてもらうのがまず壁になりますね(^^; > しかし、MIDI が 1.3 からの機能である以上仕方がないところです。 > あとは対応状況ですがいまいち分からない状態です。 せっかく作っても、使える人が少なくなってしまいそう。 私の所では、動くというデモが動きませんし。 ^^; 開発環境も、ウチにはないです。 無料で手にはいるはずだとは思いますが。 // そう言えば、一応、JBuilder が手元にあったような。 tos.
とりあえずサウンド関係が実装されたのは 1.3 からのようなので、 JAVA1.3 plug-in(7.5MB) を自動ダウンロードしてもらうのがまず壁になりますね(^^; しかし、MIDI が 1.3 からの機能である以上仕方がないところです。 あとは対応状況ですがいまいち分からない状態です。 動かないサンプルプログラムがあったり、こんなデモはきちんと動いていたり。 基本的には制限なしと言うことで進めて良さそうですが、ちょっと不安です。 GOO E-Mail: goo_n@hotmail.com WWW: http://homepage2.nifty.com/~goo/ GTET 置き場