A fully functional Python implementation of the MIDI Sample Dump Standard (SDS) protocol for transmitting WAV files to vintage samplers like the Oberheim DPX-1.
- Three Operational Modes:
- Single sample transmission
- Bulk folder transmission with auto-incrementing sample numbers
- Play patch mode for testing samples on your sampler
- Automatic WAV file conversion to 12-bit mono format compatible with DPX-1
- Support for WAV files of any bit depth (8, 16, 24, 32 bits)
- Automatic stereo to mono conversion
- Interactive MIDI port selection
- Two transmission modes:
- Open Loop: Direct transmission without handshaking (faster)
- Closed Loop: Transmission with handshaking and packet acknowledgment
- Loop configuration (one-shot and sustain loop modes)
- Memory usage calculation for DPX-1 (shows estimated KB/MB before sending)
- Progress bar during transmission
- Robust error handling - application never crashes
- Continuous menu loop for multiple operations
- Complete implementation of MIDI SDS standard (January 1986 spec)
- Tested and verified with Oberheim DPX-1 sampler
git clone https://github.com/CrypticCodeworks/DPX1-SDS-Utility.git
cd DPX1-SDS-Utilitypython3 -m venv midi_sds_venv
source midi_sds_venv/bin/activate # On macOS/Linux
# OR
midi_sds_venv\Scripts\activate # On Windowspip install -r requirements.txtDependencies:
mido==1.3.2- MIDI library for Pythonpython-rtmidi==1.5.8- Real-time MIDI backendnumpy==1.26.4- Audio array processing
source midi_sds_venv/bin/activate # Activate virtual environment
python src/main.pyThe application presents a main menu with four options:
- Send single sample - Send one WAV file at a time
- Send folder (bulk) - Send an entire folder of WAV files with auto-incrementing sample numbers
- Play patch - Test samples already loaded in your sampler
- Exit - Exit the application
After completing any operation, you'll be asked "Return to main menu? [Y/n]"
The program will guide you through:
- Select WAV file: Enter the file path or drag and drop the file
- Select MIDI port: Choose the MIDI output port from the list
- Configure SDS parameters:
- MIDI channel (0-15)
- Sample number (0-16383)
- Loop mode (one-shot or sustain loop)
- Transmission mode (Open Loop or Closed Loop)
- Memory calculation: Shows estimated memory usage in DPX-1 (e.g., ~129.20 KB)
- Start transmission: Confirm and the program will send the sample
Send an entire folder of WAV files:
- Select folder: Enter the folder path containing WAV files
- View files: See the list of WAV files found
- Configure starting sample number: Choose where to start (0-16383)
- Configure MIDI channel: Applies to all samples (0-15)
- Select loop mode: Applies to all samples (one-shot or sustain loop)
- Select MIDI port: Choose output port
- Select transmission mode: Open or Closed Loop
- Memory calculation: Shows total memory usage for all files
- Confirmation summary: Review total samples, sample numbers, and memory
- Transmission: Sends all samples sequentially with auto-incrementing numbers
- Final report: Shows success/failure count
Test samples already loaded in your sampler:
- Select MIDI port: Choose output port
- Select MIDI channel: (0-15)
- Enter patch/sample number: (0-127)
- Select MIDI note: e.g., C2=36, C3=48, C4=60
- Set velocity: (1-127, default 100)
- Set duration: (0.1-10.0 seconds, default 2.0)
- Playback: Sample plays on your sampler
- Option to play another patch
============================================================
██████╗ ██████╗ ██╗ ██╗ ██╗
██╔══██╗██╔══██╗╚██╗██╔╝ ███║
██║ ██║██████╔╝ ╚███╔╝ ╚██║
██║ ██║██╔═══╝ ██╔██╗ ██║
██████╔╝██║ ██╔╝ ██╗ ██║
╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝
============================================================
MIDI Sample Dump Standard (SDS) Utility
Optimized for Oberheim DPX-1
============================================================
Main Menu:
1. Send single sample
2. Send folder (bulk)
3. Play patch (test samples)
4. Exit
Select option (1-4): 1
Enter WAV file path (or drag and drop file):
> /path/to/your/sample.wav
Loading WAV file: /path/to/your/sample.wav
WAV File Information:
Sample Rate: 44100 Hz
Original Channels: 2
Original Bit Depth: 24 bits
Number of Samples: 88200
Duration: 2.00 seconds
Converted to: 12-bit mono
Estimated memory in DPX-1: ~129.20 KB
Available MIDI Output Ports:
1. IAC Driver Bus 1
2. USB MIDI Device
Select port (1-2) [1]: 1
Opened output port: IAC Driver Bus 1
============================================================
SDS Configuration
============================================================
MIDI Channel (0-15) [0]: 0
Sample Number (0-16383) [0]: 1
Loop Mode:
1. One-shot (no loop)
2. Sustain loop
Select mode (1-2) [1]: 1
Dump Mode:
1. Open Loop (no handshaking, faster)
2. Closed Loop (with handshaking, requires MIDI input)
Select mode (1-2) [1]: 1
Generating SDS messages...
Generated 1 header + 735 data packets
============================================================
Starting MIDI SDS Transmission
============================================================
Ready to send. Proceed? [Y/n]: y
Sending...
Progress: 735/735 packets (100.0%)
Transmission completed successfully!
Return to main menu? [Y/n]: y
DPX1-SDS-Utility/
├── src/
│ ├── main.py # Main application with interactive menu
│ ├── wav_processor.py # WAV file processing (12-bit conversion)
│ ├── sds_encoder.py # SDS protocol encoder
│ └── midi_handler.py # MIDI port handling and transmission
├── wavs/ # Sample WAV files for testing
├── requirements.txt # Project dependencies
├── README.md # This file
├── CLAUDE.md # Developer documentation for Claude Code
├── TECHNICAL_GUIDE.md # Comprehensive technical documentation
└── CONTRIBUTING.md # Contribution guidelines
This project fully implements the MIDI Sample Dump Standard adopted in January 1986 by the MIDI Manufacturers Association, specifically optimized for vintage samplers like the Oberheim DPX-1.
12-bit Unsigned Format:
- DPX-1 uses 12-bit resolution (not 16-bit)
- Unsigned representation: 0x000 = full negative, 0x800 = zero, 0xFFF = full positive
- Conversion formula:
unsigned_value = signed_value + 2048
Loop Points Configuration:
- For one-shot (no loop):
loop_start = loop_end = last_sample - For sustain loop:
loop_startandloop_enddefine the loop region - Important: Setting both to 0 creates a 1-sample loop (brief click sound)
Timing Requirements for Vintage Hardware:
- Delay after header: 3 seconds (increased for DPX-1)
- Delay between packets: 50ms (prevents buffer overruns)
Dump Header (21 bytes):
F0 7E cc 01 ss ss ee ff ff ff gg gg gg hh hh hh ii ii ii jj F7
Data Packet (127 bytes):
F0 7E cc 02 kk <120 bytes> mm F7
- Each data packet contains 120 bytes (60 samples)
- Support for samples from 8 to 28 bits
- XOR checksum for data integrity verification
- Handshaking messages (ACK, NAK, CANCEL, WAIT)
- Sustain loops with forward and alternating modes
DPX-1 Memory Formula:
Memory (bytes) = Number of samples × 1.5 bytes
Why 1.5 bytes per sample?
- DPX-1 stores samples in 12-bit mono format
- 12 bits = 1.5 bytes per sample
- Original WAV bit depth doesn't matter (converted to 12-bit)
Examples:
- 1 second @ 44.1kHz = 44,100 samples = ~64.60 KB
- 2 seconds @ 44.1kHz = 88,200 samples = ~129.20 KB
- 10 seconds @ 44.1kHz = 441,000 samples = ~646.01 KB
- macOS, Linux, or Windows
- Python 3.8 or higher
- At least one available MIDI port
- MIDI interface or virtual MIDI port
On macOS:
- Open Audio MIDI Setup
- Go to Window > Show MIDI Studio
- Double-click "IAC Driver"
- Check "Device is online"
- Restart the application
On Windows:
- Install a virtual MIDI driver like loopMIDI or virtualMIDI
On Linux:
- Make sure ALSA MIDI is properly configured
On macOS:
xcode-select --installOn Linux (Debian/Ubuntu):
sudo apt-get install libasound2-dev libjack-devProblem: Loop points were set to 0,0 Solution: Use one-shot mode which sets both to last sample
Problem: Wrong loop mode selected Solution: Select "One-shot (no loop)" mode
Problem: May have used LOOP_OFF (0x7F) which DPX-1 doesn't support Solution: Use one-shot mode instead
Problem: Incorrect sample encoding Solution: Ensure using unsigned format (signed + 2048), not two's complement
We welcome bug reports and pull requests! Please see CONTRIBUTING.md for guidelines.
If you find this project useful and it helps you work with your vintage sampler, consider supporting its development!
Your support helps maintain and improve this project. Thank you! 🙏
This project is open source and available for educational and commercial use.
Developed by: PelidaSynth Technology: Python 3, mido, numpy, python-rtmidi Target Hardware: Oberheim DPX-1 (compatible with other SDS samplers) Protocol: MIDI Sample Dump Standard (MMA/JMSC, January 1986 specification)
- TECHNICAL_GUIDE.md - Comprehensive technical documentation with detailed explanations, examples, and problem-solving timeline
- CLAUDE.md - Developer documentation for working with Claude Code
✅ Oberheim DPX-1 - Fully tested and verified
- 12-bit sample transmission
- One-shot and sustain loop modes
- Open Loop transmission (recommended)
- Memory calculation accurate
Other SDS-compatible samplers should work but may require timing adjustments.