+
+ {/* HEADER */}
+
+
+
+
+
+
+ UNIVERSAL
+
+ Music Production System
+
+
+
+ THE COMPLETE KNOWLEDGE OF HUMAN MUSICAL TRADITIONS
+
+
+ 📚 {ALL_SCALES.length} Scales
+ 🎹 {ALL_TUNING_SYSTEMS.length} Tunings
+ 🥁 {ALL_RHYTHMS.length} Rhythms
+ 🎵 {ALL_INSTRUMENTS.length} Instruments
+
+
+
+
+
+
+
+
+ {/* MODE SELECTOR */}
+
+ {[
+ { id: 'MATRIX', label: 'Harmonic Matrix', icon: Grid },
+ { id: 'SCALE_EXPLORER', label: 'Scale Explorer', icon: Music },
+ { id: 'RHYTHM_LAB', label: 'Rhythm Laboratory', icon: Radio },
+ { id: 'COMPOSER', label: 'Composer Studio', icon: Wand2 }
+ ].map(mode => (
+
+ ))}
+
+
+
+
+
+ {/* LEFT SIDEBAR - CONTROLS */}
+
+
+ {/* GLOBAL SETTINGS PANEL */}
+
+
+
+ Global Controls
+
+
+
+ {/* Tuning System */}
+
+
+
+
{selectedTuning.description}
+
+
+ {/* Instrument */}
+
+
+
+
{selectedInstrument.description}
+
+
+ {/* Volume */}
+
+
+ Master Volume
+ {(volume * 100).toFixed(0)}%
+
+
setVolume(parseFloat(e.target.value))}
+ className="w-full h-1.5 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-teal-500"
+ />
+
+
+
+
+ {/* MODE-SPECIFIC CONTROLS */}
+ {mainMode === 'MATRIX' && (
+
+
+
+ Matrix Mode
+
+
+ {['LAMBDOMA', 'HARMONIC', 'GOLDEN', 'CHROMOSOMAL'].map((m) => (
+
+ ))}
+
+
+ {matrixMode !== 'CHROMOSOMAL' && (
+
+
+ Grid Size
+ {gridSize}
+
+
setGridSize(parseInt(e.target.value))}
+ className="w-full h-1.5 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-blue-500"
+ />
+
+ )}
+
+
+
+
+
+
+
+
+ )}
+
+ {mainMode === 'SCALE_EXPLORER' && (
+
+
+
+ Scale Selection
+
+
+
+
+
+
Culture: {selectedScale.culture}
+
Region: {selectedScale.region}
+
Era: {selectedScale.era}
+
{selectedScale.description}
+ {selectedScale.emotionalCharacter && (
+
✨ {selectedScale.emotionalCharacter}
+ )}
+
+
+
+
+ )}
+
+ {mainMode === 'RHYTHM_LAB' && (
+
+
+
+ Rhythm Pattern
+
+
+
+
+
+
Culture: {selectedRhythm.culture}
+
Cycle: {selectedRhythm.subdivisions} beats
+
{selectedRhythm.description}
+
+
+
+
+ BPM
+ {rhythmBPM}
+
+
setRhythmBPM(parseInt(e.target.value))}
+ className="w-full h-1.5 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-orange-500"
+ />
+
+
+
+
+ )}
+
+ {mainMode === 'COMPOSER' && (
+
+
+
+ Composer Tools
+
+
+
+
+
+
+
Recorded Notes:
+
{recordedNotes.length}
+
+
+ {recordedNotes.length > 0 && (
+ <>
+
+
+ >
+ )}
+
+
+ )}
+
+ {/* INFO PANEL */}
+
+
+
+ Inspector
+
+
+ {currentCellData ? (
+
+
+ Target
+
+ {matrixMode === 'CHROMOSOMAL' ? `Chr ${currentCellData.label}` : `(${currentCellData.realX}, ${currentCellData.realY})`}
+
+
+
+
+
+
Frequency
+
{currentCellData.frequency.toFixed(2)} Hz
+
+
+
Ratio
+
{currentCellData.ratio.toFixed(4)}
+
+
+
Pitch
+
+ {getNoteName(currentCellData.frequency, selectedTuning.baseFrequency)}
+
+
+
+
Cents
+
0 ? 'text-green-400' : 'text-red-400'}`}>
+ {currentCellData.cents > 0 ? '+' : ''}{currentCellData.cents}
+
+
+
+
+ ) : (
+
+
+ Hover to inspect
+
+ )}
+
+
+
+ {/* MAIN VIEWPORT */}
+
+ {mainMode === 'MATRIX' && viewMode === '2D' && (
+
+
+ {matrixData.map((row) => (
+ row.map((cell: any) => {
+ const isActive = currentCellData?.x === cell.x && currentCellData?.y === cell.y;
+ return (
+
handleCellEnter(cell)}
+ onMouseLeave={() => handleCellLeave(cell)}
+ >
+
+ {matrixMode === 'CHROMOSOMAL' ? (
+ <>
+ CHR
+ {cell.label}
+ >
+ ) : (
+ <>
+ {cell.label}
+
+ {cell.frequency < 1000 ? cell.frequency.toFixed(0) : (cell.frequency / 1000).toFixed(1) + 'k'}
+
+ >
+ )}
+
+
+ );
+ })
+ ))}
+
+
+ )}
+
+ {mainMode === 'SCALE_EXPLORER' && (
+
+
+
+ {selectedScale.name}
+
+
+
+ {selectedScale.intervals.map((cents, idx) => {
+ const freq = scaleRootFreq * Math.pow(2, cents / 1200);
+ return (
+
+ );
+ })}
+
+
+
+
Cultural Context
+
+
Traditional Use: {selectedScale.traditionalUse}
+ {selectedScale.emotionalCharacter && (
+
Emotional Character: {selectedScale.emotionalCharacter}
+ )}
+
+
+
+
+ )}
+
+ {mainMode === 'RHYTHM_LAB' && (
+
+
+
+ {selectedRhythm.name}
+
+
+ {/* Visual Pattern */}
+
+
+ {selectedRhythm.pattern.map((hit, idx) => (
+
= 2 ? 'bg-red-500' : hit >= 1 ? 'bg-orange-500' : 'bg-slate-700'
+ } transition-all`}
+ style={{ opacity: hit > 0 ? 1 : 0.3 }}
+ />
+ ))}
+
+
+ Red = Accent | Orange = Hit | Gray = Rest
+
+
+
+
+
Rhythm Details
+
+
Region: {selectedRhythm.region}
+
Subdivisions: {selectedRhythm.subdivisions}
+
Traditional Use: {selectedRhythm.traditionalUse}
+ {selectedRhythm.tempo && (
+
Traditional Tempo: {selectedRhythm.tempo.min}-{selectedRhythm.tempo.max} BPM
+ )}
+
+
+
+
+ )}
+
+ {mainMode === 'COMPOSER' && (
+
+
+
+ Composition Studio
+
+
+ {recording && (
+
+
+
+
RECORDING IN PROGRESS
+
+
+ Hover over the matrix to record notes
+
+
+ )}
+
+
+
Recorded Sequence
+ {recordedNotes.length === 0 ? (
+
No notes recorded yet. Enable recording and start playing!
+ ) : (
+
+ {recordedNotes.map((note, idx) => (
+
+ {note.frequency.toFixed(2)} Hz
+ {note.label}
+ {new Date(note.timestamp).toLocaleTimeString()}
+
+ ))}
+
+ )}
+
+
+
+ )}
+
+
+
+ {/* FOOTER */}
+
+
+ );
+}
diff --git a/web-ui/src/data/globalScales.ts b/web-ui/src/data/globalScales.ts
new file mode 100644
index 0000000..16a8b18
--- /dev/null
+++ b/web-ui/src/data/globalScales.ts
@@ -0,0 +1,728 @@
+/**
+ * ============================================================================
+ * GLOBAL MUSICAL SCALES DATABASE
+ * The Complete Collection of Human Musical Traditions
+ * ============================================================================
+ *
+ * This comprehensive database represents the cumulative musical knowledge
+ * from every known cultural tradition throughout recorded history.
+ */
+
+export interface Scale {
+ name: string;
+ culture: string;
+ region: string;
+ era: string;
+ intervals: number[]; // In cents (1200 cents = 1 octave)
+ description: string;
+ emotionalCharacter?: string;
+ traditionalUse?: string;
+ ratios?: number[]; // Just intonation ratios
+}
+
+export interface TuningSystem {
+ name: string;
+ baseFrequency: number;
+ description: string;
+ culture: string;
+ calculateFrequency: (noteIndex: number, baseFreq: number) => number;
+}
+
+/**
+ * WESTERN EUROPEAN TRADITIONS
+ */
+export const WESTERN_SCALES: Scale[] = [
+ {
+ name: "Ionian (Major)",
+ culture: "Western",
+ region: "Europe/Americas",
+ era: "Ancient Greece - Present",
+ intervals: [0, 200, 400, 500, 700, 900, 1100, 1200],
+ ratios: [1, 9/8, 5/4, 4/3, 3/2, 5/3, 15/8, 2],
+ description: "The foundation of Western major tonality",
+ emotionalCharacter: "Bright, happy, triumphant",
+ traditionalUse: "Classical, pop, rock, jazz - universal Western music"
+ },
+ {
+ name: "Dorian",
+ culture: "Western",
+ region: "Europe",
+ era: "Ancient Greece - Present",
+ intervals: [0, 200, 300, 500, 700, 900, 1000, 1200],
+ ratios: [1, 9/8, 6/5, 4/3, 3/2, 5/3, 9/5, 2],
+ description: "Minor scale with raised 6th degree",
+ emotionalCharacter: "Serious yet hopeful, jazzy",
+ traditionalUse: "Medieval church music, jazz, folk music"
+ },
+ {
+ name: "Phrygian",
+ culture: "Western",
+ region: "Europe/Middle East",
+ era: "Ancient Greece - Present",
+ intervals: [0, 100, 300, 500, 700, 800, 1000, 1200],
+ ratios: [1, 16/15, 6/5, 4/3, 3/2, 8/5, 9/5, 2],
+ description: "Minor scale with lowered 2nd degree",
+ emotionalCharacter: "Dark, exotic, Spanish/Middle Eastern flavor",
+ traditionalUse: "Flamenco, metal, Spanish music"
+ },
+ {
+ name: "Lydian",
+ culture: "Western",
+ region: "Europe",
+ era: "Ancient Greece - Present",
+ intervals: [0, 200, 400, 600, 700, 900, 1100, 1200],
+ ratios: [1, 9/8, 5/4, 45/32, 3/2, 5/3, 15/8, 2],
+ description: "Major scale with raised 4th degree",
+ emotionalCharacter: "Dreamy, ethereal, floating",
+ traditionalUse: "Film scores, progressive rock, jazz"
+ },
+ {
+ name: "Mixolydian",
+ culture: "Western",
+ region: "Europe",
+ era: "Ancient Greece - Present",
+ intervals: [0, 200, 400, 500, 700, 900, 1000, 1200],
+ ratios: [1, 9/8, 5/4, 4/3, 3/2, 5/3, 9/5, 2],
+ description: "Major scale with lowered 7th degree",
+ emotionalCharacter: "Bluesy, folky, rock",
+ traditionalUse: "Rock, blues, folk, Irish traditional"
+ },
+ {
+ name: "Aeolian (Natural Minor)",
+ culture: "Western",
+ region: "Europe/Americas",
+ era: "Medieval - Present",
+ intervals: [0, 200, 300, 500, 700, 800, 1000, 1200],
+ ratios: [1, 9/8, 6/5, 4/3, 3/2, 8/5, 9/5, 2],
+ description: "The natural minor scale",
+ emotionalCharacter: "Melancholic, introspective, sad",
+ traditionalUse: "Classical, pop, rock - universal Western minor music"
+ },
+ {
+ name: "Locrian",
+ culture: "Western",
+ region: "Europe",
+ era: "Ancient Greece - Present",
+ intervals: [0, 100, 300, 500, 600, 800, 1000, 1200],
+ ratios: [1, 16/15, 6/5, 4/3, 64/45, 8/5, 9/5, 2],
+ description: "Diminished scale, rarely used as tonic",
+ emotionalCharacter: "Unstable, dark, dissonant",
+ traditionalUse: "Jazz, metal, experimental music"
+ },
+ {
+ name: "Harmonic Minor",
+ culture: "Western",
+ region: "Europe/Middle East",
+ era: "Baroque - Present",
+ intervals: [0, 200, 300, 500, 700, 800, 1100, 1200],
+ ratios: [1, 9/8, 6/5, 4/3, 3/2, 8/5, 15/8, 2],
+ description: "Natural minor with raised 7th",
+ emotionalCharacter: "Dramatic, exotic, tense",
+ traditionalUse: "Classical music, metal, klezmer"
+ },
+ {
+ name: "Melodic Minor (Ascending)",
+ culture: "Western",
+ region: "Europe",
+ era: "Baroque - Present",
+ intervals: [0, 200, 300, 500, 700, 900, 1100, 1200],
+ ratios: [1, 9/8, 6/5, 4/3, 3/2, 5/3, 15/8, 2],
+ description: "Natural minor with raised 6th and 7th",
+ emotionalCharacter: "Smooth, jazzy, ascending brightness",
+ traditionalUse: "Classical music, jazz improvisation"
+ },
+ {
+ name: "Blues Scale",
+ culture: "African American",
+ region: "United States",
+ era: "1900s - Present",
+ intervals: [0, 300, 500, 600, 700, 1000, 1200],
+ description: "Pentatonic minor with added flat 5th",
+ emotionalCharacter: "Soulful, expressive, vocal",
+ traditionalUse: "Blues, rock, jazz"
+ },
+ {
+ name: "Chromatic",
+ culture: "Western",
+ region: "Universal",
+ era: "Ancient - Present",
+ intervals: [0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200],
+ description: "All twelve semitones",
+ emotionalCharacter: "Atonal, modern, tense",
+ traditionalUse: "20th century classical, jazz, avant-garde"
+ },
+ {
+ name: "Whole Tone",
+ culture: "Western",
+ region: "Europe",
+ era: "Impressionist (1890s) - Present",
+ intervals: [0, 200, 400, 600, 800, 1000, 1200],
+ description: "Symmetrical scale of whole steps",
+ emotionalCharacter: "Dreamy, ambiguous, floating",
+ traditionalUse: "Impressionist music (Debussy), film scores"
+ },
+ {
+ name: "Diminished (Octatonic)",
+ culture: "Western",
+ region: "Europe",
+ era: "Late Romantic - Present",
+ intervals: [0, 200, 300, 500, 600, 800, 900, 1100, 1200],
+ description: "Alternating whole and half steps",
+ emotionalCharacter: "Tense, mysterious, symmetric",
+ traditionalUse: "Jazz, classical (Stravinsky), film music"
+ }
+];
+
+/**
+ * INDIAN CLASSICAL TRADITIONS
+ * 22 Shruti System - Most sophisticated pitch system in human history
+ */
+export const INDIAN_SCALES: Scale[] = [
+ {
+ name: "Bhairav (Raga)",
+ culture: "Hindustani",
+ region: "North India",
+ era: "Ancient - Present",
+ intervals: [0, 100, 400, 500, 700, 800, 1100, 1200],
+ description: "Morning raga, evokes devotion and peace",
+ emotionalCharacter: "Devotional, serene, morning atmosphere",
+ traditionalUse: "Classical Indian music, morning ragas",
+ ratios: [1, 16/15, 5/4, 4/3, 3/2, 8/5, 15/8, 2]
+ },
+ {
+ name: "Yaman (Raga)",
+ culture: "Hindustani",
+ region: "North India",
+ era: "Medieval - Present",
+ intervals: [0, 200, 400, 600, 700, 900, 1100, 1200],
+ description: "Evening raga, one of the most fundamental",
+ emotionalCharacter: "Peaceful, romantic, evening devotion",
+ traditionalUse: "Classical Indian music, evening performance",
+ ratios: [1, 9/8, 5/4, 45/32, 3/2, 5/3, 15/8, 2]
+ },
+ {
+ name: "Kafi (Raga/Thaat)",
+ culture: "Hindustani",
+ region: "North India",
+ era: "Ancient - Present",
+ intervals: [0, 200, 300, 500, 700, 900, 1000, 1200],
+ description: "Folk-inspired, similar to Dorian mode",
+ emotionalCharacter: "Earthy, folk-like, joyful yet grounded",
+ traditionalUse: "Light classical, bhajans, folk music",
+ ratios: [1, 9/8, 6/5, 4/3, 3/2, 5/3, 9/5, 2]
+ },
+ {
+ name: "Bhairavi (Raga)",
+ culture: "Hindustani/Carnatic",
+ region: "India",
+ era: "Ancient - Present",
+ intervals: [0, 100, 300, 500, 700, 800, 1000, 1200],
+ description: "Morning raga, all notes can be flat",
+ emotionalCharacter: "Sad, compassionate, devotional",
+ traditionalUse: "Concluding raga in concerts, devotional music",
+ ratios: [1, 16/15, 6/5, 4/3, 3/2, 8/5, 9/5, 2]
+ },
+ {
+ name: "Todi (Raga)",
+ culture: "Hindustani",
+ region: "North India",
+ era: "Ancient - Present",
+ intervals: [0, 100, 300, 600, 700, 800, 1100, 1200],
+ description: "Late morning raga, highly complex",
+ emotionalCharacter: "Longing, pathos, deep emotion",
+ traditionalUse: "Classical music, midday performance",
+ ratios: [1, 16/15, 6/5, 45/32, 3/2, 8/5, 15/8, 2]
+ },
+ {
+ name: "Malkauns (Raga)",
+ culture: "Hindustani",
+ region: "North India",
+ era: "Ancient - Present",
+ intervals: [0, 300, 500, 700, 1000, 1200],
+ description: "Midnight raga, pentatonic, no 2nd or 6th",
+ emotionalCharacter: "Mysterious, meditative, deep night",
+ traditionalUse: "Late night performance, meditation",
+ ratios: [1, 6/5, 4/3, 3/2, 9/5, 2]
+ },
+ {
+ name: "Kalyani (Raga - Carnatic)",
+ culture: "Carnatic",
+ region: "South India",
+ era: "Ancient - Present",
+ intervals: [0, 200, 400, 600, 700, 900, 1100, 1200],
+ description: "Auspicious raga, equivalent to Yaman",
+ emotionalCharacter: "Joyful, auspicious, celebratory",
+ traditionalUse: "South Indian classical, all times of day",
+ ratios: [1, 9/8, 5/4, 45/32, 3/2, 5/3, 15/8, 2]
+ }
+];
+
+/**
+ * ARABIC/MIDDLE EASTERN MAQAM SYSTEM
+ * Features quarter tones and unique microtonal intervals
+ */
+export const ARABIC_SCALES: Scale[] = [
+ {
+ name: "Maqam Rast",
+ culture: "Arabic",
+ region: "Middle East/North Africa",
+ era: "Medieval - Present",
+ intervals: [0, 200, 350, 500, 700, 900, 1050, 1200],
+ description: "Fundamental maqam, base of Arabic music theory",
+ emotionalCharacter: "Serious, noble, balanced",
+ traditionalUse: "Classical Arabic music, foundational maqam"
+ },
+ {
+ name: "Maqam Bayati",
+ culture: "Arabic",
+ region: "Middle East",
+ era: "Medieval - Present",
+ intervals: [0, 150, 300, 500, 700, 850, 1000, 1200],
+ description: "Most popular maqam, similar to Dorian with quarter tones",
+ emotionalCharacter: "Melancholic, introspective",
+ traditionalUse: "Popular music, classical Arabic music"
+ },
+ {
+ name: "Maqam Hijaz",
+ culture: "Arabic",
+ region: "Middle East",
+ era: "Medieval - Present",
+ intervals: [0, 50, 400, 500, 700, 850, 1000, 1200],
+ description: "Distinctive augmented 2nd interval",
+ emotionalCharacter: "Dramatic, emotional, intense",
+ traditionalUse: "Religious music, passionate songs"
+ },
+ {
+ name: "Maqam Saba",
+ culture: "Arabic",
+ region: "Middle East",
+ era: "Medieval - Present",
+ intervals: [0, 150, 300, 450, 700, 850, 1000, 1200],
+ description: "Complex quarter tone intervals",
+ emotionalCharacter: "Sad, lamenting, deeply emotional",
+ traditionalUse: "Emotional classical pieces"
+ },
+ {
+ name: "Maqam Nahawand",
+ culture: "Arabic",
+ region: "Middle East",
+ era: "Medieval - Present",
+ intervals: [0, 200, 300, 500, 700, 850, 1050, 1200],
+ description: "Similar to minor scale with quarter tones",
+ emotionalCharacter: "Melancholic, romantic",
+ traditionalUse: "Popular songs, classical music"
+ },
+ {
+ name: "Maqam Kurd",
+ culture: "Arabic/Kurdish",
+ region: "Middle East",
+ era: "Medieval - Present",
+ intervals: [0, 100, 300, 500, 700, 800, 1000, 1200],
+ description: "Kurdish influence, Phrygian-like",
+ emotionalCharacter: "Dark, mysterious, profound",
+ traditionalUse: "Classical and folk music"
+ },
+ {
+ name: "Maqam Sikah",
+ culture: "Arabic",
+ region: "Middle East",
+ era: "Medieval - Present",
+ intervals: [0, 150, 350, 500, 700, 850, 1050, 1200],
+ description: "Begins on a three-quarter tone",
+ emotionalCharacter: "Unique, sophisticated",
+ traditionalUse: "Advanced classical compositions"
+ }
+];
+
+/**
+ * EAST ASIAN SCALES
+ * Chinese, Japanese, Korean traditions
+ */
+export const EAST_ASIAN_SCALES: Scale[] = [
+ {
+ name: "Chinese Pentatonic (Gong mode)",
+ culture: "Chinese",
+ region: "China",
+ era: "Ancient - Present",
+ intervals: [0, 200, 400, 700, 900, 1200],
+ ratios: [1, 9/8, 81/64, 3/2, 27/16, 2],
+ description: "Traditional Chinese five-tone scale",
+ emotionalCharacter: "Balanced, harmonious, traditional",
+ traditionalUse: "Traditional Chinese music, meditation"
+ },
+ {
+ name: "Japanese Hirajoshi",
+ culture: "Japanese",
+ region: "Japan",
+ era: "Ancient - Present",
+ intervals: [0, 200, 300, 700, 800, 1200],
+ description: "Traditional Japanese pentatonic scale",
+ emotionalCharacter: "Meditative, peaceful, Japanese aesthetic",
+ traditionalUse: "Koto music, traditional Japanese instruments"
+ },
+ {
+ name: "Japanese Iwato",
+ culture: "Japanese",
+ region: "Japan",
+ era: "Ancient - Present",
+ intervals: [0, 100, 500, 600, 1000, 1200],
+ description: "Japanese pentatonic, dark and mysterious",
+ emotionalCharacter: "Dark, mysterious, contemplative",
+ traditionalUse: "Traditional Japanese music, shakuhachi"
+ },
+ {
+ name: "Japanese In-Sen",
+ culture: "Japanese",
+ region: "Japan",
+ era: "Ancient - Present",
+ intervals: [0, 100, 500, 700, 1000, 1200],
+ description: "Contemplative Japanese scale",
+ emotionalCharacter: "Meditative, introspective",
+ traditionalUse: "Zen Buddhist music, meditation"
+ },
+ {
+ name: "Japanese Yo Scale",
+ culture: "Japanese",
+ region: "Japan",
+ era: "Ancient - Present",
+ intervals: [0, 200, 500, 700, 900, 1200],
+ description: "Bright Japanese pentatonic",
+ emotionalCharacter: "Bright, cheerful",
+ traditionalUse: "Folk music, children's songs"
+ },
+ {
+ name: "Ryukyu Scale (Okinawan)",
+ culture: "Ryukyuan",
+ region: "Okinawa, Japan",
+ era: "Ancient - Present",
+ intervals: [0, 400, 500, 700, 1100, 1200],
+ description: "Unique to Okinawan music",
+ emotionalCharacter: "Distinctive, regional",
+ traditionalUse: "Okinawan folk music, sanshin"
+ },
+ {
+ name: "Korean Pyeongjo Scale",
+ culture: "Korean",
+ region: "Korea",
+ era: "Ancient - Present",
+ intervals: [0, 200, 350, 700, 900, 1050, 1200],
+ description: "Korean traditional scale with neutral intervals",
+ emotionalCharacter: "Calm, stable, balanced",
+ traditionalUse: "Korean classical music (gugak)"
+ },
+ {
+ name: "Korean Gyemyeonjo Scale",
+ culture: "Korean",
+ region: "Korea",
+ era: "Ancient - Present",
+ intervals: [0, 150, 500, 700, 850, 1200],
+ description: "Sad Korean scale",
+ emotionalCharacter: "Sorrowful, lamenting",
+ traditionalUse: "Korean classical music, emotional pieces"
+ }
+];
+
+/**
+ * INDONESIAN GAMELAN
+ * Non-octave scales, unique tuning systems
+ */
+export const INDONESIAN_SCALES: Scale[] = [
+ {
+ name: "Slendro (5-tone)",
+ culture: "Javanese/Balinese",
+ region: "Indonesia",
+ era: "Ancient - Present",
+ intervals: [0, 240, 480, 720, 960, 1200],
+ description: "Pentatonic gamelan scale, approximately equal intervals",
+ emotionalCharacter: "Mystical, shimmering, gamelan",
+ traditionalUse: "Gamelan orchestras, traditional ceremonies"
+ },
+ {
+ name: "Pelog (7-tone)",
+ culture: "Javanese/Balinese",
+ region: "Indonesia",
+ era: "Ancient - Present",
+ intervals: [0, 100, 300, 700, 800, 1000, 1200],
+ description: "Heptatonic gamelan scale with irregular intervals",
+ emotionalCharacter: "Complex, mysterious, rich",
+ traditionalUse: "Gamelan orchestras, wayang performances"
+ }
+];
+
+/**
+ * AFRICAN SCALES
+ * Diverse regional traditions
+ */
+export const AFRICAN_SCALES: Scale[] = [
+ {
+ name: "African Pentatonic",
+ culture: "Pan-African",
+ region: "Sub-Saharan Africa",
+ era: "Ancient - Present",
+ intervals: [0, 200, 400, 700, 900, 1200],
+ description: "Common pentatonic scale in African music",
+ emotionalCharacter: "Earthy, rhythmic, communal",
+ traditionalUse: "Traditional African music, mbira, kora"
+ },
+ {
+ name: "Pygmy Hexatonic",
+ culture: "Pygmy",
+ region: "Central Africa",
+ era: "Ancient - Present",
+ intervals: [0, 267, 533, 700, 967, 1200],
+ description: "Unique equidistant hexatonic scale",
+ emotionalCharacter: "Unique, polyrhythmic",
+ traditionalUse: "Pygmy vocal music, polyphonic singing"
+ }
+];
+
+/**
+ * PERSIAN/IRANIAN DASTGAH SYSTEM
+ */
+export const PERSIAN_SCALES: Scale[] = [
+ {
+ name: "Dastgah Shur",
+ culture: "Persian",
+ region: "Iran",
+ era: "Ancient - Present",
+ intervals: [0, 150, 350, 500, 700, 850, 1050, 1200],
+ description: "Fundamental Persian mode",
+ emotionalCharacter: "Passionate, expressive",
+ traditionalUse: "Persian classical music"
+ },
+ {
+ name: "Dastgah Mahur",
+ culture: "Persian",
+ region: "Iran",
+ era: "Ancient - Present",
+ intervals: [0, 200, 400, 500, 700, 900, 1100, 1200],
+ description: "Similar to Western major",
+ emotionalCharacter: "Majestic, royal",
+ traditionalUse: "Persian classical music"
+ },
+ {
+ name: "Dastgah Segah",
+ culture: "Persian",
+ region: "Iran",
+ era: "Ancient - Present",
+ intervals: [0, 150, 350, 550, 700, 850, 1050, 1200],
+ description: "Begins on neutral third",
+ emotionalCharacter: "Complex, sophisticated",
+ traditionalUse: "Advanced Persian classical music"
+ }
+];
+
+/**
+ * GREEK/BYZANTINE TRADITIONS
+ */
+export const BYZANTINE_SCALES: Scale[] = [
+ {
+ name: "Byzantine Liturgical Mode 1",
+ culture: "Byzantine",
+ region: "Greece/Eastern Mediterranean",
+ era: "Medieval - Present",
+ intervals: [0, 200, 300, 500, 700, 900, 1000, 1200],
+ description: "Primary mode of Byzantine chant",
+ emotionalCharacter: "Sacred, devotional",
+ traditionalUse: "Orthodox church music"
+ },
+ {
+ name: "Nikriz (Byzantine/Turkish)",
+ culture: "Byzantine/Ottoman",
+ region: "Greece/Turkey",
+ era: "Medieval - Present",
+ intervals: [0, 200, 300, 600, 700, 900, 1000, 1200],
+ description: "Augmented 2nd interval",
+ emotionalCharacter: "Exotic, Eastern",
+ traditionalUse: "Sacred and secular music"
+ },
+ {
+ name: "Double Harmonic Major (Byzantine)",
+ culture: "Byzantine/Arabic",
+ region: "Eastern Mediterranean",
+ era: "Medieval - Present",
+ intervals: [0, 100, 400, 500, 700, 800, 1100, 1200],
+ description: "Two augmented 2nd intervals",
+ emotionalCharacter: "Exotic, dramatic, Middle Eastern",
+ traditionalUse: "Byzantine and Arabic influenced music"
+ }
+];
+
+/**
+ * JEWISH LITURGICAL SCALES
+ */
+export const JEWISH_SCALES: Scale[] = [
+ {
+ name: "Freygish (Phrygian Dominant)",
+ culture: "Ashkenazi Jewish",
+ region: "Eastern Europe",
+ era: "Medieval - Present",
+ intervals: [0, 100, 400, 500, 700, 800, 1000, 1200],
+ description: "Characteristic of klezmer music",
+ emotionalCharacter: "Joyful yet melancholic, celebratory",
+ traditionalUse: "Klezmer, Jewish liturgical music"
+ },
+ {
+ name: "Mi Sheberach Mode",
+ culture: "Ashkenazi Jewish",
+ region: "Eastern Europe",
+ era: "Medieval - Present",
+ intervals: [0, 200, 300, 500, 700, 800, 1000, 1200],
+ description: "Used in synagogue prayer",
+ emotionalCharacter: "Prayerful, devotional",
+ traditionalUse: "Jewish liturgical music"
+ }
+];
+
+/**
+ * EXPERIMENTAL & MICROTONAL SCALES
+ */
+export const EXPERIMENTAL_SCALES: Scale[] = [
+ {
+ name: "19-TET Chromatic",
+ culture: "Modern/Experimental",
+ region: "Global",
+ era: "20th Century - Present",
+ intervals: [0, 63, 126, 189, 253, 316, 379, 442, 505, 568, 632, 695, 758, 821, 884, 947, 1011, 1074, 1137, 1200],
+ description: "19 equal divisions of the octave",
+ emotionalCharacter: "Alien, futuristic, microtonal",
+ traditionalUse: "Experimental music, microtonal composition"
+ },
+ {
+ name: "24-TET Chromatic (Quarter Tone)",
+ culture: "Modern/Experimental",
+ region: "Global",
+ era: "20th Century - Present",
+ intervals: [0, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000, 1050, 1100, 1150, 1200],
+ description: "24 equal divisions (quarter tones)",
+ emotionalCharacter: "Microtonal, experimental",
+ traditionalUse: "Contemporary classical, Middle Eastern fusion"
+ },
+ {
+ name: "Bohlen-Pierce",
+ culture: "Modern/Experimental",
+ region: "Global",
+ era: "1970s - Present",
+ intervals: [0, 146, 293, 439, 585, 732, 878, 1024, 1170, 1317, 1463, 1609, 1755, 1902],
+ description: "Non-octave scale based on 3:1 ratio (tritave)",
+ emotionalCharacter: "Utterly alien, non-octave",
+ traditionalUse: "Experimental electronic music"
+ },
+ {
+ name: "Carlos Alpha",
+ culture: "Modern/Experimental",
+ region: "USA",
+ era: "1980s - Present",
+ intervals: [0, 78, 156, 234, 312, 390, 468, 546, 624, 702, 780, 858, 936, 1014, 1092, 1170],
+ description: "Wendy Carlos non-octave scale, 15 steps per 'octave'",
+ emotionalCharacter: "Futuristic, electronic",
+ traditionalUse: "Electronic music, film scores (Tron)"
+ },
+ {
+ name: "Spectral Scale (Harmonic Series)",
+ culture: "Modern/Spectral",
+ region: "Europe",
+ era: "1970s - Present",
+ intervals: [0, 1200, 1902, 2400, 2786, 3102, 3369, 3600],
+ description: "Based on natural harmonic series",
+ emotionalCharacter: "Natural, resonant, pure",
+ traditionalUse: "Spectral music (Grisey, Murail)"
+ }
+];
+
+/**
+ * FLAMENCO & SPANISH TRADITIONS
+ */
+export const FLAMENCO_SCALES: Scale[] = [
+ {
+ name: "Phrygian Dominant (Spanish)",
+ culture: "Spanish/Flamenco",
+ region: "Spain",
+ era: "Medieval - Present",
+ intervals: [0, 100, 400, 500, 700, 800, 1000, 1200],
+ description: "Defining scale of flamenco",
+ emotionalCharacter: "Passionate, fiery, Spanish",
+ traditionalUse: "Flamenco guitar, Spanish classical"
+ },
+ {
+ name: "Andalusian Cadence Scale",
+ culture: "Spanish/Moorish",
+ region: "Andalusia, Spain",
+ era: "Medieval - Present",
+ intervals: [0, 100, 300, 500, 700, 800, 1000, 1200],
+ description: "Moorish influence in Spanish music",
+ emotionalCharacter: "Exotic, Spanish-Arabic",
+ traditionalUse: "Flamenco, Spanish classical guitar"
+ }
+];
+
+/**
+ * CELTIC & SCOTTISH TRADITIONS
+ */
+export const CELTIC_SCALES: Scale[] = [
+ {
+ name: "Scottish Pentatonic",
+ culture: "Scottish/Celtic",
+ region: "Scotland/Ireland",
+ era: "Ancient - Present",
+ intervals: [0, 200, 500, 700, 1000, 1200],
+ description: "Traditional Scottish bagpipe scale",
+ emotionalCharacter: "Heroic, Celtic, pastoral",
+ traditionalUse: "Bagpipe music, Celtic folk"
+ },
+ {
+ name: "Irish Mixolydian",
+ culture: "Irish",
+ region: "Ireland",
+ era: "Ancient - Present",
+ intervals: [0, 200, 400, 500, 700, 900, 1000, 1200],
+ description: "Common in Irish traditional music",
+ emotionalCharacter: "Lively, folky, Irish",
+ traditionalUse: "Irish traditional music, fiddle, tin whistle"
+ },
+ {
+ name: "Irish Dorian",
+ culture: "Irish",
+ region: "Ireland",
+ era: "Ancient - Present",
+ intervals: [0, 200, 300, 500, 700, 900, 1000, 1200],
+ description: "Common in Irish folk music",
+ emotionalCharacter: "Mysterious, ancient, Celtic",
+ traditionalUse: "Irish ballads, traditional music"
+ }
+];
+
+/**
+ * COMPREHENSIVE SCALE COLLECTION
+ */
+export const ALL_SCALES = [
+ ...WESTERN_SCALES,
+ ...INDIAN_SCALES,
+ ...ARABIC_SCALES,
+ ...EAST_ASIAN_SCALES,
+ ...INDONESIAN_SCALES,
+ ...AFRICAN_SCALES,
+ ...PERSIAN_SCALES,
+ ...BYZANTINE_SCALES,
+ ...JEWISH_SCALES,
+ ...EXPERIMENTAL_SCALES,
+ ...FLAMENCO_SCALES,
+ ...CELTIC_SCALES
+];
+
+export const SCALE_CATEGORIES = {
+ "Western European": WESTERN_SCALES,
+ "Indian Classical": INDIAN_SCALES,
+ "Arabic/Maqam": ARABIC_SCALES,
+ "East Asian": EAST_ASIAN_SCALES,
+ "Indonesian Gamelan": INDONESIAN_SCALES,
+ "African": AFRICAN_SCALES,
+ "Persian/Iranian": PERSIAN_SCALES,
+ "Greek/Byzantine": BYZANTINE_SCALES,
+ "Jewish Liturgical": JEWISH_SCALES,
+ "Experimental/Microtonal": EXPERIMENTAL_SCALES,
+ "Flamenco/Spanish": FLAMENCO_SCALES,
+ "Celtic/Irish": CELTIC_SCALES
+};
+
+console.log(`✨ Loaded ${ALL_SCALES.length} musical scales from ${Object.keys(SCALE_CATEGORIES).length} cultural traditions`);
diff --git a/web-ui/src/data/rhythmPatterns.ts b/web-ui/src/data/rhythmPatterns.ts
new file mode 100644
index 0000000..77645cc
--- /dev/null
+++ b/web-ui/src/data/rhythmPatterns.ts
@@ -0,0 +1,547 @@
+/**
+ * ============================================================================
+ * GLOBAL RHYTHM PATTERNS LIBRARY
+ * Traditional Rhythmic Cycles from World Cultures
+ * ============================================================================
+ *
+ * This library contains traditional rhythm patterns and time cycles
+ * from musical traditions across human history.
+ */
+
+export interface RhythmPattern {
+ name: string;
+ culture: string;
+ region: string;
+ pattern: number[]; // 1 = hit, 0 = rest, 0.5 = ghost note, 2 = accent
+ subdivisions: number; // Total beats/subdivisions
+ description: string;
+ traditionalUse: string;
+ tempo?: { min: number; max: number }; // BPM range
+ cycleLength?: number; // For long cyclic patterns
+}
+
+/**
+ * INDIAN CLASSICAL RHYTHM (TALA)
+ * Complex rhythmic cycles that can span many beats
+ */
+export const INDIAN_TALAS: RhythmPattern[] = [
+ {
+ name: "Teental (16 beats)",
+ culture: "Hindustani",
+ region: "North India",
+ subdivisions: 16,
+ pattern: [2, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0],
+ description: "Most common tala in Hindustani music, 16 beat cycle",
+ traditionalUse: "Classical instrumental and vocal music",
+ tempo: { min: 60, max: 240 },
+ cycleLength: 16
+ },
+ {
+ name: "Jhaptal (10 beats)",
+ culture: "Hindustani",
+ region: "North India",
+ subdivisions: 10,
+ pattern: [2, 1, 0, 1, 1, 0, 1, 1, 0, 0],
+ description: "10-beat asymmetrical tala: 2+3+2+3",
+ traditionalUse: "Classical music, semi-classical forms",
+ tempo: { min: 80, max: 200 },
+ cycleLength: 10
+ },
+ {
+ name: "Rupak (7 beats)",
+ culture: "Hindustani",
+ region: "North India",
+ subdivisions: 7,
+ pattern: [0, 0, 2, 1, 1, 1, 1],
+ description: "7-beat tala, unusual 3+2+2 structure",
+ traditionalUse: "Light classical, thumri, bhajans",
+ tempo: { min: 60, max: 180 },
+ cycleLength: 7
+ },
+ {
+ name: "Adi Tala (8 beats)",
+ culture: "Carnatic",
+ region: "South India",
+ subdivisions: 8,
+ pattern: [2, 1, 0, 0, 1, 1, 0, 0],
+ description: "Most common Carnatic tala, 8 beat cycle",
+ traditionalUse: "South Indian classical music",
+ tempo: { min: 40, max: 300 },
+ cycleLength: 8
+ },
+ {
+ name: "Misra Chapu (7 beats)",
+ culture: "Carnatic",
+ region: "South India",
+ subdivisions: 7,
+ pattern: [2, 1, 0, 1, 1, 0, 0],
+ description: "Asymmetrical 7-beat Carnatic pattern: 3+2+2",
+ traditionalUse: "Fast-paced compositions",
+ tempo: { min: 100, max: 300 },
+ cycleLength: 7
+ },
+ {
+ name: "Khanda Chapu (5 beats)",
+ culture: "Carnatic",
+ region: "South India",
+ subdivisions: 5,
+ pattern: [2, 1, 1, 0, 0],
+ description: "5-beat Carnatic pattern: 2+3",
+ traditionalUse: "Energetic compositions",
+ tempo: { min: 100, max: 300 },
+ cycleLength: 5
+ }
+];
+
+/**
+ * AFRICAN RHYTHMS
+ * Polyrhythmic patterns, timeline patterns
+ */
+export const AFRICAN_RHYTHMS: RhythmPattern[] = [
+ {
+ name: "Clave (Son) 3-2",
+ culture: "Afro-Cuban",
+ region: "Cuba/West Africa",
+ subdivisions: 16,
+ pattern: [1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0],
+ description: "Foundational Afro-Cuban rhythm pattern",
+ traditionalUse: "Salsa, rumba, son cubano",
+ tempo: { min: 80, max: 180 },
+ cycleLength: 16
+ },
+ {
+ name: "Clave (Son) 2-3",
+ culture: "Afro-Cuban",
+ region: "Cuba/West Africa",
+ subdivisions: 16,
+ pattern: [1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0],
+ description: "Reverse of 3-2 clave",
+ traditionalUse: "Salsa, Afro-Cuban music",
+ tempo: { min: 80, max: 180 },
+ cycleLength: 16
+ },
+ {
+ name: "Rumba Clave 3-2",
+ culture: "Afro-Cuban",
+ region: "Cuba",
+ subdivisions: 16,
+ pattern: [1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0],
+ description: "Rumba variation of clave pattern",
+ traditionalUse: "Rumba, Afro-Cuban percussion",
+ tempo: { min: 60, max: 140 },
+ cycleLength: 16
+ },
+ {
+ name: "Kpanlogo",
+ culture: "Ghanaian",
+ region: "Ghana",
+ subdivisions: 12,
+ pattern: [2, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 0],
+ description: "Popular Ghanaian rhythm",
+ traditionalUse: "Traditional Ghanaian music, recreational dance",
+ tempo: { min: 100, max: 160 },
+ cycleLength: 12
+ },
+ {
+ name: "Samba",
+ culture: "Afro-Brazilian",
+ region: "Brazil",
+ subdivisions: 16,
+ pattern: [1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0],
+ description: "Basic samba rhythm pattern",
+ traditionalUse: "Brazilian samba, carnival",
+ tempo: { min: 120, max: 180 },
+ cycleLength: 16
+ },
+ {
+ name: "Bossa Nova",
+ culture: "Brazilian",
+ region: "Brazil",
+ subdivisions: 16,
+ pattern: [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0],
+ description: "Characteristic bossa nova clave pattern",
+ traditionalUse: "Bossa nova, Brazilian jazz",
+ tempo: { min: 100, max: 140 },
+ cycleLength: 16
+ },
+ {
+ name: "Djembe Pattern (West African)",
+ culture: "West African",
+ region: "West Africa",
+ subdivisions: 12,
+ pattern: [2, 0, 1, 1, 0, 1, 2, 0, 1, 1, 0, 1],
+ description: "Traditional djembe rhythm pattern",
+ traditionalUse: "West African drumming circles",
+ tempo: { min: 90, max: 150 },
+ cycleLength: 12
+ },
+ {
+ name: "Bembe",
+ culture: "Yoruba/Afro-Cuban",
+ region: "West Africa/Cuba",
+ subdivisions: 12,
+ pattern: [1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0],
+ description: "Sacred Yoruba/Afro-Cuban rhythm",
+ traditionalUse: "Religious ceremonies, sacred music",
+ tempo: { min: 100, max: 140 },
+ cycleLength: 12
+ }
+];
+
+/**
+ * MIDDLE EASTERN RHYTHMS (IQA'AT)
+ */
+export const MIDDLE_EASTERN_RHYTHMS: RhythmPattern[] = [
+ {
+ name: "Maqsum",
+ culture: "Arabic",
+ region: "Middle East/North Africa",
+ subdivisions: 8,
+ pattern: [2, 0, 1, 0, 2, 0, 0, 1],
+ description: "Most common Arabic rhythm, 4/4 feel",
+ traditionalUse: "Arabic pop, traditional music",
+ tempo: { min: 80, max: 160 },
+ cycleLength: 8
+ },
+ {
+ name: "Saidi",
+ culture: "Egyptian",
+ region: "Egypt",
+ subdivisions: 8,
+ pattern: [2, 0, 1, 0, 2, 1, 0, 1],
+ description: "Upper Egyptian folk rhythm",
+ traditionalUse: "Saidi folk music, belly dance",
+ tempo: { min: 100, max: 180 },
+ cycleLength: 8
+ },
+ {
+ name: "Baladi",
+ culture: "Egyptian",
+ region: "Egypt",
+ subdivisions: 8,
+ pattern: [2, 0, 1, 0, 2, 0, 1, 1],
+ description: "Egyptian urban folk rhythm",
+ traditionalUse: "Baladi music, belly dance",
+ tempo: { min: 80, max: 140 },
+ cycleLength: 8
+ },
+ {
+ name: "Masmoudi Kebir",
+ culture: "Arabic",
+ region: "North Africa",
+ subdivisions: 16,
+ pattern: [2, 0, 0, 0, 1, 0, 2, 0, 0, 1, 0, 2, 0, 0, 1, 0],
+ description: "Large masmoudi rhythm, 8/4",
+ traditionalUse: "Andalusian classical music, muwashshah",
+ tempo: { min: 60, max: 120 },
+ cycleLength: 16
+ },
+ {
+ name: "Sama'i Thaqil",
+ culture: "Arabic",
+ region: "Middle East",
+ subdivisions: 10,
+ pattern: [2, 0, 0, 1, 0, 2, 0, 1, 0, 0],
+ description: "Heavy sama'i rhythm, 10/8",
+ traditionalUse: "Classical Arabic instrumental forms",
+ tempo: { min: 60, max: 120 },
+ cycleLength: 10
+ },
+ {
+ name: "Ciftetelli",
+ culture: "Turkish",
+ region: "Turkey/Greece",
+ subdivisions: 8,
+ pattern: [2, 0, 1, 1, 2, 0, 1, 0],
+ description: "Popular Turkish/Greek rhythm",
+ traditionalUse: "Belly dance, Greek/Turkish pop",
+ tempo: { min: 80, max: 160 },
+ cycleLength: 8
+ },
+ {
+ name: "Karsilama (9/8)",
+ culture: "Turkish",
+ region: "Turkey/Balkans",
+ subdivisions: 9,
+ pattern: [2, 0, 1, 0, 2, 0, 1, 0, 1],
+ description: "Asymmetrical 9/8 rhythm: 2+2+2+3",
+ traditionalUse: "Turkish folk dance",
+ tempo: { min: 100, max: 180 },
+ cycleLength: 9
+ },
+ {
+ name: "Aksak (9/8 variant)",
+ culture: "Turkish/Balkan",
+ region: "Turkey/Balkans",
+ subdivisions: 9,
+ pattern: [2, 0, 1, 0, 1, 2, 0, 1, 0],
+ description: "Limping rhythm, 2+2+2+3",
+ traditionalUse: "Balkan and Turkish folk music",
+ tempo: { min: 120, max: 200 },
+ cycleLength: 9
+ }
+];
+
+/**
+ * LATIN AMERICAN RHYTHMS
+ */
+export const LATIN_RHYTHMS: RhythmPattern[] = [
+ {
+ name: "Tresillo",
+ culture: "Latin American",
+ region: "Caribbean/Latin America",
+ subdivisions: 8,
+ pattern: [1, 0, 0, 1, 0, 0, 1, 0],
+ description: "Foundational Latin rhythm, 3+3+2 pattern",
+ traditionalUse: "Habanera, tango, Latin jazz",
+ tempo: { min: 80, max: 160 },
+ cycleLength: 8
+ },
+ {
+ name: "Cascara",
+ culture: "Afro-Cuban",
+ region: "Cuba",
+ subdivisions: 16,
+ pattern: [1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0],
+ description: "Timbale pattern in salsa",
+ traditionalUse: "Salsa, timba",
+ tempo: { min: 140, max: 200 },
+ cycleLength: 16
+ },
+ {
+ name: "Mambo Bell Pattern",
+ culture: "Afro-Cuban",
+ region: "Cuba",
+ subdivisions: 16,
+ pattern: [1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0],
+ description: "Cowbell pattern in mambo/salsa",
+ traditionalUse: "Mambo, salsa",
+ tempo: { min: 140, max: 200 },
+ cycleLength: 16
+ },
+ {
+ name: "Tango Rhythm",
+ culture: "Argentine",
+ region: "Argentina",
+ subdivisions: 8,
+ pattern: [2, 0, 0, 1, 0, 1, 1, 0],
+ description: "Basic tango rhythm pattern",
+ traditionalUse: "Argentine tango",
+ tempo: { min: 60, max: 120 },
+ cycleLength: 8
+ },
+ {
+ name: "Baião",
+ culture: "Brazilian",
+ region: "Northeast Brazil",
+ subdivisions: 16,
+ pattern: [1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0],
+ description: "Northeastern Brazilian rhythm",
+ traditionalUse: "Forró, baião music",
+ tempo: { min: 100, max: 140 },
+ cycleLength: 16
+ }
+];
+
+/**
+ * FLAMENCO RHYTHMS (COMPÁS)
+ */
+export const FLAMENCO_RHYTHMS: RhythmPattern[] = [
+ {
+ name: "Bulería (12-beat)",
+ culture: "Spanish Flamenco",
+ region: "Andalusia, Spain",
+ subdivisions: 12,
+ pattern: [2, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1],
+ description: "Fast flamenco form, emphasis on 12, 3, 6, 8, 10",
+ traditionalUse: "Flamenco dance and guitar",
+ tempo: { min: 180, max: 300 },
+ cycleLength: 12
+ },
+ {
+ name: "Soleá (12-beat)",
+ culture: "Spanish Flamenco",
+ region: "Andalusia, Spain",
+ subdivisions: 12,
+ pattern: [2, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0],
+ description: "Slow, serious flamenco form",
+ traditionalUse: "Flamenco song and dance",
+ tempo: { min: 60, max: 120 },
+ cycleLength: 12
+ },
+ {
+ name: "Tangos (flamenco, 4-beat)",
+ culture: "Spanish Flamenco",
+ region: "Andalusia, Spain",
+ subdivisions: 8,
+ pattern: [2, 0, 1, 0, 2, 0, 1, 1],
+ description: "Flamenco tangos (different from Argentine)",
+ traditionalUse: "Flamenco guitar and dance",
+ tempo: { min: 120, max: 180 },
+ cycleLength: 8
+ }
+];
+
+/**
+ * WESTERN CLASSICAL & MODERN PATTERNS
+ */
+export const WESTERN_PATTERNS: RhythmPattern[] = [
+ {
+ name: "Standard Rock Beat",
+ culture: "Western Popular",
+ region: "USA/Europe",
+ subdivisions: 16,
+ pattern: [2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0],
+ description: "Basic rock drum beat",
+ traditionalUse: "Rock, pop music",
+ tempo: { min: 80, max: 160 },
+ cycleLength: 16
+ },
+ {
+ name: "Shuffle/Swing",
+ culture: "Western Jazz/Blues",
+ region: "USA",
+ subdivisions: 12,
+ pattern: [2, 0, 1, 1, 0, 1, 2, 0, 1, 1, 0, 1],
+ description: "Swing feel, triplet-based",
+ traditionalUse: "Jazz, blues, swing",
+ tempo: { min: 80, max: 200 },
+ cycleLength: 12
+ },
+ {
+ name: "Funk Groove",
+ culture: "Afro-American",
+ region: "USA",
+ subdivisions: 16,
+ pattern: [2, 0, 1, 1, 1, 0, 1, 0, 2, 1, 0, 1, 1, 0, 1, 0],
+ description: "Syncopated funk rhythm",
+ traditionalUse: "Funk, R&B, hip-hop",
+ tempo: { min: 90, max: 120 },
+ cycleLength: 16
+ },
+ {
+ name: "Disco/Four-on-Floor",
+ culture: "Western Popular",
+ region: "USA/Europe",
+ subdivisions: 16,
+ pattern: [2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0],
+ description: "Steady quarter note kick drum",
+ traditionalUse: "Disco, house, EDM",
+ tempo: { min: 110, max: 130 },
+ cycleLength: 16
+ },
+ {
+ name: "Reggae One Drop",
+ culture: "Jamaican",
+ region: "Jamaica",
+ subdivisions: 16,
+ pattern: [0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0],
+ description: "Emphasis on beat 3, reggae rhythm",
+ traditionalUse: "Reggae music",
+ tempo: { min: 60, max: 90 },
+ cycleLength: 16
+ },
+ {
+ name: "Breakbeat",
+ culture: "Western Popular",
+ region: "USA/UK",
+ subdivisions: 16,
+ pattern: [2, 0, 0, 1, 1, 0, 1, 0, 2, 1, 0, 0, 1, 0, 1, 0],
+ description: "Syncopated breakbeat pattern",
+ traditionalUse: "Hip-hop, drum and bass, jungle",
+ tempo: { min: 80, max: 180 },
+ cycleLength: 16
+ }
+];
+
+/**
+ * ASIAN RHYTHMIC PATTERNS
+ */
+export const ASIAN_RHYTHMS: RhythmPattern[] = [
+ {
+ name: "Tabla Kayda",
+ culture: "Hindustani",
+ region: "North India",
+ subdivisions: 16,
+ pattern: [2, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1],
+ description: "Traditional tabla composition pattern",
+ traditionalUse: "Tabla solo, classical accompaniment",
+ tempo: { min: 40, max: 200 },
+ cycleLength: 16
+ },
+ {
+ name: "Korean Jangdan (Jajinmori)",
+ culture: "Korean",
+ region: "Korea",
+ subdivisions: 12,
+ pattern: [2, 0, 1, 1, 0, 1, 2, 0, 1, 1, 0, 1],
+ description: "Fast Korean rhythmic pattern",
+ traditionalUse: "Korean traditional music (gugak)",
+ tempo: { min: 120, max: 200 },
+ cycleLength: 12
+ },
+ {
+ name: "Japanese Matsuri Taiko",
+ culture: "Japanese",
+ region: "Japan",
+ subdivisions: 8,
+ pattern: [2, 0, 1, 1, 2, 0, 1, 0],
+ description: "Festival taiko drum pattern",
+ traditionalUse: "Japanese festivals, taiko ensembles",
+ tempo: { min: 100, max: 160 },
+ cycleLength: 8
+ }
+];
+
+/**
+ * COMPREHENSIVE RHYTHM COLLECTION
+ */
+export const ALL_RHYTHMS = [
+ ...INDIAN_TALAS,
+ ...AFRICAN_RHYTHMS,
+ ...MIDDLE_EASTERN_RHYTHMS,
+ ...LATIN_RHYTHMS,
+ ...FLAMENCO_RHYTHMS,
+ ...WESTERN_PATTERNS,
+ ...ASIAN_RHYTHMS
+];
+
+export const RHYTHM_CATEGORIES = {
+ "Indian Talas": INDIAN_TALAS,
+ "African Rhythms": AFRICAN_RHYTHMS,
+ "Middle Eastern (Iqa'at)": MIDDLE_EASTERN_RHYTHMS,
+ "Latin American": LATIN_RHYTHMS,
+ "Flamenco": FLAMENCO_RHYTHMS,
+ "Western/Modern": WESTERN_PATTERNS,
+ "Asian Traditions": ASIAN_RHYTHMS
+};
+
+console.log(`✨ Loaded ${ALL_RHYTHMS.length} rhythm patterns from ${Object.keys(RHYTHM_CATEGORIES).length} cultural traditions`);
+
+/**
+ * UTILITY FUNCTIONS
+ */
+
+// Convert rhythm pattern to time events
+export function patternToTimeEvents(pattern: RhythmPattern, bpm: number = 120): { time: number; velocity: number }[] {
+ const beatDuration = 60 / bpm; // Duration of one beat in seconds
+ const stepDuration = beatDuration / (pattern.subdivisions / 4); // Duration per subdivision
+
+ const events: { time: number; velocity: number }[] = [];
+
+ pattern.pattern.forEach((hit, index) => {
+ if (hit > 0) {
+ events.push({
+ time: index * stepDuration,
+ velocity: hit >= 2 ? 1.0 : hit * 0.7 // Accent vs normal note
+ });
+ }
+ });
+
+ return events;
+}
+
+// Get complementary pattern (inverse)
+export function getComplementaryPattern(pattern: number[]): number[] {
+ return pattern.map(hit => hit > 0 ? 0 : 1);
+}
diff --git a/web-ui/src/engines/synthEngine.ts b/web-ui/src/engines/synthEngine.ts
new file mode 100644
index 0000000..5b77d4f
--- /dev/null
+++ b/web-ui/src/engines/synthEngine.ts
@@ -0,0 +1,552 @@
+/**
+ * ============================================================================
+ * ADVANCED SYNTHESIS ENGINE
+ * Cultural Instrument Models & Sound Design
+ * ============================================================================
+ *
+ * This engine provides sophisticated synthesis capabilities inspired by
+ * traditional instruments from global musical cultures.
+ */
+
+export interface InstrumentVoice {
+ id: string;
+ name: string;
+ culture: string;
+ description: string;
+ waveformType: OscillatorType | 'custom';
+ harmonicProfile?: number[]; // Harmonic amplitudes
+ envelope: {
+ attack: number;
+ decay: number;
+ sustain: number;
+ release: number;
+ };
+ vibrato?: {
+ rate: number;
+ depth: number;
+ };
+ tremolo?: {
+ rate: number;
+ depth: number;
+ };
+ filter?: {
+ type: BiquadFilterType;
+ frequency: number;
+ q: number;
+ };
+}
+
+/**
+ * WESTERN INSTRUMENTS
+ */
+export const WESTERN_INSTRUMENTS: InstrumentVoice[] = [
+ {
+ id: 'piano',
+ name: 'Piano',
+ culture: 'Western',
+ description: 'Rich harmonic spectrum with quick attack',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.6, 0.4, 0.5, 0.3, 0.2, 0.15, 0.1],
+ envelope: { attack: 0.002, decay: 0.3, sustain: 0.7, release: 0.5 }
+ },
+ {
+ id: 'organ',
+ name: 'Organ',
+ culture: 'Western',
+ description: 'Sustained harmonic tone, church organ',
+ waveformType: 'sine',
+ harmonicProfile: [1, 0, 0.8, 0, 0.6, 0, 0.4, 0.3],
+ envelope: { attack: 0.01, decay: 0.1, sustain: 0.9, release: 0.3 }
+ },
+ {
+ id: 'violin',
+ name: 'Violin',
+ culture: 'Western',
+ description: 'Expressive bowed string',
+ waveformType: 'sawtooth',
+ envelope: { attack: 0.05, decay: 0.1, sustain: 0.8, release: 0.3 },
+ vibrato: { rate: 5.5, depth: 0.015 },
+ filter: { type: 'lowpass', frequency: 3000, q: 1 }
+ },
+ {
+ id: 'flute',
+ name: 'Flute',
+ culture: 'Western',
+ description: 'Pure, breathy tone',
+ waveformType: 'sine',
+ harmonicProfile: [1, 0.2, 0.1, 0.05, 0.02],
+ envelope: { attack: 0.05, decay: 0.1, sustain: 0.7, release: 0.2 },
+ filter: { type: 'highpass', frequency: 500, q: 0.7 }
+ },
+ {
+ id: 'brass',
+ name: 'Brass',
+ culture: 'Western',
+ description: 'Bright, bold trumpet/horn sound',
+ waveformType: 'square',
+ harmonicProfile: [1, 0.8, 0.7, 0.6, 0.5, 0.4],
+ envelope: { attack: 0.02, decay: 0.1, sustain: 0.8, release: 0.2 }
+ }
+];
+
+/**
+ * INDIAN INSTRUMENTS
+ */
+export const INDIAN_INSTRUMENTS: InstrumentVoice[] = [
+ {
+ id: 'sitar',
+ name: 'Sitar',
+ culture: 'Indian (Hindustani)',
+ description: 'Plucked string with sympathetic resonance',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.8, 0.6, 0.7, 0.5, 0.6, 0.4, 0.3, 0.2],
+ envelope: { attack: 0.005, decay: 1.5, sustain: 0.3, release: 0.8 }
+ },
+ {
+ id: 'tabla',
+ name: 'Tabla',
+ culture: 'Indian (Hindustani)',
+ description: 'Tuned hand drums with complex overtones',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.4, 0.8, 0.3, 0.6, 0.2, 0.4],
+ envelope: { attack: 0.001, decay: 0.15, sustain: 0.1, release: 0.1 }
+ },
+ {
+ id: 'bansuri',
+ name: 'Bansuri',
+ culture: 'Indian',
+ description: 'Bamboo flute with breathy tone',
+ waveformType: 'sine',
+ harmonicProfile: [1, 0.3, 0.2, 0.1, 0.05],
+ envelope: { attack: 0.08, decay: 0.1, sustain: 0.75, release: 0.25 },
+ vibrato: { rate: 4.5, depth: 0.02 }
+ },
+ {
+ id: 'tanpura',
+ name: 'Tanpura',
+ culture: 'Indian',
+ description: 'Drone instrument with rich overtones',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.7, 0.8, 0.6, 0.7, 0.5, 0.6, 0.4, 0.5],
+ envelope: { attack: 0.5, decay: 1.0, sustain: 0.9, release: 2.0 }
+ },
+ {
+ id: 'sarangi',
+ name: 'Sarangi',
+ culture: 'Indian (Hindustani)',
+ description: 'Bowed string with vocal quality',
+ waveformType: 'sawtooth',
+ harmonicProfile: [1, 0.8, 0.6, 0.7, 0.5, 0.4],
+ envelope: { attack: 0.1, decay: 0.2, sustain: 0.8, release: 0.4 },
+ vibrato: { rate: 6, depth: 0.03 }
+ }
+];
+
+/**
+ * MIDDLE EASTERN INSTRUMENTS
+ */
+export const MIDDLE_EASTERN_INSTRUMENTS: InstrumentVoice[] = [
+ {
+ id: 'oud',
+ name: 'Oud',
+ culture: 'Arabic/Middle Eastern',
+ description: 'Fretless lute with warm, resonant tone',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.7, 0.5, 0.4, 0.3, 0.2],
+ envelope: { attack: 0.01, decay: 0.8, sustain: 0.4, release: 0.6 }
+ },
+ {
+ id: 'ney',
+ name: 'Ney',
+ culture: 'Arabic/Persian/Turkish',
+ description: 'End-blown flute with breathy, mystical sound',
+ waveformType: 'sine',
+ harmonicProfile: [1, 0.2, 0.15, 0.08, 0.04],
+ envelope: { attack: 0.1, decay: 0.15, sustain: 0.7, release: 0.3 },
+ vibrato: { rate: 5, depth: 0.025 }
+ },
+ {
+ id: 'qanun',
+ name: 'Qanun',
+ culture: 'Arabic/Turkish',
+ description: 'Plucked zither with bright, shimmering tone',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.6, 0.8, 0.5, 0.6, 0.4, 0.3],
+ envelope: { attack: 0.005, decay: 1.0, sustain: 0.3, release: 0.7 },
+ tremolo: { rate: 8, depth: 0.2 }
+ },
+ {
+ id: 'darbuka',
+ name: 'Darbuka',
+ culture: 'Arabic/Middle Eastern',
+ description: 'Goblet drum with sharp attack',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.3, 0.5, 0.2, 0.4],
+ envelope: { attack: 0.001, decay: 0.12, sustain: 0.05, release: 0.08 }
+ },
+ {
+ id: 'santoor',
+ name: 'Santoor',
+ culture: 'Persian/Kashmiri',
+ description: 'Hammered dulcimer with shimmering sound',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.7, 0.6, 0.5, 0.4, 0.3],
+ envelope: { attack: 0.002, decay: 1.2, sustain: 0.2, release: 0.9 },
+ tremolo: { rate: 10, depth: 0.15 }
+ }
+];
+
+/**
+ * EAST ASIAN INSTRUMENTS
+ */
+export const EAST_ASIAN_INSTRUMENTS: InstrumentVoice[] = [
+ {
+ id: 'guzheng',
+ name: 'Guzheng',
+ culture: 'Chinese',
+ description: 'Plucked zither with bright, resonant tone',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2],
+ envelope: { attack: 0.003, decay: 1.5, sustain: 0.3, release: 1.0 },
+ vibrato: { rate: 4, depth: 0.02 }
+ },
+ {
+ id: 'erhu',
+ name: 'Erhu',
+ culture: 'Chinese',
+ description: 'Two-stringed bowed instrument, vocal quality',
+ waveformType: 'sawtooth',
+ harmonicProfile: [1, 0.8, 0.6, 0.5, 0.4],
+ envelope: { attack: 0.08, decay: 0.15, sustain: 0.8, release: 0.3 },
+ vibrato: { rate: 6.5, depth: 0.035 }
+ },
+ {
+ id: 'shakuhachi',
+ name: 'Shakuhachi',
+ culture: 'Japanese',
+ description: 'Bamboo flute with breathy, meditative tone',
+ waveformType: 'sine',
+ harmonicProfile: [1, 0.25, 0.15, 0.1, 0.05],
+ envelope: { attack: 0.15, decay: 0.2, sustain: 0.7, release: 0.4 },
+ vibrato: { rate: 4, depth: 0.03 }
+ },
+ {
+ id: 'koto',
+ name: 'Koto',
+ culture: 'Japanese',
+ description: 'Plucked long zither with delicate tone',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.6, 0.5, 0.4, 0.3, 0.2],
+ envelope: { attack: 0.005, decay: 1.8, sustain: 0.2, release: 1.2 }
+ },
+ {
+ id: 'taiko',
+ name: 'Taiko',
+ culture: 'Japanese',
+ description: 'Large drum with deep, resonant tone',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.2, 0.4, 0.1, 0.3],
+ envelope: { attack: 0.001, decay: 0.5, sustain: 0.3, release: 0.8 }
+ },
+ {
+ id: 'pipa',
+ name: 'Pipa',
+ culture: 'Chinese',
+ description: 'Plucked lute with percussive attack',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.7, 0.5, 0.6, 0.4, 0.3],
+ envelope: { attack: 0.002, decay: 0.6, sustain: 0.3, release: 0.5 }
+ },
+ {
+ id: 'gayageum',
+ name: 'Gayageum',
+ culture: 'Korean',
+ description: 'Korean zither with expressive bending',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.65, 0.5, 0.45, 0.3, 0.2],
+ envelope: { attack: 0.005, decay: 1.4, sustain: 0.3, release: 0.9 },
+ vibrato: { rate: 5, depth: 0.025 }
+ }
+];
+
+/**
+ * AFRICAN INSTRUMENTS
+ */
+export const AFRICAN_INSTRUMENTS: InstrumentVoice[] = [
+ {
+ id: 'djembe',
+ name: 'Djembe',
+ culture: 'West African',
+ description: 'Hand drum with wide tonal range',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.4, 0.6, 0.3, 0.5],
+ envelope: { attack: 0.001, decay: 0.15, sustain: 0.1, release: 0.12 }
+ },
+ {
+ id: 'kora',
+ name: 'Kora',
+ culture: 'West African',
+ description: '21-string harp-lute with harp-like tone',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.6, 0.5, 0.4, 0.3, 0.2],
+ envelope: { attack: 0.005, decay: 1.2, sustain: 0.4, release: 0.8 }
+ },
+ {
+ id: 'mbira',
+ name: 'Mbira',
+ culture: 'African (Zimbabwe)',
+ description: 'Thumb piano with metallic, percussive tone',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.8, 0.6, 0.7, 0.5, 0.6],
+ envelope: { attack: 0.001, decay: 0.8, sustain: 0.2, release: 0.6 }
+ },
+ {
+ id: 'balafon',
+ name: 'Balafon',
+ culture: 'West African',
+ description: 'Wooden xylophone with gourd resonators',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.5, 0.4, 0.3, 0.2],
+ envelope: { attack: 0.002, decay: 0.4, sustain: 0.2, release: 0.3 }
+ }
+];
+
+/**
+ * INDONESIAN GAMELAN INSTRUMENTS
+ */
+export const GAMELAN_INSTRUMENTS: InstrumentVoice[] = [
+ {
+ id: 'gamelan-gong',
+ name: 'Gamelan Gong',
+ culture: 'Indonesian',
+ description: 'Large bronze gong with shimmering overtones',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.6, 0.8, 0.5, 0.7, 0.4, 0.6, 0.3, 0.5],
+ envelope: { attack: 0.01, decay: 3.0, sustain: 0.6, release: 5.0 }
+ },
+ {
+ id: 'gamelan-saron',
+ name: 'Gamelan Saron',
+ culture: 'Indonesian',
+ description: 'Metallophone with bright, ringing tone',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.7, 0.6, 0.5, 0.4],
+ envelope: { attack: 0.002, decay: 0.8, sustain: 0.3, release: 0.6 }
+ },
+ {
+ id: 'gamelan-gender',
+ name: 'Gamelan Gender',
+ culture: 'Indonesian',
+ description: 'Bronze metallophone with tube resonators',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.6, 0.7, 0.5, 0.6, 0.4],
+ envelope: { attack: 0.005, decay: 1.5, sustain: 0.4, release: 1.2 }
+ }
+];
+
+/**
+ * LATIN AMERICAN INSTRUMENTS
+ */
+export const LATIN_INSTRUMENTS: InstrumentVoice[] = [
+ {
+ id: 'congas',
+ name: 'Congas',
+ culture: 'Afro-Cuban',
+ description: 'Tall hand drums with warm tone',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.4, 0.5, 0.3, 0.4],
+ envelope: { attack: 0.001, decay: 0.2, sustain: 0.15, release: 0.15 }
+ },
+ {
+ id: 'charango',
+ name: 'Charango',
+ culture: 'Andean',
+ description: 'Small guitar-like instrument',
+ waveformType: 'custom',
+ harmonicProfile: [1, 0.7, 0.5, 0.4, 0.3],
+ envelope: { attack: 0.005, decay: 0.5, sustain: 0.4, release: 0.4 }
+ },
+ {
+ id: 'pan-flute',
+ name: 'Pan Flute',
+ culture: 'Andean',
+ description: 'Multiple flutes with ethereal sound',
+ waveformType: 'sine',
+ harmonicProfile: [1, 0.3, 0.2, 0.1],
+ envelope: { attack: 0.06, decay: 0.1, sustain: 0.75, release: 0.25 }
+ }
+];
+
+/**
+ * COMPREHENSIVE INSTRUMENT COLLECTION
+ */
+export const ALL_INSTRUMENTS = [
+ ...WESTERN_INSTRUMENTS,
+ ...INDIAN_INSTRUMENTS,
+ ...MIDDLE_EASTERN_INSTRUMENTS,
+ ...EAST_ASIAN_INSTRUMENTS,
+ ...AFRICAN_INSTRUMENTS,
+ ...GAMELAN_INSTRUMENTS,
+ ...LATIN_INSTRUMENTS
+];
+
+export const INSTRUMENT_CATEGORIES = {
+ "Western": WESTERN_INSTRUMENTS,
+ "Indian": INDIAN_INSTRUMENTS,
+ "Middle Eastern": MIDDLE_EASTERN_INSTRUMENTS,
+ "East Asian": EAST_ASIAN_INSTRUMENTS,
+ "African": AFRICAN_INSTRUMENTS,
+ "Indonesian Gamelan": GAMELAN_INSTRUMENTS,
+ "Latin American": LATIN_INSTRUMENTS
+};
+
+/**
+ * SYNTHESIS ENGINE CLASS
+ */
+export class AdvancedSynthEngine {
+ private audioContext: AudioContext;
+ private masterGain: GainNode;
+ private compressor: DynamicsCompressorNode;
+ private reverb: ConvolverNode | null = null;
+
+ constructor(audioContext: AudioContext) {
+ this.audioContext = audioContext;
+
+ // Master output chain
+ this.masterGain = audioContext.createGain();
+ this.masterGain.gain.value = 0.7;
+
+ this.compressor = audioContext.createDynamicsCompressor();
+ this.compressor.threshold.value = -20;
+ this.compressor.knee.value = 10;
+ this.compressor.ratio.value = 4;
+ this.compressor.attack.value = 0.003;
+ this.compressor.release.value = 0.25;
+
+ this.masterGain.connect(this.compressor);
+ this.compressor.connect(audioContext.destination);
+ }
+
+ /**
+ * Play a note with a specific instrument voice
+ */
+ playNote(
+ frequency: number,
+ instrument: InstrumentVoice,
+ duration: number = 1.0,
+ velocity: number = 1.0
+ ): void {
+ const now = this.audioContext.currentTime;
+ const env = instrument.envelope;
+
+ // Create oscillators for harmonics
+ const oscillators: OscillatorNode[] = [];
+ const gains: GainNode[] = [];
+
+ if (instrument.harmonicProfile && instrument.harmonicProfile.length > 0) {
+ // Multi-harmonic synthesis
+ instrument.harmonicProfile.forEach((amplitude, index) => {
+ if (amplitude > 0.01) {
+ const osc = this.audioContext.createOscillator();
+ const gain = this.audioContext.createGain();
+
+ osc.frequency.value = frequency * (index + 1); // Harmonics
+ osc.type = instrument.waveformType === 'custom' ? 'sine' : instrument.waveformType;
+
+ gain.gain.value = 0;
+
+ osc.connect(gain);
+ oscillators.push(osc);
+ gains.push(gain);
+ }
+ });
+ } else {
+ // Single oscillator
+ const osc = this.audioContext.createOscillator();
+ const gain = this.audioContext.createGain();
+
+ osc.frequency.value = frequency;
+ osc.type = instrument.waveformType === 'custom' ? 'sine' : instrument.waveformType;
+ gain.gain.value = 0;
+
+ osc.connect(gain);
+ oscillators.push(osc);
+ gains.push(gain);
+ }
+
+ // Filter
+ let filterNode: BiquadFilterNode | null = null;
+ if (instrument.filter) {
+ filterNode = this.audioContext.createBiquadFilter();
+ filterNode.type = instrument.filter.type;
+ filterNode.frequency.value = instrument.filter.frequency;
+ filterNode.Q.value = instrument.filter.q;
+ }
+
+ // Vibrato
+ let vibratoOsc: OscillatorNode | null = null;
+ let vibratoGain: GainNode | null = null;
+ if (instrument.vibrato) {
+ vibratoOsc = this.audioContext.createOscillator();
+ vibratoGain = this.audioContext.createGain();
+
+ vibratoOsc.frequency.value = instrument.vibrato.rate;
+ vibratoGain.gain.value = frequency * instrument.vibrato.depth;
+
+ vibratoOsc.connect(vibratoGain);
+ vibratoOsc.start(now);
+
+ oscillators.forEach(osc => {
+ if (vibratoGain) vibratoGain.connect(osc.frequency);
+ });
+ }
+
+ // Connect nodes
+ gains.forEach((gain, index) => {
+ const amplitude = instrument.harmonicProfile?.[index] || 1;
+
+ if (filterNode) {
+ gain.connect(filterNode);
+ } else {
+ gain.connect(this.masterGain);
+ }
+
+ // ADSR Envelope
+ const targetAmplitude = amplitude * velocity * 0.3;
+
+ gain.gain.setValueAtTime(0, now);
+ gain.gain.linearRampToValueAtTime(targetAmplitude, now + env.attack);
+ gain.gain.linearRampToValueAtTime(
+ targetAmplitude * env.sustain,
+ now + env.attack + env.decay
+ );
+ gain.gain.setValueAtTime(
+ targetAmplitude * env.sustain,
+ now + duration
+ );
+ gain.gain.linearRampToValueAtTime(0, now + duration + env.release);
+ });
+
+ if (filterNode) {
+ filterNode.connect(this.masterGain);
+ }
+
+ // Start oscillators
+ oscillators.forEach(osc => osc.start(now));
+
+ // Stop and cleanup
+ const stopTime = now + duration + env.release + 0.1;
+ oscillators.forEach(osc => osc.stop(stopTime));
+ if (vibratoOsc) vibratoOsc.stop(stopTime);
+ }
+
+ setMasterVolume(volume: number): void {
+ this.masterGain.gain.setValueAtTime(volume, this.audioContext.currentTime);
+ }
+
+ getMasterVolume(): number {
+ return this.masterGain.gain.value;
+ }
+}
+
+console.log(`✨ Loaded ${ALL_INSTRUMENTS.length} cultural instrument models from ${Object.keys(INSTRUMENT_CATEGORIES).length} traditions`);
diff --git a/web-ui/src/engines/tuningSystem.ts b/web-ui/src/engines/tuningSystem.ts
new file mode 100644
index 0000000..4c81bc4
--- /dev/null
+++ b/web-ui/src/engines/tuningSystem.ts
@@ -0,0 +1,537 @@
+/**
+ * ============================================================================
+ * ADVANCED TUNING SYSTEMS ENGINE
+ * Historical & Cultural Intonation Systems
+ * ============================================================================
+ *
+ * This engine implements every major tuning system from human history,
+ * enabling authentic recreation of historical and cultural music.
+ */
+
+export interface TuningSystemDef {
+ id: string;
+ name: string;
+ culture: string;
+ era: string;
+ description: string;
+ baseFrequency: number;
+ calculateFrequency: (noteIndex: number, baseFreq?: number) => number;
+ characteristics: string;
+}
+
+/**
+ * EQUAL TEMPERAMENT SYSTEMS
+ */
+
+// 12-TET (Standard Modern Tuning)
+export const EQUAL_TEMPERAMENT_12: TuningSystemDef = {
+ id: '12-tet',
+ name: '12-Tone Equal Temperament',
+ culture: 'Western',
+ era: '1700s - Present',
+ baseFrequency: 440, // A4
+ description: 'Modern standard tuning - all semitones are exactly equal',
+ characteristics: 'Perfectly even semitones, works in all keys equally',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 440) => {
+ // A4 = 440 Hz = index 0, each semitone is 2^(1/12)
+ return baseFreq * Math.pow(2, noteIndex / 12);
+ }
+};
+
+// 19-TET (Microtonal)
+export const EQUAL_TEMPERAMENT_19: TuningSystemDef = {
+ id: '19-tet',
+ name: '19-Tone Equal Temperament',
+ culture: 'Modern/Experimental',
+ era: '1900s - Present',
+ baseFrequency: 440,
+ description: '19 equal divisions of the octave - excellent major thirds',
+ characteristics: 'Better thirds than 12-TET, 1/3-comma meantone approximation',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 440) => {
+ return baseFreq * Math.pow(2, noteIndex / 19);
+ }
+};
+
+// 24-TET (Quarter Tones)
+export const EQUAL_TEMPERAMENT_24: TuningSystemDef = {
+ id: '24-tet',
+ name: '24-Tone Equal Temperament (Quarter Tones)',
+ culture: 'Modern/Middle Eastern',
+ era: '1900s - Present',
+ baseFrequency: 440,
+ description: 'Quarter tone system - each semitone divided in half',
+ characteristics: 'Used in Arabic music analysis, experimental Western music',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 440) => {
+ return baseFreq * Math.pow(2, noteIndex / 24);
+ }
+};
+
+// 31-TET (Extended Meantone)
+export const EQUAL_TEMPERAMENT_31: TuningSystemDef = {
+ id: '31-tet',
+ name: '31-Tone Equal Temperament',
+ culture: 'Modern/Historical',
+ era: '1600s, 1900s - Present',
+ baseFrequency: 440,
+ description: '31 equal divisions - excellent approximation of 1/4-comma meantone',
+ characteristics: 'Pure major thirds, very good fifths',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 440) => {
+ return baseFreq * Math.pow(2, noteIndex / 31);
+ }
+};
+
+// 53-TET (Pythagorean Approximation)
+export const EQUAL_TEMPERAMENT_53: TuningSystemDef = {
+ id: '53-tet',
+ name: '53-Tone Equal Temperament',
+ culture: 'Modern/Historical',
+ era: 'Ancient China, 1900s - Present',
+ baseFrequency: 440,
+ description: '53 equal divisions - excellent Pythagorean approximation',
+ characteristics: 'Closely approximates Pythagorean tuning and commas',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 440) => {
+ return baseFreq * Math.pow(2, noteIndex / 53);
+ }
+};
+
+/**
+ * JUST INTONATION SYSTEMS
+ */
+
+// Pure Just Intonation (Ptolemy's Intense Diatonic)
+export const JUST_INTONATION: TuningSystemDef = {
+ id: 'just-intonation',
+ name: 'Just Intonation (5-Limit)',
+ culture: 'Universal',
+ era: 'Ancient - Present',
+ baseFrequency: 264, // C4
+ description: 'Pure harmonic ratios - no beating in consonant intervals',
+ characteristics: 'Perfect consonances, but cannot modulate freely',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 264) => {
+ // C major scale in just intonation
+ const ratios = [
+ 1, // C - 1/1
+ 9/8, // D - 9/8
+ 5/4, // E - 5/4
+ 4/3, // F - 4/3
+ 3/2, // G - 3/2
+ 5/3, // A - 5/3
+ 15/8, // B - 15/8
+ 2 // C - 2/1
+ ];
+
+ const octave = Math.floor(noteIndex / 7);
+ const note = noteIndex % 7;
+
+ return baseFreq * ratios[note] * Math.pow(2, octave);
+ }
+};
+
+// Indian Shruti System (22 notes)
+export const SHRUTI_SYSTEM: TuningSystemDef = {
+ id: 'shruti-22',
+ name: '22 Shruti System',
+ culture: 'Indian',
+ era: 'Ancient - Present',
+ baseFrequency: 240, // Sa
+ description: 'Ancient Indian 22-note microtonal system',
+ characteristics: 'Most sophisticated historical tuning system, enables all ragas',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 240) => {
+ // Approximate 22 shruti divisions based on traditional ratios
+ const shrutis = [
+ 1, // Sa
+ 256/243, // Komal Re (1 shruti)
+ 16/15, // Komal Re (2 shruti)
+ 10/9, // Komal Re (3 shruti)
+ 9/8, // Re (4 shruti)
+ 32/27, // Komal Ga (1 shruti)
+ 6/5, // Komal Ga (2 shruti)
+ 5/4, // Ga (3 shruti)
+ 81/64, // Ga (4 shruti)
+ 4/3, // Ma (1 shruti)
+ 27/20, // Ma (2 shruti)
+ 45/32, // Tivra Ma (1 shruti)
+ 729/512, // Tivra Ma (2 shruti)
+ 3/2, // Pa
+ 128/81, // Komal Dha (1 shruti)
+ 8/5, // Komal Dha (2 shruti)
+ 5/3, // Dha (3 shruti)
+ 27/16, // Dha (4 shruti)
+ 16/9, // Komal Ni (1 shruti)
+ 9/5, // Komal Ni (2 shruti)
+ 15/8, // Ni (3 shruti)
+ 243/128, // Ni (4 shruti)
+ 2 // Sa
+ ];
+
+ const octave = Math.floor(noteIndex / 22);
+ const note = noteIndex % 22;
+
+ return baseFreq * shrutis[note] * Math.pow(2, octave);
+ }
+};
+
+/**
+ * PYTHAGOREAN TUNING
+ */
+export const PYTHAGOREAN_TUNING: TuningSystemDef = {
+ id: 'pythagorean',
+ name: 'Pythagorean Tuning',
+ culture: 'Ancient Greek/Medieval European',
+ era: '500 BCE - 1500 CE',
+ baseFrequency: 256, // C4
+ description: 'Based on perfect fifths (3:2 ratio) - pure fifths, sharp thirds',
+ characteristics: 'Perfect fifths and fourths, but thirds are noticeably sharp',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 256) => {
+ // Pythagorean scale ratios
+ const ratios = [
+ 1, // C
+ 256/243, // C# (Pythagorean limma)
+ 9/8, // D
+ 32/27, // Eb
+ 81/64, // E (sharp third!)
+ 4/3, // F
+ 1024/729, // F#
+ 3/2, // G
+ 128/81, // G#
+ 27/16, // A
+ 16/9, // Bb
+ 243/128, // B
+ 2 // C
+ ];
+
+ const octave = Math.floor(noteIndex / 12);
+ const note = noteIndex % 12;
+
+ return baseFreq * ratios[note] * Math.pow(2, octave);
+ }
+};
+
+/**
+ * MEANTONE TEMPERAMENTS
+ */
+
+// Quarter-Comma Meantone
+export const QUARTER_COMMA_MEANTONE: TuningSystemDef = {
+ id: 'quarter-comma-meantone',
+ name: 'Quarter-Comma Meantone',
+ culture: 'European Renaissance',
+ era: '1500 - 1700',
+ baseFrequency: 256,
+ description: 'Fifths narrowed to give pure major thirds (5:4)',
+ characteristics: 'Beautiful thirds, slightly impure fifths, wolf intervals',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 256) => {
+ // Fifth flattened by 1/4 syntonic comma
+ const fifth = Math.pow(5, 0.25); // ≈ 1.495 (slightly flat fifth)
+ const semitone = Math.pow(fifth, 1/5);
+
+ return baseFreq * Math.pow(semitone, noteIndex);
+ }
+};
+
+// Third-Comma Meantone
+export const THIRD_COMMA_MEANTONE: TuningSystemDef = {
+ id: 'third-comma-meantone',
+ name: 'Third-Comma Meantone',
+ culture: 'European Renaissance',
+ era: '1500 - 1700',
+ baseFrequency: 256,
+ description: 'Fifths narrowed by 1/3 syntonic comma',
+ characteristics: 'Compromise between Pythagorean and 1/4-comma',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 256) => {
+ const fifth = Math.pow(5/4, 1/3) * 4/3; // Third-comma tempered fifth
+ const semitone = Math.pow(fifth / (4/3), 1/5);
+
+ return baseFreq * Math.pow(semitone, noteIndex);
+ }
+};
+
+/**
+ * WELL TEMPERAMENTS (Historical)
+ */
+
+// Werckmeister III
+export const WERCKMEISTER_III: TuningSystemDef = {
+ id: 'werckmeister-3',
+ name: 'Werckmeister III',
+ culture: 'German Baroque',
+ era: '1691 - 1800s',
+ baseFrequency: 256,
+ description: 'Well temperament - all keys usable, each with unique color',
+ characteristics: 'C major pure, increasingly complex as you add sharps/flats',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 256) => {
+ // Werckmeister III ratios (C-based)
+ const ratios = [
+ 1, // C
+ 256/243, // C#
+ Math.pow(2, 2/12) / Math.pow(2, 1/4), // D
+ 32/27, // Eb
+ Math.pow(2, 4/12) / Math.pow(2, 1/4), // E
+ 4/3, // F
+ Math.pow(2, 6/12) / Math.pow(2, 1/4), // F#
+ 3/2, // G
+ 128/81, // G#
+ Math.pow(2, 9/12) / Math.pow(2, 1/4), // A
+ 16/9, // Bb
+ Math.pow(2, 11/12) / Math.pow(2, 1/4), // B
+ 2 // C
+ ];
+
+ const octave = Math.floor(noteIndex / 12);
+ const note = noteIndex % 12;
+
+ return baseFreq * ratios[note] * Math.pow(2, octave);
+ }
+};
+
+// Kirnberger III
+export const KIRNBERGER_III: TuningSystemDef = {
+ id: 'kirnberger-3',
+ name: 'Kirnberger III',
+ culture: 'German Baroque',
+ era: '1770s - 1800s',
+ baseFrequency: 256,
+ description: 'Well temperament combining just and Pythagorean intervals',
+ characteristics: 'Very pure C major, increasingly tense remote keys',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 256) => {
+ const ratios = [
+ 1, // C (pure)
+ 256/243, // C# (Pythagorean)
+ 9/8, // D (pure)
+ 32/27, // Eb (Pythagorean)
+ 5/4, // E (pure just third!)
+ 4/3, // F (pure)
+ 45/32, // F# (just)
+ 3/2, // G (pure)
+ 128/81, // G# (Pythagorean)
+ 5/3, // A (just)
+ 16/9, // Bb (Pythagorean)
+ 15/8, // B (just)
+ 2 // C
+ ];
+
+ const octave = Math.floor(noteIndex / 12);
+ const note = noteIndex % 12;
+
+ return baseFreq * ratios[note] * Math.pow(2, octave);
+ }
+};
+
+// Vallotti-Young
+export const VALLOTTI_YOUNG: TuningSystemDef = {
+ id: 'vallotti-young',
+ name: 'Vallotti-Young Temperament',
+ culture: 'Italian/English Baroque',
+ era: '1700s - 1800s',
+ baseFrequency: 256,
+ description: 'Circulating temperament, 6 fifths tempered',
+ characteristics: 'More even than other well temperaments, subtle key colors',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 256) => {
+ // Six fifths F-C-G-D-A-E tempered by 1/6 Pythagorean comma
+ const pythagoreanComma = Math.pow(3, 12) / Math.pow(2, 19);
+ const temperedFifth = 3/2 / Math.pow(pythagoreanComma, 1/6);
+
+ // Build circle of fifths
+ const fifths = [0, 7, 2, 9, 4, 11, 6, 1, 8, 3, 10, 5]; // F C G D A E B F# C# G# D# A#
+ const frequencies = new Array(12);
+
+ let currentFreq = 1;
+ for (let i = 0; i < 12; i++) {
+ frequencies[fifths[i]] = currentFreq;
+ currentFreq *= (i < 6) ? temperedFifth : 3/2; // First 6 tempered, rest pure
+ while (currentFreq >= 2) currentFreq /= 2; // Reduce to octave
+ }
+
+ const octave = Math.floor(noteIndex / 12);
+ const note = noteIndex % 12;
+
+ return baseFreq * frequencies[note] * Math.pow(2, octave);
+ }
+};
+
+/**
+ * HISTORICAL ARABIC SYSTEMS
+ */
+export const ARABIC_MAQAM_24: TuningSystemDef = {
+ id: 'arabic-24tet',
+ name: 'Arabic 24-Tone System',
+ culture: 'Arabic/Middle Eastern',
+ era: 'Medieval - Present',
+ baseFrequency: 440,
+ description: 'Quarter tone system for maqam music',
+ characteristics: 'Enables all maqamat with quarter tone precision',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 440) => {
+ return baseFreq * Math.pow(2, noteIndex / 24);
+ }
+};
+
+/**
+ * CHINESE SYSTEMS
+ */
+export const CHINESE_LU_SYSTEM: TuningSystemDef = {
+ id: 'chinese-lu',
+ name: 'Chinese Lü System',
+ culture: 'Ancient Chinese',
+ era: '2000 BCE - Present',
+ baseFrequency: 240,
+ description: 'Ancient Chinese system based on bamboo pipe lengths',
+ characteristics: 'Cycle of perfect fifths, similar to Pythagorean',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 240) => {
+ // 12 Lü based on cycle of fifths (similar to Pythagorean)
+ const fifthRatio = 3/2;
+ const octave = Math.floor(noteIndex / 12);
+ const lu = noteIndex % 12;
+
+ let freq = baseFreq;
+ for (let i = 0; i < lu; i++) {
+ freq *= fifthRatio;
+ while (freq >= baseFreq * 2) freq /= 2;
+ }
+
+ return freq * Math.pow(2, octave);
+ }
+};
+
+/**
+ * EXPERIMENTAL NON-OCTAVE SYSTEMS
+ */
+export const BOHLEN_PIERCE: TuningSystemDef = {
+ id: 'bohlen-pierce',
+ name: 'Bohlen-Pierce Scale',
+ culture: 'Modern Experimental',
+ era: '1970s - Present',
+ baseFrequency: 440,
+ description: 'Non-octave scale based on 3:1 ratio (tritave) with 13 steps',
+ characteristics: 'Completely alien sound, based on odd harmonics only',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 440) => {
+ // 13 equal divisions of the tritave (3:1 ratio)
+ const tritaveRatio = 3;
+ const stepsPerTritave = 13;
+
+ return baseFreq * Math.pow(tritaveRatio, noteIndex / stepsPerTritave);
+ }
+};
+
+export const CARLOS_ALPHA: TuningSystemDef = {
+ id: 'carlos-alpha',
+ name: 'Carlos Alpha Scale',
+ culture: 'Modern Experimental',
+ era: '1980s - Present',
+ baseFrequency: 440,
+ description: 'Wendy Carlos non-octave scale, 15.385 steps per octave',
+ characteristics: 'Used in film score for TRON',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 440) => {
+ const stepSize = 78.0; // cents
+ return baseFreq * Math.pow(2, (noteIndex * stepSize) / 1200);
+ }
+};
+
+export const CARLOS_BETA: TuningSystemDef = {
+ id: 'carlos-beta',
+ name: 'Carlos Beta Scale',
+ culture: 'Modern Experimental',
+ era: '1980s - Present',
+ baseFrequency: 440,
+ description: 'Wendy Carlos non-octave scale, 18.809 steps per octave',
+ characteristics: 'Alternative Carlos tuning, slightly closer to 12-TET',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 440) => {
+ const stepSize = 63.8; // cents
+ return baseFreq * Math.pow(2, (noteIndex * stepSize) / 1200);
+ }
+};
+
+export const CARLOS_GAMMA: TuningSystemDef = {
+ id: 'carlos-gamma',
+ name: 'Carlos Gamma Scale',
+ culture: 'Modern Experimental',
+ era: '1980s - Present',
+ baseFrequency: 440,
+ description: 'Wendy Carlos scale approximating equal-beating chords',
+ characteristics: 'Perfect for electronic timbres',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 440) => {
+ const stepSize = 35.1; // cents
+ return baseFreq * Math.pow(2, (noteIndex * stepSize) / 1200);
+ }
+};
+
+/**
+ * SCIENTIFIC/PHILOSOPHICAL TUNINGS
+ */
+export const SCIENTIFIC_PITCH: TuningSystemDef = {
+ id: 'scientific-pitch',
+ name: 'Scientific Pitch (Verdi Tuning)',
+ culture: 'Western Scientific',
+ era: '1800s - Present',
+ baseFrequency: 256, // C4 = 256 Hz (powers of 2)
+ description: 'C4 = 256 Hz, A4 = 430.54 Hz - based on powers of 2',
+ characteristics: 'Mathematical elegance, octaves are exact powers of 2',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 256) => {
+ return baseFreq * Math.pow(2, noteIndex / 12);
+ }
+};
+
+export const CONCERT_PITCH_432: TuningSystemDef = {
+ id: 'concert-432',
+ name: '432 Hz Tuning',
+ culture: 'Alternative/New Age',
+ era: '1900s - Present',
+ baseFrequency: 432,
+ description: 'A4 = 432 Hz - claimed to be more "natural" or "cosmic"',
+ characteristics: 'Lower, warmer pitch, popular in alternative music',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 432) => {
+ return baseFreq * Math.pow(2, noteIndex / 12);
+ }
+};
+
+export const BAROQUE_PITCH: TuningSystemDef = {
+ id: 'baroque-pitch',
+ name: 'Baroque Pitch (A415)',
+ culture: 'European Baroque',
+ era: '1600 - 1750',
+ baseFrequency: 415,
+ description: 'Historical pitch standard, about a semitone lower than modern',
+ characteristics: 'Warmer, darker sound, historically authentic',
+ calculateFrequency: (noteIndex: number, baseFreq: number = 415) => {
+ return baseFreq * Math.pow(2, noteIndex / 12);
+ }
+};
+
+/**
+ * ALL TUNING SYSTEMS COLLECTION
+ */
+export const ALL_TUNING_SYSTEMS: TuningSystemDef[] = [
+ EQUAL_TEMPERAMENT_12,
+ EQUAL_TEMPERAMENT_19,
+ EQUAL_TEMPERAMENT_24,
+ EQUAL_TEMPERAMENT_31,
+ EQUAL_TEMPERAMENT_53,
+ JUST_INTONATION,
+ SHRUTI_SYSTEM,
+ PYTHAGOREAN_TUNING,
+ QUARTER_COMMA_MEANTONE,
+ THIRD_COMMA_MEANTONE,
+ WERCKMEISTER_III,
+ KIRNBERGER_III,
+ VALLOTTI_YOUNG,
+ ARABIC_MAQAM_24,
+ CHINESE_LU_SYSTEM,
+ BOHLEN_PIERCE,
+ CARLOS_ALPHA,
+ CARLOS_BETA,
+ CARLOS_GAMMA,
+ SCIENTIFIC_PITCH,
+ CONCERT_PITCH_432,
+ BAROQUE_PITCH
+];
+
+export const TUNING_CATEGORIES = {
+ "Modern Equal Temperament": [EQUAL_TEMPERAMENT_12, EQUAL_TEMPERAMENT_19, EQUAL_TEMPERAMENT_24, EQUAL_TEMPERAMENT_31, EQUAL_TEMPERAMENT_53],
+ "Just Intonation": [JUST_INTONATION, SHRUTI_SYSTEM],
+ "Historical European": [PYTHAGOREAN_TUNING, QUARTER_COMMA_MEANTONE, THIRD_COMMA_MEANTONE],
+ "Well Temperaments": [WERCKMEISTER_III, KIRNBERGER_III, VALLOTTI_YOUNG],
+ "Cultural Systems": [ARABIC_MAQAM_24, CHINESE_LU_SYSTEM],
+ "Experimental": [BOHLEN_PIERCE, CARLOS_ALPHA, CARLOS_BETA, CARLOS_GAMMA],
+ "Pitch Standards": [SCIENTIFIC_PITCH, CONCERT_PITCH_432, BAROQUE_PITCH]
+};
+
+console.log(`✨ Loaded ${ALL_TUNING_SYSTEMS.length} tuning systems from across human history`);
diff --git a/web-ui/src/index.css b/web-ui/src/index.css
new file mode 100644
index 0000000..4673e09
--- /dev/null
+++ b/web-ui/src/index.css
@@ -0,0 +1,86 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ font-family: 'Inter', system-ui, Avenir, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ font-weight: 400;
+
+ color-scheme: dark;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+body {
+ margin: 0;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+/* Custom scrollbar */
+::-webkit-scrollbar {
+ width: 10px;
+ height: 10px;
+}
+
+::-webkit-scrollbar-track {
+ background: #0f172a;
+ border-radius: 5px;
+}
+
+::-webkit-scrollbar-thumb {
+ background: #334155;
+ border-radius: 5px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: #475569;
+}
+
+/* Animations */
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animate-in {
+ animation: fadeIn 0.3s ease-out;
+}
+
+@keyframes pulse-glow {
+ 0%, 100% {
+ box-shadow: 0 0 5px rgba(20, 184, 166, 0.5);
+ }
+ 50% {
+ box-shadow: 0 0 20px rgba(20, 184, 166, 0.8);
+ }
+}
+
+/* Loading states */
+@keyframes spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+.animate-spin {
+ animation: spin 1s linear infinite;
+}
diff --git a/web-ui/src/main.tsx b/web-ui/src/main.tsx
new file mode 100644
index 0000000..4830d94
--- /dev/null
+++ b/web-ui/src/main.tsx
@@ -0,0 +1,13 @@
+import React from 'react';
+import ReactDOM from 'react-dom/client';
+import App from './App';
+import './index.css';
+
+console.log('%c🎵 UNIVERSAL MUSIC PRODUCTION SYSTEM 2029 🎵', 'color: #14b8a6; font-size: 24px; font-weight: bold;');
+console.log('%cInitializing the most advanced representation of cultural musical knowledge...', 'color: #3b82f6; font-size: 14px;');
+
+ReactDOM.createRoot(document.getElementById('root')!).render(
+
+
+
+);
diff --git a/web-ui/tailwind.config.js b/web-ui/tailwind.config.js
new file mode 100644
index 0000000..b304995
--- /dev/null
+++ b/web-ui/tailwind.config.js
@@ -0,0 +1,15 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: [
+ "./index.html",
+ "./src/**/*.{js,ts,jsx,tsx}",
+ ],
+ theme: {
+ extend: {
+ animation: {
+ 'pulse': 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',
+ }
+ },
+ },
+ plugins: [],
+}
diff --git a/web-ui/tsconfig.json b/web-ui/tsconfig.json
new file mode 100644
index 0000000..a7fc6fb
--- /dev/null
+++ b/web-ui/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/web-ui/tsconfig.node.json b/web-ui/tsconfig.node.json
new file mode 100644
index 0000000..42872c5
--- /dev/null
+++ b/web-ui/tsconfig.node.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/web-ui/vite.config.ts b/web-ui/vite.config.ts
new file mode 100644
index 0000000..cb3e436
--- /dev/null
+++ b/web-ui/vite.config.ts
@@ -0,0 +1,14 @@
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+
+export default defineConfig({
+ plugins: [react()],
+ server: {
+ port: 3000,
+ open: true
+ },
+ build: {
+ outDir: 'dist',
+ sourcemap: true
+ }
+});