Files
java-examples/docs/javax.sound.midi.md

6.9 KiB

Java javax.sound.midi 쉽게 배우기

1. javax.sound.midi란?

javax.sound.midi 패키지는 자바에서 MIDI(악기 디지털 인터페이스) 데이터를 다루는 기능을 제공한다.
이를 이용하면 MIDI 파일을 재생, 편집, 녹음, 생성할 수 있다.

주요 기능
MIDI 파일 재생 (악기 소리 출력)
MIDI 이벤트 생성 및 수정 (노트 추가/삭제)
실시간 MIDI 입력/출력 (MIDI 키보드 연결 가능)


2. 주요 클래스 및 메서드 정리

(1) MidiSystem 클래스 (MIDI 시스템 제어)

메서드 설명
getSequencer() MIDI 파일을 재생하는 Sequencer 객체 반환
getSynthesizer() 소프트웨어 신시사이저(Synthesizer) 반환
getReceiver() MIDI 데이터를 출력할 Receiver 반환
getTransmitter() MIDI 데이터를 입력받을 Transmitter 반환

(2) Sequencer 클래스 (MIDI 재생기)

메서드 설명
open() Sequencer를 초기화하고 사용 준비
setSequence(Sequence sequence) 재생할 MIDI 시퀀스 설정
start() MIDI 재생 시작
stop() MIDI 재생 중지
setLoopCount(int count) MIDI 반복 재생 설정

(3) Synthesizer 클래스 (신시사이저 - 소리 생성)

메서드 설명
open() 신시사이저를 활성화
getChannels() MIDI 채널(MidiChannel[]) 가져오기
getReceiver() 신시사이저에 MIDI 메시지를 보내는 Receiver 반환

(4) MidiChannel 클래스 (MIDI 음원 채널)

메서드 설명
noteOn(int note, int velocity) 특정 음을 연주 (노트 켜기)
noteOff(int note) 특정 음을 멈춤 (노트 끄기)
setInstrument(Instrument instrument) 채널의 악기 변경

(5) Sequence 클래스 (MIDI 데이터 관리)

메서드 설명
createTrack() 새로운 Track(MIDI 트랙) 생성
getTracks() 시퀀스에 포함된 Track 목록 가져오기

(6) Track 클래스 (MIDI 트랙)

메서드 설명
add(MidiEvent event) MIDI 이벤트 추가
remove(MidiEvent event) MIDI 이벤트 제거

(7) MidiEvent 클래스 (MIDI 이벤트)

메서드 설명
new MidiEvent(MidiMessage message, long tick) 특정 시간(tick)에 MIDI 메시지 추가

3. MIDI 파일 재생 예제

✔ MIDI 파일을 재생하는 코드 (Sequencer 사용)

import javax.sound.midi.*;
import java.io.File;

public class MidiPlayer {
    public static void main(String[] args) {
        try {
            // MIDI 파일 로드
            File midiFile = new File("song.mid");
            Sequence sequence = MidiSystem.getSequence(midiFile);

            // Sequencer 생성 및 열기
            Sequencer sequencer = MidiSystem.getSequencer();
            sequencer.open();
            sequencer.setSequence(sequence);
            
            // 재생 시작
            sequencer.start();
            System.out.println("MIDI 재생 시작!");

            // 재생이 끝날 때까지 대기
            while (sequencer.isRunning()) {
                Thread.sleep(1000);
            }

            // 종료 처리
            sequencer.close();
            System.out.println("MIDI 재생 완료!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

MIDI 파일을 불러와 재생하는 코드이다.
Sequencer를 사용하여 MIDI를 관리하고 재생한다.


4. 실시간으로 MIDI 연주하기

✔ 신시사이저를 사용해 실시간으로 MIDI 노트 출력

import javax.sound.midi.*;

public class MidiSynthesizer {
    public static void main(String[] args) {
        try {
            // 신시사이저 열기
            Synthesizer synthesizer = MidiSystem.getSynthesizer();
            synthesizer.open();
            
            // MIDI 채널 가져오기
            MidiChannel[] channels = synthesizer.getChannels();
            MidiChannel channel = channels[0]; // 첫 번째 채널 사용
            
            // 특정 노트 연주 (도(C4) - MIDI 번호 60)
            int note = 60;
            channel.noteOn(note, 80); // 음을 켬 (velocity: 80)
            System.out.println("도(C4) 연주 중...");
            
            Thread.sleep(1000); // 1초 동안 연주
            
            channel.noteOff(note); // 음을 끔
            System.out.println("연주 종료!");
            
            // 신시사이저 닫기
            synthesizer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Synthesizer를 사용해 실시간으로 MIDI 소리를 출력한다.
noteOn()으로 음을 켜고 noteOff()로 끈다.


5. 새로운 MIDI 파일 생성하기

✔ MIDI 노트를 추가하여 새로운 MIDI 파일 생성

import javax.sound.midi.*;
import java.io.File;

public class MidiCreator {
    public static void main(String[] args) {
        try {
            // 새로운 시퀀스 생성
            Sequence sequence = new Sequence(Sequence.PPQ, 24);
            Track track = sequence.createTrack();

            // 노트 ON (C4 = 60)
            ShortMessage noteOn = new ShortMessage();
            noteOn.setMessage(ShortMessage.NOTE_ON, 0, 60, 80);
            track.add(new MidiEvent(noteOn, 1));

            // 노트 OFF (C4 = 60)
            ShortMessage noteOff = new ShortMessage();
            noteOff.setMessage(ShortMessage.NOTE_OFF, 0, 60, 80);
            track.add(new MidiEvent(noteOff, 24));

            // MIDI 파일로 저장
            File midiFile = new File("new_song.mid");
            MidiSystem.write(sequence, 1, midiFile);

            System.out.println("새로운 MIDI 파일이 생성되었습니다: " + midiFile.getAbsolutePath());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

새로운 MIDI 파일을 만들고, C4(도) 음을 추가하여 저장한다.
MidiEvent를 사용하여 MIDI 데이터를 구성한다.


6. 정리

javax.sound.midi는 자바에서 MIDI 데이터를 다루는 API이다!
MIDI 파일을 재생(Sequencer), 실시간 연주(Synthesizer), 노트 추가(Track, MidiEvent) 가능
기본적으로 자바에서 제공하는 소프트웨어 신시사이저를 이용하여 다양한 MIDI 작업 가능

MIDI 파일 플레이어, 가상 피아노, 미디 편집기 등을 만들 수 있다!