https://www.youtube.com/@jjome_Plus
JMPlayer is a simple MIDI and retro chiptune player written in C++ using the Qt6 framework. It is built to play and visualize 1990s Korean retro music formats (such as .SOP, .GYB, .NOB, .OKM / .OKA, and .IMS / .ISS) along with standard .ROL (AdLib) and VGM/VGZ chiptunes, utilizing software OPL3 emulation and SoundFont engines.
- Format Support: Playback and parsing of Korean retro formats (
.SOP,.GYB,.NOB,.OKM/.OKA,.IMS/.ISS), standard AdLib.ROLfiles, and VGM/VGZ chiptunes. - Visualizer:
- 16-channel volume VU meters and attack peak visualization.
- Piano Roll window showing active note layouts.
- Dynamic instrument name cards displaying active FM patches.
- Lyrics Display: Basic lyrics support with syllable-level highlighting and text decoding (Johab/EUC-KR).
- Audio Engine: Software OPL3 synthesis via AdPlug and SoundFont (.sf2) playback powered by TinySoundFont.
- Nuked-SC55 (optional): Play through the Nuked-SC55 emulator with no virtual MIDI cable (no loopMIDI). A stock build stays silent — build it with the patch in
emulator-patch/. The emulator is not shipped with JMPlayer.
This project requires CMake and Qt6 (MinGW 64-bit).
# 1. Clone the repository
git clone https://github.com/jihodaya/jmplayer.git
cd JMPlayer
# 2. Run the automated release build script (Windows)
.\build_release.batFor detailed instructions, please refer to BUILD_GUIDE.md.
- Project Code: Released under the MIT License (see
LICENSE). Free to use, modify, distribute and sell; just keep the copyright notice. - Third-party Dependencies: Dynamically linked to Qt 6 (LGPL v3) and AdPlug (LGPL v2.1) to comply with LGPL requirements.
- Credits: Thanks to BK (병코돌고래) for providing the sample song collection (
BK/folder). - Nuked-SC55: A separate program, not part of JMPlayer — by nukeykt with the GUI fork by linoshkmalayil, under the MAME License (non-commercial). Only JMPlayer's own patch is included here.
JMPlayer can stream its OPL2/OPL3 register writes to a Raspberry Pi over MIDI — the OPL register tunnel — so a song played here comes out of the Pi's DAC.
| Project | What it is |
|---|---|
| mt32-extend | Bare-metal Raspberry Pi jukebox, and a fork of mt32-pi that receives the tunnel. It gives mt32-pi OPL playback it otherwise has no way to do. |
| rp2040-midi-bridge | USB MIDI ↔ serial MIDI bridge for the RP2040, one way to get the stream from the PC to the Pi. |
Neither is required to use JMPlayer on its own.
JMPlayer는 Qt6 프레임워크와 C++를 기반으로 개발된 미디(MIDI) 및 레트로 칩튠 재생기입니다. 1990년대 PC 통신 시절에 주로 쓰이던 국산 고전 음악 파일 포맷들(.SOP, .GYB, .NOB, .OKM/OKA, .IMS/ISS)과 표준 애드립 포맷인 .ROL, 그리고 VGM/VGZ 칩튠 파일들을 OPL3 에뮬레이션과 사운드폰트(SoundFont) 엔진을 활용하여 재생하고 시각화합니다.
- 포맷 재생 지원: 국산 고전 포맷 파일(
.SOP,.GYB,.NOB,.OKM/.OKA,.IMS/.ISS) 및 표준 애드립 파일(.ROL), VGM/VGZ 칩튠 파일 재생. - 시각화 (Visualizer):
- 16채널 볼륨 VU 레벨 모니터 및 어택 Peak 표시.
- 음표 연주 상태를 보여주는 피아노 롤(Piano Roll) 창.
- 활성화된 FM 패치 정보를 보여주는 악기 이름 카드.
- 가사 표시: 조합형(Johab) 및 완결형(EUC-KR) 가사 텍스트의 음절 단위 하이라이팅 표시.
- 오디오 엔진: AdPlug 기반의 소프트웨어 OPL3 에뮬레이션 및 TinySoundFont 기반의 사운드폰트(.sf2) 재생.
- Nuked-SC55 (선택): 가상 MIDI 케이블(loopMIDI) 없이 Nuked-SC55 에뮬레이터로 재생. 원본 빌드는 소리가 나지 않으며,
emulator-patch/의 패치로 직접 빌드해야 합니다. 에뮬레이터는 함께 배포되지 않습니다.
본 프로젝트는 CMake 및 Qt6 (MinGW 64-bit) 환경에서 빌드됩니다.
# 1. 레포지토리 클론
git clone https://github.com/jihodaya/jmplayer.git
cd JMPlayer
# 2. 윈도우용 릴리즈 빌드 자동화 스크립트 실행
.\build_release.bat보다 상세한 빌드 방법은 BUILD_GUIDE.md 문서를 참고해 주세요.
- 프로젝트 소스 코드: MIT 라이선스로 배포됩니다(
LICENSE참고). 저작권 고지만 유지하면 자유롭게 사용·수정·배포·판매하실 수 있습니다. - 외부 라이브러리: LGPL 라이선스 준수를 위해 Qt 6 (LGPL v3) 및 AdPlug (LGPL v2.1) 라이브러리와 동적 링크(DLL) 방식으로 빌드됩니다.
- 제공자 기여: 음원 테스트를 위해 샘플 연주곡 세트(
BK/폴더)를 제공해 주신 BK (병코돌고래) 님께 감사드립니다. - Nuked-SC55: JMPlayer의 일부가 아닌 별개의 프로그램입니다 — nukeykt 원작, GUI 포크는 linoshkmalayil, MAME 라이선스(비상업). 여기에는 JMPlayer의 패치만 포함됩니다.
JMPlayer는 OPL2/OPL3 레지스터 쓰기를 MIDI로 라즈베리파이에 흘려보낼 수 있습니다 (OPL 레지스터 터널). 여기서 재생한 곡이 라즈베리파이의 DAC으로 나옵니다.
| 프로젝트 | 설명 |
|---|---|
| mt32-extend | 라즈베리파이 베어메탈 쥬크박스와, 터널을 수신하는 mt32-pi 포크. mt32-pi가 원래 못 하던 OPL 재생을 가능하게 합니다. |
| rp2040-midi-bridge | USB MIDI ↔ 시리얼 MIDI 브릿지(RP2040). PC에서 파이로 신호를 넘기는 방법 중 하나입니다. |
둘 다 JMPlayer 단독 사용에는 필요하지 않습니다.