Composez en écrivant du code

(Lulalib) est un DSL déclaratif de composition musicale pour JavaScript et TypeScript.
Décrivez une intention musicale, exportez un Score exact et sérialisable, sans jamais piloter l'horloge.

verse.ts
import { song, section, bass, lead, drums } from "Lulalib"; const verse = section([  drums("909").kick("x---x---").hihat("xxxxxxxx"),  bass("acid").notes("1 5 1 4").rhythm("x-x-x-x-"),  lead("saw").notes("1 3 5 3").octave(5).rhythm("x-x-x-x-"),]); export default song({ bpm: 120, key: "Am" })  .arrange([verse, verse])  .export();

Sous le capot

Pensée pour les développeurs

Déclaratif, pas impératif

Décrivez une intention musicale : un rythme, une mélodie, un enchaînement de sections, sans jamais piloter d'horloge ni de scheduler. Lulalib s'occupe de la résolution temporelle.

Zéro dépendance, partout

Aucun moteur audio, aucun DOM. Le cœur de la lib tourne dans n'importe quel environnement JS/TS, du navigateur au serveur.

Un Score, sérialisable et exact

Chaque composition se compile en un objet Score plat, en JSON. Les durées sont des fractions : ce que vous écrivez est ce qui est joué.

1 appel = 1 valeur

section, song, track... chaque méthode retourne une nouvelle valeur. Réutilisez, composez, dupliquez vos patterns sans effet de bord.

Playground

Testez le DSL directement dans le navigateur

import { song, section, bass, lead, drums } from "Lulalib"; const verse = section([  drums("909").kick("x---x---").hihat("xxxxxxxx"),  bass("acid").notes("A2 E2 A2 D2").rhythm("x-x-x-x-"),  lead("saw").notes("A4 C5 E5 C5").rhythm("x-x-x-x-"),]); export default song({ bpm: 120 })  .arrange([verse, verse])  .export();
Lead
Bass
Hi-hat
Kick