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
<!DOCTYPE html>
<html>
<head>
<title>OP-XY MIDI Control</title>
</head>
<body>
<div id="status"></div>
<button onclick="opxy.start()">Start</button>
<button onclick="opxy.stop()">Stop</button>
@kmorrill
kmorrill / gist:121a664160dede43afa06d5373201a27
Created December 19, 2024 20:23
Mozaic OP-XY Melody Generator
@Description
Melodic Generator v2.0
Uses four knobs to control melodic generation:
- Melodic Contour: Smooth ↔ Angular intervals
- Rhythm: Steady ↔ Syncopated patterns
- Register: Narrow ↔ Wide pitch range
- Harmony: Sparse ↔ Rich note choices
Adjust any knob to generate a new melody.
@End
@kmorrill
kmorrill / gist:ac2e20613d45a7bea6e919f68f494eb6
Created December 19, 2024 20:22
Mozaic OP-XY Drum Generator
@Description
OP-XY Drum Pattern Generator v2.0
A dynamic drum pattern generator for OP-XY creating musical 4-bar patterns.
Controls:
- Density: Overall number of hits (sparse to busy)
- Variation: Pattern unpredictability and dynamics
- Balance: Emphasis between core drums vs percussion
- Repetition: Pattern evolution over time
We're going to create a preset patch using this guide.
Technical Specification for OP-XY Patch JSON File Format
1. Introduction
1.1 Purpose
The purpose of this document is to provide a comprehensive technical specification for the JSON file format used to store and exchange patch data on the OP-XY device. This specification aims to standardize the structure and content of patch files, ensuring compatibility and consistency across different patches, whether they are synth presets, drum kits, or sample-based instruments. By adhering to this format, developers, sound designers, and users can create, modify, and share patches efficiently and reliably.
1.2 Overview
(function() {
console.log('Script started.');
// Array to hold the CSV lines
let csvLines = [];
// Prepare the CSV header
csvLines.push('Title,URL,Channel Name,Upload Date,Duration,Thumbnail URL');
// Select all video elements inside the liked videos page
(async function() {
// Utility function to pause execution for a specified duration (in milliseconds)
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
// Function to extract book information based on ASIN
function extractBookInfo(asin) {
// Extract the book title
const titleElement = document.querySelector(`#${asin} h2.a-size-base.a-color-base.a-text-center.kp-notebook-searchable.a-text-bold`);
const title = titleElement ? titleElement.innerText.trim() : 'Title not found';