Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
155 lines
4.8 KiB
Markdown
155 lines
4.8 KiB
Markdown
[ [Engligh](README.md) | [日本語](README.ja.md) ]
|
|
|
|
---
|
|
# PCMPlayer for MSX
|
|
|
|
## Overview
|
|
|
|
This program plays PCM data for MSX.
|
|
The PCM data is 8-bit mono PCM data at 8KHz/11KHz.
|
|
This source code uses z80asm of z88dk.
|
|
|
|
## License
|
|
|
|
MIT Lisence
|
|
|
|
## Execution Sample
|
|
|
|
You can check the operation of the sample program at the following URL.
|
|
The program stops once it is played, so if you want to play it again, use WebMSX to perform the Reset operation.
|
|
|
|
https://webmsx.org/?MACHINE=MSX1J&ROM=https://github.com/aburi6800/msx-PSGPCMPlayer/raw/main/dist/sample.rom&FAST_BOOT
|
|
|
|
## Specification
|
|
|
|
- The PCM data that can be used with this PCM player is in the following format.
|
|
- Sampling rate: 11KHz or 8KMz (default 8KHz, 11KHz requires source modification)
|
|
- Bit rate: 8bit
|
|
- monoral
|
|
> The default setting is 8 KHz playback.
|
|
> For 11KHz playback, enable line 87 and comment line 88.
|
|
- Prohibit any interruptions during playback.
|
|
|
|
## How to build
|
|
|
|
### To use cmake:
|
|
|
|
Edit the `CMakeLists.txt` included in this project to specify the source for this player (`psmplayer.asm`) and the source you created.
|
|
For example, the sample program defines the following.
|
|
```
|
|
add_source_files(
|
|
./src/msx/pcmplayer.asm
|
|
./src/msx/sample.asm
|
|
)
|
|
```
|
|
|
|
Next, run the following command in the project root directory to generate the make file.
|
|
(First time only; not necessary after the second time)
|
|
```
|
|
$ mkdir build && cd build
|
|
$ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/z88dk.cmake ..
|
|
```
|
|
|
|
Execute the following command in the `build` directory to build.
|
|
```
|
|
$ make clean && make
|
|
```
|
|
|
|
The `.rom` file will be created in the `dist` directory.
|
|
|
|
### To use the zcc command:
|
|
|
|
Enter the source directory and execute the following command (replace the source file name with your own)
|
|
This command is the same for both assembler and C.
|
|
For details on other options, such as specifying the path to the include file, see the help displayed by `zcc -h`.
|
|
```
|
|
$ zcc +msx -create-app -subtype=rom pcmplayer.asm sample.asm -o=../../dist/build.rom
|
|
```
|
|
|
|
## How to use
|
|
|
|
- Prepare the data to be played back. (See "Create PCM Data" below)
|
|
- Copy `pcmplayer.asm` to your project directory.
|
|
- At the beginning of the program source, specify the following.
|
|
```
|
|
EXTERN PCMPLAY
|
|
```
|
|
- Specify the first address of the PCM data in the HL register and the data length (in bytes) in the DE register, and then execute the following.
|
|
```
|
|
CALL PCMPLAY
|
|
```
|
|
- During playback, interrupts are disabled and other processes are stopped. Interrupt is turned back on when playback is finished.
|
|
|
|
## Create PCM data
|
|
|
|
A Python script (`wav2pcm.py`) is provided in this project to extract PCM data from WAV files.
|
|
This script works in an environment with ffmpeg installed, so please install it beforehand.
|
|
(It can be downloaded [here](https://ffmpeg.org/))
|
|
|
|
Follow the steps below to make.
|
|
|
|
1. Create a wav file
|
|
The wav file to be created can be 44.1KHz 16bit stereo.
|
|
Cutting out the recorded data can be done using a variety of tools, but can also be done using the following sites.
|
|
https://audiotrimmer.com/
|
|
|
|
1. Extract PCM data
|
|
When running for the first time, install the required modules.
|
|
```
|
|
$ cd src/python
|
|
$ pip install -r requirements.txt
|
|
```
|
|
It can then be used for
|
|
```
|
|
$ python wav2pcm.py [Input filename]
|
|
```
|
|
By default, PCM data is created in the same directory as the script with the file name `out.pcm`.
|
|
The following options are optional.
|
|
- -o Specifies the output file name
|
|
- -f Force overwriting of existing files
|
|
- -r Specify sampling rate (8 or 11)
|
|
- -h help
|
|
|
|
1. Include PCM data in the program to be used
|
|
```
|
|
PCMDATA:
|
|
INCBIN "[PCM filename]"
|
|
PCMDATA_END:
|
|
DB $7F
|
|
```
|
|
> This `PCMDATA` will be a label indicating the starting address of the PCM data.
|
|
> `PCMDATA_END` is the label set to calculate the PCM data length.
|
|
> This results in `PCMDATA_END - PCMDATA` for the data length.
|
|
|
|
## Release notes
|
|
|
|
### pcmplayer.asm
|
|
|
|
- 2022/11/27 Version 0.2.0
|
|
- Added save/restore and initialization of PSG registers
|
|
- Fixed a bug that Ch1-3 tones were not initialized when executed in WebMSX
|
|
|
|
- 2022/11/26 Version 0.1.0
|
|
- initial creation
|
|
|
|
### wav2pcm.py
|
|
|
|
- 2022/12/03 Version 0.4.0
|
|
- Supports sampling rate conversion of WAV files
|
|
- Add -r option (specifies the sampling rate of the output PCM file)
|
|
|
|
- 2022/11/28 Version 0.3.0
|
|
- Supported arguments
|
|
- Supports processing of files in arbitrary paths
|
|
|
|
- 2022/11/27 Version 0.2.0
|
|
- Fixed to correctly retrieve and process chunks of wav container
|
|
|
|
- 2022/11/26 Version 0.1.0
|
|
- initial creation
|
|
|
|
## Thanks
|
|
[h1romas4](https://github.com/h1romas4)
|
|
[超人MSX](http://hp.vector.co.jp/authors/VA054130/pcm1dm.html)
|
|
[MSX Assembly Page](http://map.grauw.nl/articles/psg_sample.php)
|