見出し画像

【Javaで簡単!】自分で作成したゲームにBGMをつける!

今回は前回作成したシューティングゲームにBGMをつける方法を解説します。

https://note.com/tenjiprograming/n/nd31c7b391809?sub_rt=share_pw


ゲーム自体はなんでもできるので自作したゲームがあればそれを使っても大丈夫です。
言語はJavaです。

BGM自体も自分でコード進行を作らなきゃいけないですが、そこらへんのセンスは皆無なので変なBGMです。許してください。。

とりあえずやっていきましょう!

まずはクラスを作る

import javax.sound.midi.*;

public class GameMusic {
    private static Sequencer sequencer;

    public static void playMusic() {
        try {
            sequencer = MidiSystem.getSequencer();
            sequencer.open();
            Sequence sequence = new Sequence(Sequence.PPQ, 4);
            Track track = sequence.createTrack();

            int[] noteSequence = {60, 62, 64, 65, 67, 65, 64, 62};

            for (int i=0; i<noteSequence.length; i++) {
                track.add(createNoteOnEvent(noteSequence[i], i*4));
                track.add(createNoteOffEvent(noteSequence[i], i*4+2));
            }

            sequencer.setSequence(sequence);
            sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
            sequencer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void stopMusic() {
        if (sequencer != null && sequencer.isRunning()) {
            sequencer.stop();
            sequencer.close();
        }
    }

    private static MidiEvent createNoteOnEvent(int nKey, long lTick) {
        return createNoteEvent(ShortMessage.NOTE_ON, nKey, 100, lTick);
    }

    private static MidiEvent createNoteOffEvent(int nKey, long lTick) {
        return createNoteEvent(ShortMessage.NOTE_OFF, nKey, 100,lTick);
    }

    private static MidiEvent createNoteEvent(int nCommand, int nKey, int nVelocity, long lTick) {
        ShortMessage message = new ShortMessage();
        try {
            message.setMessage(nCommand, 0, nKey, nVelocity);
        } catch (InvalidMidiDataException e) {
            e.printStackTrace();
        }

        return new MidiEvent(message, lTick);
    }
}

作成したGameMusicクラスはこれです。

playMusic()メソッド内のnoteSequenceが実際のBGMのコード進行です。
配列の中身の数字はMIDIのノートナンバーで音楽のコード(各音階)を表しています。

詳しくは以下を参考にしてみてください。

音楽を作るセンスは皆無なのでBGMは適当です。。得意な方がいたらぜひ教えてください。。

コードの解説に戻ります!コード自体はシンプルでplayMusic()メソッドがBGMを開始するメソッドで、stopMusic()メソッドがBGMを終了するメソッドです。

これらのメソッドをゲーム中でコールするだけで自作したBGMを流すことができます。

実際にBGMを流してみる

public SimpleShooter() {
        GameMusic .playMusic(); // ゲーム開始
        JFrame frame = new JFrame("Simple Shooter");
        frame.add(this);
        frame.setSize(800, 600);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                keys[e.getKeyCode()] = true;
            }
            @Override
            public void keyReleased(KeyEvent e) {
                keys[e.getKeyCode()] = false;
            }
        });
         
 // そのほかのコード
if (gameOver) {
            GameMusic.stopMusic(); // ゲームオーバー時にBGM終了
            g.setColor(Color.RED);
            g.setFont(new Font("Arial", Font.BOLD, 40));
            g.drawString("Game Over!", getWidth() / 2 -100, getHeight() / 2 );
            g.drawString("Score : " + score, getWidth() / 2 -100, getHeight() / 2 + 50);
            return;
        }
// そのほかのコード

作成したゲームでpllayMusicとstopMusicを呼び出します。

シューティングゲームのコードは以下の記事で解説しているので気になる方は読んでみてください!





この記事が気に入ったらサポートをしてみませんか?