Skip to content

Instantly share code, notes, and snippets.

View kmorrill's full-sized avatar

Kevin Morrill kmorrill

  • Mattermark
  • San Francisco, CA
View GitHub Profile
@kmorrill
kmorrill / AGENTS.md
Created November 2, 2025 17:22
OP-XY File Format agent doc and findings

Agent Log

Original Purpose

  • Assist in reverse engineering the OP-XY .xy project files.
  • Preserve the originals by moving them into src/ and never modifying that directory.
  • Use separate working copies for any experiments or tooling.

Current Findings

  • The .xy binaries share a big-endian signature dd cc bb aa 09 13 03 86, which likely serves as the container magic before a series of chunk descriptors (OP-Z carries a similar design).
  • The first ~0x200 bytes form a structured header with version-like integers and float encodings (tempo/swing/global FX candidates). These fields differ per project in ways that line up with expected tempo/swing ranges.
@kmorrill
kmorrill / list_samples.py
Created November 2, 2025 17:07
Extract the sample/library paths embedded in OP-XY project files.
#!/usr/bin/env python3
"""
Extract the sample/library paths embedded in OP-XY project files.
Teenage Engineering stores each record as:
* 12-byte big-endian prologue (`>6H`)
* null-terminated folder string (e.g. `content/samples/...`)
* null-terminated optional filename (often blank)
* 8-byte trailer of metadata/IDs
(function(){
if (window.__sbRemoteInitialized) {
if (typeof window.__sbRemoteStart === 'function') window.__sbRemoteStart();
return;
}
window.__sbRemoteInitialized = true;
const log = (...args) => console.log('[SB][remote]', ...args);
function sleep(ms) {
@kmorrill
kmorrill / op-xy-vibe.md
Last active September 13, 2025 19:48
OP-XY Vibe Coding JSON format

OP‑XY Loop JSON Specification (opxyloop‑1.0)

Preamble

What this is. A compact, JSON‑based loop format for vibe‑coding musical ideas with large language models (LLMs), quick human edits, and reliable MIDI playback on the OP‑XY. One file = one loop. You can regenerate, tweak, and audition rapidly without wrestling DAW projects or opaque binary formats.

What you can do with it.

  • Generate with an LLM: Keys are stable, field names are explicit, and defaults are predictable—so models can create and modify patterns safely.
  • Edit by hand or UI: The structure maps cleanly to a step grid, plus lanes for CC and LFO modulation.
  • Play it back: A lightweight runtime reads the JSON and schedules notes/automation to the OP‑XY over MIDI.
# OP‑XY Codex Agent — Starter Prompt
**Role:** You are a coding agent on macOS that creates, runs, and iteratively extends a Python project that sends MIDI notes and CCs to a device whose MIDI output port name is exactly `OP-XY`. You must both: (1) build the codebase progressively, and (2) support a live “vibe‑coding” workflow where we co‑create songs by generating/altering musical parts and sound design in real time.
**Prime Directives**
* Favor clear, modular, production‑ready code with minimal but meaningful comments.
* Never block on questions; make sensible defaults and keep going. Log assumptions to `/logs/assumptions.md`.
* Provide a **dry‑run** mode that prints intended MIDI instead of sending.
* Enforce safety: no infinite loops, graceful shutdown on Ctrl‑C, handle missing ports, and **rate‑limit CC output** (\~≤300 msgs/sec burst; ≤100 msgs/sec sustained).
@kmorrill
kmorrill / gist:694f42dd144b3b4b5761bb708c48ed11
Created August 17, 2025 22:35
Personalized Open Source finder prompt
```
Review all of my previous ChatGPT conversations to infer my personal interests, tools, devices, research topics, and any books or frameworks I’ve mentioned. Use that inferred “lens” to personalize the following template. Replace every bracketed placeholder (e.g., <insert focus areas and example subtopics>) with specifics drawn from my history. Populate the Lens, Reference Works, Example Interest Filters, and other sections accordingly. Do not run the mission yet; simply output the fully personalized prompt, ready for me to use.
You are **an Open‑Source Radar Agent**.
**Mission.** On each run, find *what’s new in the last 7 days* across open‑source **code and models** that match the subscriber’s **lens**; enrich, score, and return a concise, skimmable **newsletter** that clearly connects finds back to that lens and current work. Do not include items that predate the freshness window unless they shipped a **new release** in the window. Avoid filler. **For every item you include, record its publication or
@kmorrill
kmorrill / Mozaic MIDI Interception.txt
Last active February 3, 2025 04:50
Mozaic MIDI Interception
MIDI Reception and Intervention
• MIDI Input Handling:
• Mozaic triggers the @OnMidiInput event when any MIDI data is received.
• Note: Incoming MIDI is not automatically forwarded to the output—you must explicitly forward it using commands like SendMIDIThru or SendMIDIThruOnCh <channel>.
• Forwarding MIDI Data:
• Use SendMIDIThru to pass all incoming MIDI data unchanged.
• Use SendMIDIThruOnCh <channel> to reassign all incoming MIDI to a specific channel (e.g., SendMIDIThruOnCh 9 routes everything to channel 9).
• Filtering MIDI Events:
• The variable MIDICommand holds the last received MIDI command (e.g., Note On 0x90, Note Off 0x80, CC 0xB0).
• Mozaic supports both hexadecimal (e.g., 0xB0) and decimal (e.g., 176) notation.
@kmorrill
kmorrill / Mozaic knob labels.txt
Created February 2, 2025 16:44
Mozaic knob labels
@OnLoad
ShowLayout 0
// Set the default label for knob 0 when the script loads.
LabelKnob 0, {Knob1}
@End
@OnKnobChange
// Only process changes for knob 0.
if LastKnob = 0
// Continue processing knob 0 changes.
@kmorrill
kmorrill / Mozaic LLM primer.txt
Last active February 2, 2025 16:54
Mozaic LLM primer.txt
MOZAIC SCRIPT SYNTAX SHEET
Download the full programming manual on ruismaker.com
MIDI functions:
SendMIDIOut <byte1>, <byte2>, <byte3> [,<delay_in_milliseconds>]
SendMIDINoteOn <chan>, <note>, <velocity> [,<delay_in_milliseconds>]
SendMIDINoteOff <chan>, <note>, <velocity> [,<delay_in_milliseconds>]
SendMIDICC <chan>, <controller>, <value> [,<delay_in_milliseconds>]
@kmorrill
kmorrill / Mozaic OP-XY LFO explorer.txt
Last active February 2, 2025 16:33
Mozaic OP-XY LFO explorer
@OnLoad
ShowLayout 0
Call @ResetKnobLabels
// Set default LFO values
lfoDest = 0 // Default: Volume
lfoSpeed = 6 // Default: Quarter Note
lfoCurve = 0 // Default: Sine
lfoAmount = 127 // Default: Full Range
midiCC = 7 // Default CC: Volume