E-Ray Dos Sound Bridge
XIAO ESP32-S3 기반 DOS PC 사운드 브리지 펌웨어입니다.
RS232 MIDI / OPL 신호를 받아 로컬 합성 또는 네트워크 전송 중 하나로 처리합니다.
버튼 한 번으로 네 가지 모드를 전환하며, WS2812 LED가 현재 모드를 표시합니다.
이 프로젝트는 AI이용하여 진행되었습니다.
제작자: 전기가오리 (네이버 카페 도스박물관 Electric Ray)
보드: Seeed XIAO ESP32-S3
| LED | 모드 | 역할 |
|---|---|---|
| 🟢 Green | SF2 MIDI | SoftMPU RS232 → SF2 합성 → I2S / PCM5102A |
| 🔵 Blue | RTP-MIDI | SoftMPU RS232 → WiFi AP → AppleMIDI (rtpMIDI) |
| 🔴 Red | OPL Local | adlcom RS232 → YMF262 (YMFM) → I2S / PCM5102A |
| 🟡 Yellow | OPL UDP | adlcom RS232 → WiFi AP → UDP 타이밍 패킷 |
- D5 택트 스위치 짧게 누름 → 다음 모드로 전환 (순환)
- D5 택트 스위치 길게 누름(3초) → 재부팅
- 전환 순간 흰색 섬광 표시
| 핀 | GPIO | 연결 |
|---|---|---|
| D7 | 44 | MAX3232 RX — RS232 입력 (SoftMPU / adlcom 공용) |
| D10 | 9 | PCM5102A BCK |
| D9 | 8 | PCM5102A DIN |
| D8 | 7 | PCM5102A LCK / WS |
| D5 | 6 | 택트 스위치 (반대편 GND) |
| D3 | 4 | WS2812B 데이터 |
- XIAO ESP32-S3 (8MB Flash, PSRAM 탑재 버전)
- PCM5102A I2S DAC 모듈
- MAX3232 RS232-TTL 변환 모듈
- WS2812B LED (1개)
- 택트 스위치
| 항목 | 값 |
|---|---|
| 보드 | XIAO_ESP32S3 |
| Flash Size | 8MB |
| PSRAM | OPI PSRAM ← 필수 |
| Partition Scheme | Custom (partitions.csv 사용) |
| USB CDC On Boot | Enabled |
| Upload Speed | 921600 |
| 라이브러리 | 제작자 | 용도 |
|---|---|---|
| FastLED | Daniel Garcia | WS2812 LED 제어 |
| Arduino MIDI Library | Francois Best (FortySevenEffects) | Serial MIDI 파싱 |
| AppleMIDI | lathoub | RTP-MIDI / AppleMIDI 세션 |
SF2Sampler 소스 복사
copych/ESP32_SF2_Sampler_Synthesizer 저장소의
SF2Sampler/ 폴더에서 아래 파일을 E-RayDSB/ 로 복사합니다.
adsr.cpp / adsr.h
biquad2.h
channel.h
fx_reverb.h
i2s_in_out.cpp / i2s_in_out.h ← 이 프로젝트에서 수정됨
misc.h
operators.h
SF2Parser.cpp / SF2Parser.h
synth.cpp / synth.h
SynthState.h
TLVStorage.h
voice.cpp / voice.h
주의:
i2s_in_out.cpp는 원본 대신 이 저장소의 수정본을 사용합니다.
(I2S deInit 시 rx_handle 잔존 버그 수정)
사운드폰트 업로드
LittleFS 파티션에 SF2 파일을 업로드합니다. 디폴트는 soundfont.sf2 입니다.
Arduino IDE → [Tools > LittleFS Upload] 또는 arduino-littlefs-upload 플러그인 사용.
파일 경로: data/soundfont.sf2 (3MB 이하 권장)
추천 사운드폰트:
- [2gmgsmt.sf2]
- 게임별 전용 SF2 (예: SC-55 패치셋) — 해당 게임에 최적
DOS PC에서 SoftMPU로 MIDI를 출력하면 ESP32가 SF2 사운드폰트로 합성해 PCM5102A로 재생합니다.
DOS 설정 예시:
SOFTMPU /MPU:330 /SB:220 /IRQ:5 /COM:1 /BAUD:38400
게임 실행 시 자동으로 MIDI 출력됩니다.
- RS232 속도: 38400 baud
- 사운드폰트: LittleFS의
/soundfont.sf2 - 출력: PCM5102A → 3.5mm 오디오 잭
ESP32가 WiFi AP DOS_MIDI를 열고, 연결된 PC/Mac의 가상 MIDI 드라이버로 MIDI를 전송합니다.
Munt (MT-32 에뮬레이터), rtpMIDI, DAW 등과 함께 사용합니다. (제 다른 저장소에 android용으로 munt를 포팅해두었습니다.)
WiFi 접속:
- SSID:
DOS_MIDI - Password:
12345678 - IP:
192.168.4.1
Windows (rtpMIDI):
- rtpMIDI 설치
- 새 세션 추가 →
dosmidi._apple-midi._udp.local또는192.168.4.1:5004 - 연결 후 가상 MIDI 포트를 Munt / DAW 의 입력으로 지정
macOS:
- 시스템 환경설정 → Audio MIDI 설정 → MIDI 네트워크 설정 →
dosmidi자동 검색됨
연결 확인 후 게임 시작 (연결 전 전송된 SysEx는 드롭됩니다)
- RS232 속도: 38400 baud
- mDNS:
dosmidi._apple-midi._udp.local(포트 5004)
adlcom이 RS232로 보내는 NukeYKT OPL 명령을 ESP32의 YMFM(YMF262) 에뮬레이터로 처리해 PCM5102A로 재생합니다. (adlcom은 제 다른 저장소의 패치된 버전을 사용하셔야 원활하게 구동됩니다.)
DOS 설정 예시:
adlcom COM1 OPL3
implay
- RS232 속도: 115200 baud
- OPL 타입: YMF262 (OPL3, OPL2 하위 호환)
- 출력: PCM5102A → 3.5mm 오디오 잭
adlcom이 보내는 OPL 명령을 타이밍 정보와 함께 UDP로 외부 기기에 전송합니다.
OPL 에뮬레이터(제 다른 저장소에 windows와 android용이 있습니다.)로 재생할 수 있습니다.
WiFi 접속:
- SSID:
COMOPL - Password:
12345678 - UDP 포트:
9800
PC 수신 프로그램 시작 순서:
- ESP32가
COMOPLAP에 연결 - PC에서 ESP32 IP(
192.168.4.1)로 UDPHELLO문자열 전송 - 이후 ESP32가 해당 PC IP로 유니캐스트 전송 시작
패킷 포맷:
magic[4] = "OPL3"
type = 0 (events) / 1 (reset)
count = 이벤트 수 (max 32)
seq = uint16 패킷 순번
events[]: deltaUs(uint16) + reg(uint16, bank<<8|reg8) + val(uint8) + flags(uint8)
USB 시리얼 모니터에서 입력 가능합니다.
| 명령 | 동작 |
|---|---|
stat |
현재 모드 상태 표시 |
mode 0 ~ mode 3 |
강제 모드 전환 |
reset |
재부팅 |
이 프로젝트는 다음 오픈소스 프로젝트를 기반으로 합니다.
| 프로젝트 | 저자 | 라이선스 | 용도 |
|---|---|---|---|
| ESP32_SF2_Sampler_Synthesizer | copych | MIT | SF2 합성 엔진, I2S 드라이버 |
| ymfm | Aaron Giles | BSD-3-Clause | OPL2/OPL3 에뮬레이션 |
| Arduino MIDI Library | FortySevenEffects | MIT | MIDI 파싱 |
| AppleMIDI | lathoub | MIT | RTP-MIDI 세션 |
| FastLED | Daniel Garcia | MIT | WS2812 LED 제어 |
OPL UDP 전송 프로토콜은 NukeYKT OPL 브리지 방식을 참고했습니다.
MIT License — 자유롭게 사용, 수정, 배포 가능합니다.
단, 위 출처 프로젝트 각각의 라이선스를 함께 준수해 주세요.