Get up and running with Chordlock in minutes.
git clone https://github.com/kurogedelic/Chordlock.git
cd Chordlock
# Build CLI
g++ -std=c++17 -O2 -I./src -I./src/engines -I./src/interfaces \
-I./src/processors -I./src/utils src/cli_main.cpp src/Chordlock.cpp \
src/engines/EnhancedHashLookupEngine.cpp src/processors/VelocityProcessor.cpp \
-o build/chordlock -framework CoreMIDI -framework CoreFoundation
# Build WebAssembly
emcc -std=c++17 -O2 -I./src -I./src/engines -I./src/interfaces \
-I./src/processors -I./src/utils src/chordlock_wasm.cpp src/Chordlock.cpp \
src/engines/EnhancedHashLookupEngine.cpp src/processors/VelocityProcessor.cpp \
-o web_app/chordlock.js -s EXPORTED_RUNTIME_METHODS='["ccall"]'
npm install -g @kurogedelic/chordlock-mcp
# Detect chord from MIDI notes with key context
./build/chordlock -N 60,64,67 -k C
# → C (confidence: 21.87)
# → Roman Numeral: I (in C major)
# Generate chord from Roman numeral
./build/chordlock -d "V7" -k C
# → G7 [55, 59, 62, 65]
# Convert chord name to MIDI notes
./build/chordlock -c "Cmaj7"
# → [48, 52, 55, 59]
#include "Chordlock.hpp"
int main() {
Chordlock detector;
// Set key context
detector.setKeyContext(0, false); // C major
// Input notes
detector.noteOn(60, 80); // C
detector.noteOn(64, 80); // E
detector.noteOn(67, 80); // G
// Detect chord
auto result = detector.detectChord();
std::cout << "Chord: " << result.chordName << std::endl;
// Analyze Roman numeral
auto degree = detector.analyzeCurrentNotesToDegree(0, false);
std::cout << "Degree: " << degree << std::endl;
return 0;
}
<script src="chordlock.js"></script>
<script>
ChordlockModule().then(function(Module) {
// Initialize
Module.ccall('chordlock_init', null, [], []);
Module.ccall('chordlock_set_key', null, ['number'], [0]); // C major
// Input notes
Module.ccall('chordlock_note_on', null, ['number', 'number'], [60, 80]);
Module.ccall('chordlock_note_on', null, ['number', 'number'], [64, 80]);
Module.ccall('chordlock_note_on', null, ['number', 'number'], [67, 80]);
// Detect chord
const result = Module.ccall('chordlock_detect_chord_detailed', 'string', ['number'], [5]);
const data = JSON.parse(result);
console.log('Chord:', data.chord);
});
</script>
Configure in Claude Desktop/Code:
{
"mcpServers": {
"chordlock": {
"command": "npx",
"args": ["@kurogedelic/chordlock-mcp"]
}
}
}
Then use with AI:
“What MIDI notes make up a Dm7b5 chord?” “Generate a jazz ii-V-I progression in Bb major” “Analyze this chord progression: C - Am - F - G”
# Same notes, different interpretations
./build/chordlock -N 52,60,64,67,74 -k C # → C/E [I]
./build/chordlock -N 52,60,64,67,74 -k Em # → Em7(add♭6) [i7]
./build/chordlock -N 55,59,62,65 -k C # → G7 [V7]
./build/chordlock -N 57,60,64 -k C # → Am [vi]
./build/chordlock -N 53,57,60,64 -k C # → F [IV]
./build/chordlock -d "ii7" -k C # → Dm7 [50, 53, 57, 60]
./build/chordlock -d "V9" -k Am # → E9 [52, 56, 59, 62, 66]
./build/chordlock -d "bVII" -k Gm # → F [53, 57, 60]