質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

Q&A

解決済

1回答

309閲覧

midiの音とそれに対応する画像を同時に出す方法について

zuma

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

0グッド

1クリップ

投稿2018/01/14 03:17

配列の数字を読み取って、画像と音を出す(60だった場合、カタカナのドの画像とドの音を同時に出す)のを連続して行うコードを書きたいです。
配列の数字の通りにmidiで音を出すところまではうまくいったのですが、同時に対応する画像を表示させる方法が分かりません。また0の場合は、一個前の画像のままになるようにしたいです。
知恵を貸してください。

Java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3 4import javax.sound.midi.MidiSystem; 5import javax.sound.midi.Receiver; 6import javax.sound.midi.ShortMessage; 7 8class sampleImage { 9 public static void main(String[] args) throws Exception { 10 int[] notenums = {60,0,62,0,64}; 11 Receiver receiver = MidiSystem.getReceiver(); 12 ShortMessage message = new ShortMessage(); 13 14 //音色の変更 15 message.setMessage(ShortMessage.PROGRAM_CHANGE, 73, 0); 16 receiver.send(message, -1); 17 18 for(int i:notenums) { 19 if(i == 0) { 20 Thread.sleep(300); 21 }else { 22 //ノートナンバーiの音を出す 23 message.setMessage(ShortMessage.NOTE_ON, i, 127); 24 receiver.send(message, -1); 25 Thread.sleep(300); 26     } 27 28 //次の音に行く前に現在の音を止める 29 message.setMessage(ShortMessage.NOTE_OFF,i,127); 30 receiver.send(message, -1); 31 } 32 33 System.out.println("Enter キーを押してプログラムを終了します>"); 34 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 35 reader.readLine(); 36 37 } 38}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2018/01/14 04:01

Appletとして作りたいという意図がないならAppletのタグは削除した方がよいでしょう。またJavaプログラミングについては一般にIDEがeclipseだろうがなんだろうが関係ありませんので、Eclipseのタグも取るべきです。ご自分の開発環境としてEclipseを使っているという点を念のため示すのはよいですが、それは質問文の中に補足しておけば充分ですよ?
guest

回答1

0

ベストアンサー

まず・・・awt, swing, JavaFXなんでもそうなのですが、守らなければならない大原則があります。それはThread.sleepは使用禁止という点です。sleepだけではなく「時間がかかるような処理」は軒並み全部NGです。

それはなぜかというとawt, swing, JavaFXいずれもイベントディスパッチループという機構で動作しているためです。イベントというのは「画面やアプリケーションの状態を変化させるような何かの契機」のことで、それがおこるとイベントディスパッチループからそのイベントのハンドリングを行うようなメソッド(以降ハンドラーと呼びます)が自動的に起動され、そのハンドラーは「必要最小限の時間で処理を行ったら速やかにイベントディスパッチループへ戻る」必要があるからです。もし戻らずに自前でsleepなどとやってしまうと例えばその期間にマウスを操作したりキーを押したり画面の更新が必要になったりといったイベントが起きてもそれにすぐに反応できなくなります。そのような作り方をすると「GUIアプリケーションとして大変不自然な動き=操作してもすぐに反応してくれない、動きがかくかくする」といったイケテナイアプリケーションになってしまうのですね。

「一定時間ごとに何かしたいときどうすればいいか?」というと答えは色々ありますがawt,swingですと一番ポピュラーなのはjavax.swing.Timerを用いることです。

なのですが・・・ご質問のコードにはそもそもGUIアプリケーションの形になっておらずイベントディスパッチループ云々以前の状態のコードです。まずはswingで簡単な画面を出す方法を学んでみてください。画像を出すといった話はそれからです。

なお、GUIアプリケーションは「手っとり早く何かのサンプルをみて作れるもの」というふうにあまり簡単には考えない方がよいかも知れません。まともに動くものを作るには、それなりの前提知識やコードを書き、動かしてみてGUIプログラミングの作法を理解するというステップが最小限は必要です。前述したsleepしちゃだめってのもその一つです。

GUIってそんなに難しいわけでもないのですが、さりとてちょっとコードを見ればすぐわかるといった簡単なものでもないのです。

投稿2018/01/14 04:29

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問