README
Uttori Pad Info
Utility to manipulate the PAD_INFO.BIN file for SP-404 / SP-404SX / SP-404A series of samplers.
Install
npm install --save @uttori/audio-padinfo
Example
const fs = require('fs');
const { AudioPadInfo } = require('@uttori/audio-padinfo');
const data = fs.readFileSync('./PAD_INFO.bin');
const { pads } = AudioPadInfo.fromFile(data);
console.log('Pads:', pads);
➜ [
{
"avaliable": false,
"label": "A1",
"filename": "A0000001.WAV",
"originalSampleStart": 512,
"originalSampleEnd": 385388,
"userSampleStart": 512,
"userSampleEnd": 385388,
"volume": 87,
"lofi": false,
"loop": false,
"gate": false,
"reverse": true,
"format": "WAVE",
"channels": "Stereo",
"tempoMode": "Off",
"originalTempo": 109.9,
"userTempo": 109.9
},
...,
{
"avaliable": false,
"label": "J12",
"filename": "J0000012.WAV",
"originalSampleStart": 512,
"originalSampleEnd": 53424,
"userSampleStart": 512,
"userSampleEnd": 53424,
"volume": 127,
"lofi": false,
"loop": false,
"gate": true,
"reverse": false,
"format": "WAVE",
"channels": "Stereo",
"tempoMode": "Off",
"originalTempo": 100,
"userTempo": 100
}
]
API Reference
Classes
- AudioPadInfo
Uttori Pad Info - Utility to manipulate the PAD_INFO.BIN file for SP-404 series of samplers.
Typedefs
- Pad :
object
A Pad object.
AudioPadInfo
Uttori Pad Info - Utility to manipulate the PAD_INFO.BIN file for SP-404 series of samplers.
Kind: global class Properties
Name | Type | Description |
---|---|---|
pads | Array.<Pad> |
Parsed Pads |
- AudioPadInfo
- new AudioPadInfo(list, [overrides])
- instance
- static
- .fromFile(data) ⇒
AudioPadInfo
- .fromBuffer(buffer) ⇒
AudioPadInfo
- .encodePad(data) ⇒
Buffer
- .checkDefault(pad, [strict]) ⇒
boolean
- .getPadLabel(index) ⇒
string
- .getPadIndex(label) ⇒
number
- .fromFile(data) ⇒
new AudioPadInfo(list, [overrides])
Creates an instance of AudioPadInfo.
Param | Type | Default | Description |
---|---|---|---|
list | DataBufferList |
The DataBufferList of the audio file to process. | |
[overrides] | object |
Options for this instance. | |
[overrides.size] | number |
16 |
ArrayBuffer byteLength for the underlying binary parsing. |
Example (AudioPadInfo)
const fs = require('fs');
const data = fs.readFileSync('./PAD_INFO.bin');
const { pads } = AudioPadInfo.fromFile(data);
fs.writeFileSync('./output.json', JSON.stringify(pads, null, 2));
console.log('Pads:', pads);
➜ [
{
"avaliable": false,
"label": "A1",
"filename": "A0000001.WAV",
"originalSampleStart": 512,
"originalSampleEnd": 385388,
"userSampleStart": 512,
"userSampleEnd": 385388,
"volume": 87,
"lofi": false,
"loop": false,
"gate": false,
"reverse": true,
"format": "WAVE",
"channels": "Stereo",
"tempoMode": "Off",
"originalTempo": 109.9,
"userTempo": 109.9
},
...,
{
"avaliable": false,
"label": "J12",
"filename": "J0000012.WAV",
"originalSampleStart": 512,
"originalSampleEnd": 53424,
"userSampleStart": 512,
"userSampleEnd": 53424,
"volume": 127,
"lofi": false,
"loop": false,
"gate": true,
"reverse": false,
"format": "WAVE",
"channels": "Stereo",
"tempoMode": "Off",
"originalTempo": 100,
"userTempo": 100
}
]
audioPadInfo.parse()
Parse the PAD_INFO.BIN file, decoding the supported pad info.
This is stored alongside the samples in PAD_INFO.BIN and contains 120 × 32-byte records, one for each pad from A1 to J12. In this file, values are stored in big-endian order
Kind: instance method of AudioPadInfo
AudioPadInfo
AudioPadInfo.fromFile(data) ⇒ Creates a new AudioPadInfo from file data.
Kind: static method of AudioPadInfo
Returns: AudioPadInfo
- the new AudioPadInfo instance for the provided file data
Param | Type | Description |
---|---|---|
data | Buffer |
The data of the image to process. |
AudioPadInfo
AudioPadInfo.fromBuffer(buffer) ⇒ Creates a new AudioPadInfo from a DataBuffer.
Kind: static method of AudioPadInfo
Returns: AudioPadInfo
- the new AudioPadInfo instance for the provided DataBuffer
Param | Type | Description |
---|---|---|
buffer | DataBuffer |
The DataBuffer of the image to process. |
Buffer
AudioPadInfo.encodePad(data) ⇒ Encode JSON values to a valid pad structure.
Kind: static method of AudioPadInfo
Returns: Buffer
- - The new pad Buffer.
Param | Type | Default | Description |
---|---|---|---|
data | Pad |
The JSON values to encode. | |
[data.originalSampleStart] | number |
512 |
Sample start and end offsets are relative to the original file. |
[data.originalSampleEnd] | number |
512 |
SP-404SX Wave Converter v1.01 on macOS sets the start values to 512, the start of data. |
[data.userSampleStart] | number |
512 |
The length of the RIFF headers before the data chunk is always exactly 512 bytes. |
[data.userSampleEnd] | number |
512 |
The sample end value is the length of the file, and when converted correctly this is the length of the whole file. |
[data.volume] | number |
127 |
Volume is between 0 and 127. |
[data.lofi] | boolean |
false |
LoFi: false off, true on |
[data.loop] | boolean |
false |
Loop: false off, true on |
[data.gate] | boolean |
true |
Gate: false off, true on |
[data.reverse] | boolean |
false |
Reverse: false off, true on |
[data.format] | string |
"'WAVE'" |
Format is 0 for an 'AIFF' sample, and 1 for a 'WAVE' sample. |
[data.channels] | number |
2 |
Mono or Stereo |
[data.tempoMode] | string |
"'Off'" |
Tempo Mode: 0 = 'Off', 1 = 'Pattern', 2 = 'User' |
[data.originalTempo] | number |
1200 |
Tempo is BPM (beats per minute) mutiplied by 10, 0x4B0 = 1200 = 120 bpm. |
[data.userTempo] | number |
1200 |
SP-404SX Wave Converter v1.01 on macOS computes the original tempo as 120 / sample length. |
boolean
AudioPadInfo.checkDefault(pad, [strict]) ⇒ Checks to see if a Pad is set to the default values, if so it is likely.
Kind: static method of AudioPadInfo
Returns: boolean
- - Returns true if the Pad is set the the default values, false otherwise.
Param | Type | Default | Description |
---|---|---|---|
pad | Pad |
The JSON values to check. | |
[strict] | boolean |
false |
When strict all values are checked for defaults, otherwise just the offsets are checked. |
string
AudioPadInfo.getPadLabel(index) ⇒ Convert a numberic value used in the PAD_INFO.bin file for that pad to the pad label like A1
or J12
.
Kind: static method of AudioPadInfo
Returns: string
- - The pad label like A1
or J12
.
Param | Type | Description |
---|---|---|
index | number |
The numberic value used in the PAD_INFO.bin file. |
number
AudioPadInfo.getPadIndex(label) ⇒ Convert a pad label like A1
or J12
to the numberic value used in the PAD_INFO.bin file for that pad.
Kind: static method of AudioPadInfo
Returns: number
- - The numberic value used in the PAD_INFO.bin file.
Param | Type | Description |
---|---|---|
label | string |
The pad label like A1 or J12 . |
object
Pad : A Pad object.
Kind: global typedef Properties
Name | Type | Description |
---|---|---|
avaliable | boolean |
If the pad is actively used in the pad file or not. |
label | string |
The human readable pad text, A1 - J12 . |
filename | string |
The filename for the corresponding Wave File, A0000001.WAV - J0000012.WAV . |
originalSampleStart | number |
Sample start and end offsets are relative to the original file |
originalSampleEnd | number |
SP-404SX Wave Converter v1.01 on macOS sets the start values to 512, the start of data |
userSampleStart | number |
The length of the RIFF headers before the data chunk is always exactly 512 bytes |
userSampleEnd | number |
The sample end value is the length of the file, and when converted correctly this is the length of the whole file |
volume | number |
Volume is between 0 and 127 |
lofi | boolean |
LoFi: false off, true on |
loop | boolean |
Loop: false off, true on |
gate | boolean |
Gate: false off, true on |
reverse | boolean |
Reverse: false off, true on |
format | string |
Format is 0 for an 'AIFF' sample, and 1 for a 'WAVE' sample |
channels | number |
Mono or Stereo |
tempoMode | string |
Tempo Mode: 0 = 'Off', 1 = 'Pattern', 2 = 'User' |
originalTempo | number |
BPM determined by the software. Tempo is BPM (beats per minute) mutiplied by 10, 0x4B0 = 1200 = 120 bpm |
userTempo | number |
User set BPM on the device |
Tests
To run the test suite, first install the dependencies, then run npm test
:
npm install
npm test
DEBUG=Uttori* npm test
Contributors
Thanks
- Paul Battley - His Roland SP-404SX sample file format was a huge help.