mcpField
M
midi-generation

midi-generation

github.com/tubone24Creative & media3748 installsUpdated 45w ago
Repository

About midi-generation

midi-generation is a Skill for creating MIDI files with music-theory guidance. It uses provided scripts and composition JSON rather than custom generation code, with an optional MIDI-to-WAV conversion step.

Key features

  1. 01Generate MIDI with theory rules
  2. 02Normalize and refine compositions with scripts
  3. 03Consult style-specific theory references
  4. 04Convert MIDI to WAV

Use cases

  1. 01Create a MIDI arrangement in a chosen style
  2. 02Validate and normalize composition data
  3. 03Extend a piece or its tracks
  4. 04Convert generated MIDI to WAV

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/tubone24/midi-agent-skill --skill midi-generation

After installing, type/midi-generationin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

requirements.txt
.gitignore
README.md
LICENSE.txt
midi_types/
__init__.py
music.py
gm_instruments.py
output/
.gitkeep
resources/
counterpoint.md
chord-progressions.md
orchestration.md
modes-scales.md
rhythm-patterns.md
voice-leading.md
music-theory.md
skills/
convert_to_wav.py
generate_midi.py
normalize_composition.py
refine_composition.py
__init__.py
soundfonts/
.gitkeep

Details

From the project README

MIDI Generation Skill

Generate MIDI files with proper music theory. Use the provided Python scripts in skills/. Do NOT write custom code.

Important Rules

  1. Use provided scripts in skills/ directory (Python)
  2. Never write custom Python/JS for MIDI generation
  3. Install dependencies first: pip install midiutil
  4. Consult music theory resources when needed (see below)

Quick Dissonance Rules

Always follow these to avoid harsh sounds:

  1. Never play notes 1 semitone apart (C+C#, E+F, B+C)
  2. Bass plays root or fifth of the chord
  3. Spread voices across octaves (don't cluster)
  4. Each track uses different MIDI channel (automatic)

Music Theory Resources (Read When Needed)

Only read the resource that matches your current task:

When you need...Read this file
Scales, chords, intervals, cadencesresources/music-theory.md
Chord progressions by genreresources/chord-progressions.md
Avoiding dissonance, voice spacingresources/voice-leading.md
Classical/Baroque counterpointresources/counterpoint.md
Modes (Dorian, Phrygian, etc.)resources/modes-scales.md
Rhythm, time signatures, syncopationresources/rhythm-patterns.md
Instrument ranges, combinationsresources/orchestration.md
When to Read Each Resource
  • Pop/Rock song → chord-progressions.md + voice-leading.md
  • Classical piece → counterpoint.md + orchestration.md
  • Jazz composition → modes-scales.md + chord-progressions.md
  • Film score → orchestration.md + modes-scales.md
  • Any composition → Always check voice-leading.md for dissonance

Workflow

  1. Install dependencies: pip install midiutil
  2. Identify genre/style → Select appropriate resources
  3. Read relevant theory → Only the files you need
  4. Choose instruments → See midi_types/gm_instruments.py
  5. Create composition JSON
  6. Use scripts to generate MIDI

Python Scripts

ScriptPurpose
skills/generate_midi.pyGenerate MIDI (auto-assigns channels per track)
skills/normalize_composition.pyValidate and normalize input
skills/refine_composition.pyAdjust length, extend tracks
skills/convert_to_wav.pyMIDI → WAV (requires FluidSynth)

Usage Example

import sys
sys.path.insert(0, '/path/to/midi-skill')

from skills.generate_midi import generate_midi_from_dict

composition = {
    "title": "My Song",
    "bpm": 120,
    "tracks": [
        {
            "instrument": "acoustic-grand-piano",
            "notes": [
                {"pitch": "C4", "duration": "4"},
                {"pitch": "E4", "duration": "4"},
                {"pitch": "G4", "duration": "4"},
                {"pitch": "C5", "duration": "2"}
            ]
        },
        {
            "instrument": "acoustic-bass",
            "notes": [
                {"pitch": "C2", "duration": "2"},
                {"pitch": "G2", "duration": "2"}
            ]
        }
    ]
}

midi_path = generate_midi_from_dict(composition)
print(f"Generated: {midi_path}")

Composition Format

{
  "title": "My Song",
  "bpm": 120,
  "tracks": [
    {
      "instrument": "acoustic-grand-piano",
      "notes": [
        { "pitch": "C4", "duration": "4" },
        { "pitch": "E4", "duration": "4" }
      ]
    },
    {
      "instrument": "acoustic-bass",
      "notes": [
        { "pitch": "C2", "duration": "2" }
      ]
    }
  ]
}

Duration Notation

ValueNote
1Whole note (4 beats)
2Half note (2 beats)
d2Dotted half (3 beats)
4Quarter note (1 beat)
d4Dotted quarter (1.5 beats)
8Eighth note (0.5 beats)
16Sixteenth note (0.25 beats)

Instrument Aliases

AliasGM Instrument
pianoacoustic-grand-piano
guitaracoustic-guitar-nylon
bassacoustic-bass
stringsstring-ensemble-1
brassbrass-section
saxalto-sax

Full list: midi_types/gm_instruments.py

Notes

  • Max 15 melodic tracks (MIDI channels 0-8, 10-15; ch.9 = drums)
  • Output: output/ directory
  • WAV requires: FluidSynth + A320U.sf2 in soundfonts/

Comments

Markdown supported