Skip to main content
Glama

Decent-Sampler Drums MCP Server

advanced-drum-kit.ts5.8 kB
import { BasicDrumKitConfig, isBasicDrumKitConfig } from './basic-drum-kit.js'; import { RoundRobinMode, VelocityLayer, MutingConfig, RoundRobinConfig } from './drum-kit-types.js'; import { MicBusConfig, DrumMicConfig, isMicBusConfig } from './mic-routing.js'; import { DrumPitchConfig, DrumEnvelopeConfig, isDrumPitchConfig, isDrumEnvelopeConfig } from './drum-controls.js'; export interface AdvancedSampleConfig { path: string; volume?: string; seqMode?: RoundRobinMode; seqLength?: number; seqPosition?: number; micConfig?: DrumMicConfig; } export interface AdvancedDrumPieceConfig { name: string; rootNote: number; seqMode?: RoundRobinMode; seqLength?: number; seqPosition?: number; muting?: MutingConfig; samples: AdvancedSampleConfig[]; } export interface AdvancedDrumKitConfig extends BasicDrumKitConfig { globalSettings: BasicDrumKitConfig["globalSettings"] & { roundRobin?: RoundRobinConfig; drumControls?: { [drumName: string]: { pitch?: DrumPitchConfig; envelope?: DrumEnvelopeConfig; }; }; micBuses?: MicBusConfig[]; }; drumPieces: AdvancedDrumPieceConfig[]; } // Type guard for AdvancedDrumKitConfig export function isAdvancedDrumKitConfig(obj: unknown): obj is AdvancedDrumKitConfig { if (!obj || typeof obj !== 'object') return false; const config = obj as Partial<AdvancedDrumKitConfig>; // Validate basic structure if (!config.globalSettings || typeof config.globalSettings !== 'object') { return false; } // Validate velocity layers if they exist if (config.globalSettings.velocityLayers !== undefined) { if (!Array.isArray(config.globalSettings.velocityLayers)) { return false; } if (!config.globalSettings.velocityLayers.every(layer => layer && typeof layer === 'object' && typeof layer.low === 'number' && typeof layer.high === 'number' && typeof layer.name === 'string' )) { return false; } } // Validate round robin configuration if present if (config.globalSettings.roundRobin) { if (typeof config.globalSettings.roundRobin !== 'object') return false; if (!['round_robin', 'random', 'true_random', 'always'].includes(config.globalSettings.roundRobin.mode)) { return false; } if (config.globalSettings.roundRobin.length !== undefined && typeof config.globalSettings.roundRobin.length !== 'number') { return false; } } // Validate drum controls if present if (config.globalSettings.drumControls) { if (typeof config.globalSettings.drumControls !== 'object') return false; for (const drumName in config.globalSettings.drumControls) { const drumControl = config.globalSettings.drumControls[drumName]; if (drumControl.pitch !== undefined && !isDrumPitchConfig(drumControl.pitch)) { return false; } if (drumControl.envelope !== undefined && !isDrumEnvelopeConfig(drumControl.envelope)) { return false; } } } // Validate mic buses if present if (config.globalSettings.micBuses) { if (!Array.isArray(config.globalSettings.micBuses)) return false; if (!config.globalSettings.micBuses.every(isMicBusConfig)) return false; } // Ensure drumPieces exists and is an array if (!Array.isArray(config.drumPieces)) return false; // Validate advanced drum pieces return config.drumPieces.every(piece => { // Validate piece name and root note if (typeof piece.name !== 'string' || typeof piece.rootNote !== 'number') return false; // Validate sequence mode if (piece.seqMode !== undefined && !['round_robin', 'random', 'true_random', 'always'].includes(piece.seqMode)) { return false; } // Validate sequence length and position if (piece.seqLength !== undefined && typeof piece.seqLength !== 'number') return false; if (piece.seqPosition !== undefined && typeof piece.seqPosition !== 'number') return false; // Validate muting configuration if (piece.muting) { if (!Array.isArray(piece.muting.tags) || !Array.isArray(piece.muting.silencedByTags)) { return false; } } // Validate advanced sample configurations return piece.samples.every(sample => { // Validate sample path if (typeof sample.path !== 'string') return false; // Optional volume validation if (sample.volume !== undefined && typeof sample.volume !== 'string') return false; // Validate sample-level sequence settings if (sample.seqMode !== undefined && !['round_robin', 'random', 'true_random', 'always'].includes(sample.seqMode)) { return false; } if (sample.seqLength !== undefined && typeof sample.seqLength !== 'number') return false; if (sample.seqPosition !== undefined && typeof sample.seqPosition !== 'number') return false; // Validate mic configuration if (sample.micConfig) { if (typeof sample.micConfig !== 'object') return false; if (!['close', 'overheadLeft', 'overheadRight', 'roomLeft', 'roomRight'].includes(sample.micConfig.position)) { return false; } if (typeof sample.micConfig.busIndex !== 'number') return false; if (sample.micConfig.volume !== undefined && typeof sample.micConfig.volume !== 'number') { return false; } } return true; }); }); } // Helper function to create an advanced drum kit configuration export function createAdvancedDrumKit(config: AdvancedDrumKitConfig): AdvancedDrumKitConfig { // Validate the configuration before returning if (!isAdvancedDrumKitConfig(config)) { throw new Error('Invalid advanced drum kit configuration'); } return config; }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dandeliongold/mcp-decent-sampler-drums'

If you have feedback or need assistance with the MCP directory API, please join our Discord server