Decent-Sampler Drums MCP Server
by dandeliongold
Verified
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
// Helper to write 32-bit integer
function writeInt32(buffer, value, offset) {
buffer.writeInt32LE(value, offset);
return offset + 4;
}
// Helper to write 16-bit integer
function writeInt16(buffer, value, offset) {
buffer.writeInt16LE(value, offset);
return offset + 2;
}
// Helper to write string
function writeString(buffer, string, offset) {
buffer.write(string, offset, string.length);
return offset + string.length;
}
// Create valid WAV file (1 channel, 44.1kHz, 16-bit)
function createValidWav() {
const sampleRate = 44100;
const channels = 1;
const bitsPerSample = 16;
const dataSize = 1024; // 512 samples of audio data
const fileSize = 44 + dataSize; // 44 bytes header + data
const buffer = Buffer.alloc(fileSize);
let offset = 0;
// RIFF header
offset = writeString(buffer, 'RIFF', 0);
offset = writeInt32(buffer, fileSize - 8, offset);
offset = writeString(buffer, 'WAVE', offset);
// fmt chunk
offset = writeString(buffer, 'fmt ', offset);
offset = writeInt32(buffer, 16, offset); // fmt chunk size
offset = writeInt16(buffer, 1, offset); // audio format (1 = PCM)
offset = writeInt16(buffer, channels, offset);
offset = writeInt32(buffer, sampleRate, offset);
offset = writeInt32(buffer, sampleRate * channels * bitsPerSample / 8, offset); // byte rate
offset = writeInt16(buffer, channels * bitsPerSample / 8, offset); // block align
offset = writeInt16(buffer, bitsPerSample, offset);
// data chunk
offset = writeString(buffer, 'data', offset);
offset = writeInt32(buffer, dataSize, offset);
// Fill with sine wave data
for (let i = 0; i < dataSize/2; i++) {
const value = Math.sin(i * 0.1) * 32767;
offset = writeInt16(buffer, value, offset);
}
fs.writeFileSync(path.join(__dirname, 'valid.wav'), buffer);
}
// Create corrupted WAV with JUNK chunk instead of fmt
function createCorruptedWav() {
const fileSize = 44;
const buffer = Buffer.alloc(fileSize);
let offset = 0;
// RIFF header
offset = writeString(buffer, 'RIFF', 0);
offset = writeInt32(buffer, fileSize - 8, offset);
offset = writeString(buffer, 'WAVE', offset);
// JUNK chunk instead of fmt
offset = writeString(buffer, 'JUNK', offset);
offset = writeInt32(buffer, 28, offset); // chunk size
offset = writeInt16(buffer, 0, offset); // audio format (invalid)
// Fill rest with zeros
buffer.fill(0, offset);
fs.writeFileSync(path.join(__dirname, 'corrupted.wav'), buffer);
}
// Create WAV with invalid format (0)
function createInvalidFormatWav() {
const fileSize = 44;
const buffer = Buffer.alloc(fileSize);
let offset = 0;
// RIFF header
offset = writeString(buffer, 'RIFF', 0);
offset = writeInt32(buffer, fileSize - 8, offset);
offset = writeString(buffer, 'WAVE', offset);
// fmt chunk with invalid format
offset = writeString(buffer, 'fmt ', offset);
offset = writeInt32(buffer, 16, offset);
offset = writeInt16(buffer, 0, offset); // invalid format (0)
// Fill rest with zeros
buffer.fill(0, offset);
fs.writeFileSync(path.join(__dirname, 'invalid_format.wav'), buffer);
}
// Create WAV missing data chunk
function createMissingChunksWav() {
const fileSize = 44;
const buffer = Buffer.alloc(fileSize);
let offset = 0;
// RIFF header
offset = writeString(buffer, 'RIFF', 0);
offset = writeInt32(buffer, fileSize - 8, offset);
offset = writeString(buffer, 'WAVE', offset);
// fmt chunk only, no data chunk
offset = writeString(buffer, 'fmt ', offset);
offset = writeInt32(buffer, 16, offset);
offset = writeInt16(buffer, 1, offset);
offset = writeInt16(buffer, 1, offset); // channels
offset = writeInt32(buffer, 44100, offset); // sample rate
offset = writeInt32(buffer, 44100 * 2, offset); // byte rate
offset = writeInt16(buffer, 2, offset); // block align
offset = writeInt16(buffer, 16, offset); // bits per sample
fs.writeFileSync(path.join(__dirname, 'missing_chunks.wav'), buffer);
}
// Create WAV with invalid chunk sizes
function createInvalidSizesWav() {
const buffer = Buffer.alloc(44);
let offset = 0;
// RIFF header with invalid size
offset = writeString(buffer, 'RIFF', 0);
offset = writeInt32(buffer, 2147483647, offset); // Invalid size (MAX_INT32)
offset = writeString(buffer, 'WAVE', offset);
// fmt chunk with invalid size
offset = writeString(buffer, 'fmt ', offset);
offset = writeInt32(buffer, 2147483647, offset); // Invalid chunk size (MAX_INT32)
// Fill rest with zeros
buffer.fill(0, offset);
fs.writeFileSync(path.join(__dirname, 'invalid_sizes.wav'), buffer);
}
// Generate all test files
createValidWav();
createCorruptedWav();
createInvalidFormatWav();
createMissingChunksWav();
createInvalidSizesWav();
console.log('Generated test WAV files in __tests__/fixtures/');