株式会社シベスピ 従業員ブログ

シベスピの社員ブログ。技術・想い・経験沢山書いていきます!

Javaで遊ぶ ~キーボードでドラムを鳴らそう~

こんにちは、SBです。
GWも終わってしまいましたね。皆さんはいかがお過ごしでしたでしょうか。
私は久しぶりに学生時代の友人と会ったり、格ゲーのイベントに行ったりとそれなりに充実したGWを送れました。

そんなGWでしたが、暇な日にふと思いついたので一つアプレットを作ってみました。
概要としては、キーボードでドラムを鳴らすお遊びアプレットです。(命名:KeyboarDrum)
また、このブログは初心者の方や、未経験の方もよく見ていただいているとのことなので、なるべくわかりやすいシンプルな内容にするというコンセプトで作ってみました。
といっても私もまだ初心者なんですけどね。
開発環境はEclipse 4.7 OxygenでJavaSE-1.8を使用しています。

import java.applet.Applet;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;

public class KeyboarDrum extends Applet implements KeyListener{
	//ドラムの音声ファイルパスとトリガーにするキーの列挙型
	public enum Drum{
		BassDrum("C:\\BD.wav",'f'),
		SnareDrum("C:\\SD.wav",'d'),
		HiHat("C:\\HH.wav",'j'),
		;

		private String path; //オーディオファイルのパス
		private char triggerKey; //トリガーにするキー

		private Drum(String path, char triggerKey) {
			this.path = path;
			this.triggerKey = triggerKey;
		}

		public String getPath(){
			return path;
		}
		public char getTriggerKey(){
			return triggerKey;
		}
	}

	@Override
	public void init(){
		addKeyListener(this);
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO 自動生成されたメソッド・スタブ
		//押したキーは何か取得する
		char key = e.getKeyChar();

		//どのキーが押されたか判定し、対応する音を再生する
		if (key == Drum.BassDrum.triggerKey){ //トリガーキーをfにしているので今回はfキーを押した場合
			//音を再生する
			playSound(Drum.BassDrum.path);
			//ついでにコンソールに出力してみる
			System.out.print("ドン");
		}else if(key == Drum.SnareDrum.triggerKey ){
			playSound(Drum.SnareDrum.path);
			System.out.print("タッ");
		}else if(key == Drum.HiHat.triggerKey){
			playSound(Drum.HiHat.path);
			System.out.print("チャ");
		}
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO 自動生成されたメソッド・スタブ
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO 自動生成されたメソッド・スタブ
	}

	public void playSound(String audioFilePath){
		AudioInputStream stream;
		try {
			//オーディオファイルの読み込み
			stream = AudioSystem.getAudioInputStream(new File((audioFilePath)));

			// オーディオ形式を取得
			AudioFormat format = stream.getFormat();

			// ライン情報を取得
			DataLine.Info info = new DataLine.Info(Clip.class, format);

			// 空のクリップを作成
			Clip clip = (Clip) AudioSystem.getLine(info);
			// クリップを開く
			clip.open(stream);
			//再生する
			clip.start();

			// ストリームを閉じる
			stream.close();
		} catch (Exception e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}
}

やっている内容は単純で、列挙型(enum)でドラムを鳴らすにあたっての情報を格納しておき、キーが押されたとき(keyTyped())どのキーを押したかによって再生処理(playSound())に渡す引数を決定し、対応している音を鳴らすという内容です。

それで、作ったのはいいんですが、はてなブログに直接動画を貼り付ける機能がいつの間にか廃止になってたみたいなので、GIFで動作を張っておきます(肝心の音が……)f:id:chivsp:20180506222359g:plain


初心者の方やこれから勉強しようと思っている未経験の方は、小難しいことは一旦置いておいて、まずはこういった楽しめるプログラムを作ってプログラミングの楽しさを知るのがいいんじゃないかなと思います。

以上、こういった遊びプログラムでモチベを上げつつ、逐次勉強をしていこうと思っているSBがお送りしました。