Documentació Crea un espectacle de llums
Referència de l'API d'entorns
Tot el que un paquet d'entorn pot declarar, rebre i importar. Aquesta és la versió 1 de l'API d'entorns.
Aquesta és la referència per a qui escriu un entorn de l'espectacle de llums. Crear un entorn és el recorregut pas a pas, i Com funciona l'espectacle de llums explica d'on surten les dades.
Dins d'una mateixa versió de l'API només s'hi afegeixen coses. Un paquet escrit per a la versió 1 continua funcionant en qualsevol Rainy que parli la versió 1.
El paquet
Un paquet és un fitxer .zip:
my-show.zip
rainy-environment.json the manifest
index.js the entry module
style.css optional
preview.jpg the picture people choose it by
… your own modules, libraries, shaders, images, fonts
El manifest és a l'arrel del zip, o dins d'una única carpeta de primer nivell, que és el que dona la baixada d'un repositori.
| Límit | |
|---|---|
| Mida | 20 MB comprimit, 60 MB descomprimit, 500 fitxers. |
| Tipus de fitxer | js mjs json css wasm; imatges png jpg jpeg webp avif gif svg; tipus de lletra woff2 woff ttf otf; shaders i text glsl vert frag wgsl txt md; dades bin ktx2 hdr; multimèdia mp3 ogg mp4 webm. |
| S'ometen | Els fitxers ocults, node_modules i el que afegeixen els compressors (__MACOSX, .DS_Store). |
| Es rebutgen | Camins absoluts, .., enllaços, altres tipus de fitxer i tot el que superi els límits. |
El manifest
rainy-environment.json:
| Camp | ||
|---|---|---|
manifest |
obligatori | Versió del format d'aquest fitxer: 1. |
api |
obligatori | Versió de l'API d'entorns per a la qual s'ha escrit el codi: 1. Rainy rebutja un paquet escrit per a una versió que no parla. |
id |
obligatori | De 2 a 32 caràcters: lletres minúscules, dígits i guions, començant per una lletra. Instal·lar un paquet amb l'id d'un de ja instal·lat el substitueix. classic està reservat. |
name |
obligatori | Es mostra a la Configuració i a l'espectacle. Fins a 60 caràcters. |
version |
obligatori | Amb la forma 1.2.3. |
entry |
obligatori | El mòdul que es carrega: un fitxer .js o .mjs del paquet. |
description |
Una línia per al selector. Fins a 300 caràcters. | |
author, license |
Es mostren a la Configuració. | |
homepage |
Una adreça http o https. |
|
styles |
Fins a 8 fulls d'estil, que es carreguen mentre l'entorn és a escena i es retiren quan se'n va. Consulta Donar estil al reproductor. | |
preview |
recomanat | La imatge de la Configuració: una imatge 16:9; 960 × 540 és de sobres. Sense ella, l'entorn rep una placa en blanc. |
layout |
stage (per defecte) o immersive. Consulta Dissenys. |
|
requires |
Qualsevol de webgl, webgl2, webgpu. En un dispositiu que no en tingui algun, l'entorn no es pot triar. |
|
i18n |
name i description per codi d'idioma: { "es": { "description": "…" } }. |
La classe de l'entorn
L'exportació per defecte del mòdul d'entrada és una classe. Rainy en crea una instància quan l'entorn surt a escena. Només els quatre primers mètodes són obligatoris.
| Mètode | Quan |
|---|---|
mount(ctx) |
Una vegada, per construir-ho tot. Pot retornar una promesa. |
update(S) |
A cada fotograma, primer: llegir l'espectacle, llançar efectes, moure les lletres. |
render(S) |
A cada fotograma, després: dibuixar. |
unmount() |
Una vegada, per alliberar el que la pàgina no pot alliberar per tu: contextos WebGL, workers, temporitzadors. |
resize(cssW, cssH, { tier, lowPower, scale }) |
A cada fotograma, abans d'update. Surt de seguida quan no hagi canviat res. Dibuixa a cssW × scale per cssH × scale. tier és 0 (complet), 1 o 2 (el més lleuger). |
setScore(score) |
Ha arribat la partitura de la cançó, o ha desaparegut (null). |
setTrack(track) |
{ id, title, artist, cover } de la cançó a escena, o null. cover és l'adreça d'una imatge o null. |
onTrackChange() |
Ha començat una altra cançó. |
leave() |
Un altre entorn pren el relleu. La teva capa ja s'està esvaint. |
dropLyrics() |
Retira les lletres d'escena ara. |
Quan un entorn falla
Rainy retira l'entorn de l'escenari, treu tot el que havia afegit i continua a Clàssic quan:
updateorenderllancen una excepció tres fotogrames seguits,- qualsevol altre mètode llança una excepció,
- carregar i muntar triguen més de deu segons, o
- l'entorn crida
ctx.fail(error).
Continua retirat en aquell dispositiu fins que es recarregui la pàgina o s'actualitzi el paquet. L'error queda registrat a la consola del navegador.
ctx
El que rep mount.
ctx.root |
La teva pròpia capa sobre l'escenari: un element buit que l'ocupa sencer. Els canvas i el DOM van aquí. Rainy la fa aparèixer després de mount, l'esvaeix quan te'n vas i l'elimina. Ignora el punter tret que posis pointer-events en alguna cosa del seu interior. |
ctx.lyrics |
La línia de temps de les lletres, que també arriba a cada fotograma com a S.lyrics. |
ctx.asset(path) |
L'adreça d'un fitxer del teu paquet. Les importacions relatives i url() als teus fulls d'estil també funcionen com sempre. |
ctx.ui.safeArea() |
{ top, right, bottom, left }, cadascun de 0 a 1: quina part d'aquell costat de l'escenari cobreix el reproductor ara mateix. |
ctx.ui.addButton({ icon, title, onClick, pressed }) |
Un botó propi a la barra de l'espectacle. icon és marcatge SVG, de 14 píxels. Retorna { el, setPressed(on), remove() }. |
ctx.ui.toast(message) |
Un avís breu. |
ctx.ui.fontFamily |
El tipus de lletra de la interfície, per al text que dibuixis tu. |
ctx.locale |
Idioma de la interfície: en, ca, es o pl. |
ctx.id, ctx.manifest |
El teu id i el teu manifest. |
ctx.api |
La versió de l'API d'aquest Rainy. |
ctx.fail(error) |
No pots continuar. Rainy torna a Clàssic. |
@rainy/lightshow
L'únic mòdul de Rainy que importa un paquet.
| Exportació | |
|---|---|
API_VERSION |
1. |
TAU, clamp(v, a, b), lerp(a, b, t), smooth(t) |
Matemàtiques. smooth és un smoothstep de 0 a 1. |
hsl(h, s, l), mixHue(a, b, t), mixRgb(a, b, t), toWhite(c, t) |
Color. Un color és [r, g, b], cadascun de 0 a 255. |
rgba(c, alpha) |
Un color com a cadena CSS. |
paletteFor({ accentHue, key, mode, label, genre, swap }) |
La paleta d'una secció, tal com la calcula el director. Per a quan et calen els colors d'una secció abans que soni. |
stepEase(beat), altBeat(beat) |
Moviment fixat al pols: un valor que avança un pas a cada pols amb un lliscament breu, i un altre que oscil·la d'un costat a l'altre en polsos alterns. |
hash(n) |
Un nombre pseudoaleatori repetible de 0 a 1. |
floorIndex(sortedArray, t) |
Índex de l'últim element que és com a màxim t, o -1. Per als arrays de temps de la partitura. |
LEAD, HOLD_MAX, REST_AFTER, HELD |
Els temps de les lletres que comparteixen tots els entorns, en segons. |
pickTransition(F, lineIndex, last) |
Quin dels sis relleus rep una línia de lletra: slam, fall, flicker, sweep, collapse o lift. Segueix la música i no es repeteix mai dues vegades seguides. |
MIN_FLASH_GAP, PHRASE_BARS |
Els límits del director: segons entre flaixos complets, i compassos d'una frase. |
S: l'espectacle
Arriba a update i a render a cada fotograma.
S.F |
El fotograma musical. Consulta més avall. |
S.t |
El temps de la cançó en segons, suavitzat i desplaçat pel desfasament de sincronització de l'usuari. |
S.now, S.dt |
Rellotge real i durada del fotograma, en segons. Per a tot allò que no és música. |
S.running |
La cançó està sonant. Llança els efectes puntuals només quan soni. |
S.I |
Intensitat, de 0,3 a 1. |
S.pulse |
{ k, s, h }: envolupants de bombo, caixa i xarles, de 0 a 1. |
S.phrase |
Quina frase de vuit compassos de la secció és aquesta, des de 0. |
S.palette |
{ a, b, c, w, deep }: primari, secundari, terciari, blanc tenyit i ambient. |
S.accentHue |
To del color d'accent de l'usuari, de 0 a 360. |
S.dim |
Atenuador general, de 0 a 1. Multiplica la teva llum per ell. |
S.flash(amount, color) |
Demana un flaix, de 0 a 1. Limitat a tres flaixos complets per segon, i suavitzat amb Redueix els flaixos. |
S.blind(amount) |
Demana un encegador: un bany de blanc més lent. |
S.burst(amount) |
Demana una ràfega: un reforç que s'extingeix en aproximadament mig segon. |
S.flashAmt, S.flashColor |
El que cal dibuixar dels flaixos en aquest fotograma. |
S.blinderAmt, S.burstAmt |
El que cal dibuixar de l'encegador i de la ràfega. |
S.prefs |
La configuració de l'usuari: reduceFlashing, disableLasers, showBgBlur, lowPower (booleans) i intensity (auto, chill, balanced o hype). |
S.lyrics, S.lyricsOn |
La línia de temps de les lletres, i si les lletres són a escena ara mateix. |
S.songId |
Id de la cançó a escena. |
F: la música
S.F, el fotograma musical.
Amb partitura, F.scripted és true i tot és exacte. Mentre una cançó encara s'analitza, Rainy estima els mateixos camps a partir de l'àudio: no hi ha anticipació (nextIn i dropIn valen Infinity), i section és una suposició.
F.t |
El temps de la cançó en segons. |
F.bands |
{ sub, bass, mid, high, air, rms, harm }, cadascun de 0 a 1: energia per banda, volum, i com de tonal és el so. |
F.hits |
{ k, s, h }: força d'un bombo, una caixa o un xarles que ha caigut en aquest fotograma; si no, 0. |
F.beat, F.bar |
Números de pols i de compàs, amb decimals. |
F.beatPhase, F.barPhase |
Posició dins del pols i del compàs, de 0 a 1. |
F.beatInBar |
De 0 a 3. |
F.period |
Segons per pols. |
F.newBeat, F.newBar |
En aquest fotograma ha començat un pols o un compàs. |
F.section |
{ idx, label, t0, t1, key, mode, energy, density }. label és intro, verse, build, chorus, drop, breakdown o outro. |
F.sectionProgress, F.sectionBar |
De 0 a 1 al llarg de la secció, i compassos des que ha començat. |
F.nextSection, F.nextIn |
La secció que segueix, i segons fins a ella. |
F.dropIn |
Segons fins al proper drop. |
F.buildProgress |
De 0 a 1 al llarg d'una pujada. |
F.stopDepth, F.stopIn |
Quant s'ha entrat en un silenci, de 0 a 1, i segons fins al següent. |
F.events |
El que ha passat en aquest fotograma: { type, t }, amb type igual a drop, impact, stop o riser. |
F.profile |
{ genre, intensity }. genre és edm, pop, rock, hiphop, latin, chill o orchestral. |
F.tempoConf |
Com de segur està l'analitzador del tempo, de 0 a 1. |
F.jumped |
L'usuari ha saltat a un altre punt, o ha canviat la pista. Canvia de cop, no llisquis. |
F.running |
La cançó està sonant. |
La partitura
El que rep setScore: la cançó sencera de cop.
score.duration |
Segons. |
score.tempo, score.period |
Polsos per minut, i segons per pols. |
score.beats, score.downbeats |
Temps en segons, ordenats. |
score.onsets.k, .s, .h |
Bombos, caixes i xarles: { t, s }, dos arrays de la mateixa llargada amb el temps i la força. |
score.env, score.fps |
score.env[band] conté un byte per fotograma, de 0 a 255, per a cada banda de F.bands, a score.fps fotogrames per segon. |
score.envAt(band, t) |
El valor d'una banda en un instant, de 0 a 1. |
score.sections, score.sectionAt(t) |
Les seccions, com F.section. |
score.events, score.nextEvent(type, t, horizon) |
Els esdeveniments, com F.events, i el següent d'un tipus dins de horizon segons. |
score.beatAt(t), score.barAt(t) |
Números de pols i de compàs en un instant. |
score.stopDepth(t) |
Quant s'ha entrat en un silenci en un instant. |
score.profile |
Com F.profile. |
Les lletres
S.lyrics, la línia de temps de les lletres. Val la pena llegir-la quan S.lyricsOn és cert.
lyrics.ready |
La cançó té lletres sincronitzades. |
lyrics.lines |
{ t0, t1, on, end, blank, words }. La línia surt a escena a on, i la seva última paraula acaba a end. blank marca una línia instrumental. |
words |
{ text, s, e }: una paraula, amb el seu inici i el seu final. |
lyrics.adlibs |
Els cors, separats de les línies: { s, e, k, words }. k és un número correlatiu, útil per alternar costats. |
lyrics.aligned |
Els temps per paraula són exactes. Si no, s'estimen a partir de la llargada de la línia. |
lyrics.lineIndex(t) |
La línia a escena en un instant, o -1. |
lyrics.resting(t, index) |
Ningú no està cantant aquella línia ara mateix. |
lyrics.breakAt(t, index) |
{ a, b } quan hi ha una pausa instrumental en curs; si no, null. |
lyrics.version |
Canvia cada vegada que se substitueixen les línies: una cançó nova, o l'arribada dels temps exactes. |
Dissenys
layout al manifest indica com s'organitza el reproductor al voltant de la teva capa.
stage |
El reproductor tal com és, amb la seva caràtula, els seus controls i la seva cua. L'espectacle va al darrere. |
immersive |
L'espectacle és tota la imatge. La cua es plega i un botó de la barra la recupera per sobre de l'espectacle, la cançó i els seus controls passen a ser una targeta petita a la part inferior, i tot plegat s'atenua mentre el punter està quiet. |
Donar estil al reproductor
Un entorn canvia l'estil del reproductor a pantalla completa amb els fulls d'estil que enumera a styles. Rainy els carrega quan l'entorn surt a escena i els retira quan se'n va.
Mentre el teu entorn és a escena, el reproductor té la classe ls-env-<id>. Comença totes les regles amb ella:
#fullscreen-player.ls-env-my-show .fs-progress-fill {
background-color: rgb(var(--ls-a));
}
Classes d'estat
A #fullscreen-player:
| Classe | |
|---|---|
lightshow-on |
L'espectacle està en marxa. |
ls-env-<id> |
Aquell entorn és a escena. |
ls-immersive |
El disseny és immersiu. |
ls-idle |
Només en immersiu: el punter està quiet i el reproductor està atenuat. |
ls-queue-peek |
Només en immersiu: l'usuari ha obert la cua per sobre de l'espectacle. |
ls-lowpower |
El Mode de baix rendiment està activat. Treu els teus filtres i ombres. |
mode-modern, mode-standard |
El mode de pantalla completa que ha triat l'usuari. El modern té els seus propis controls. L'estàndard manté la barra del reproductor de l'aplicació a la part inferior, de manera que .fs-player-controls i el botó de volum estan amagats. |
layout-swapped |
La caràtula és a l'esquerra i la cua a la dreta, que és el valor per defecte. Sense ella estan al revés. |
Parts
| Selector | |
|---|---|
.fs-backdrop |
La caràtula desenfocada que hi ha darrere de tot. |
.ls-env-root |
La teva capa. |
.fs-brand |
La marca de Rainy, a dalt a l'esquerra. |
#fs-volume-btn, #fs-lightshow-btn, #fs-close-btn |
Els botons de la part superior. |
.ls-hud, .ls-hud-btn |
La barra de l'espectacle, amb el tempo i el gènere, i els seus botons, inclosos els teus. |
.fs-content |
La caixa que conté la cançó i la cua. |
.fs-current-info |
La cançó: caràtula, títol, artista i controls. En un disseny immersiu és la targeta. |
.fs-artwork-container |
La caràtula de l'àlbum. |
.fs-title, .fs-artist |
El títol i l'artista de la cançó. |
.fs-player-controls |
La barra de progrés i els botons. |
.fs-progress-container, .fs-progress-bar, .fs-progress-fill, .fs-time |
La barra de progrés, la seva part plena i els dos temps. |
.fs-buttons, .fs-control-btn, .fs-control-btn.play-pause |
Els botons de reproducció. |
.fs-queue-container |
El panell amb la cua i les lletres. |
Tot el que no és en aquesta taula és intern i pot canviar sense avís.
Variables
| Variable | |
|---|---|
--ls-a, --ls-b, --ls-c |
El color primari, secundari i terciari de la secció que està sonant, cadascun com a r g b. Els mateixos colors que S.palette. |
--ls-w |
El blanc tenyit, com a r g b. |
--ls-deep |
El color fosc d'ambient, com a r g b. |
--accent-primary |
El color d'accent de l'usuari. |
--text-primary, --text-secondary, --text-tertiary |
Els colors de text de Rainy. |
--bg-primary, --bg-secondary, --bg-tertiary, --bg-elevated |
Els colors de superfície de Rainy. |
--border-subtle |
El color de vora de Rainy. |
--radius-sm, --radius-md, --radius-lg, --radius-full |
Radis de cantonada. |
--spacing-xs, --spacing-sm, --spacing-md, --spacing-lg, --spacing-xl |
Passos d'espaiat. |
--font-family |
El tipus de lletra de la interfície. |
Fes servir una variable de la paleta com a rgb(var(--ls-a)) o, amb transparència, rgb(var(--ls-a) / 0.5). Les variables de la paleta existeixen mentre l'espectacle està en marxa, i llisquen dels colors d'una secció als de la següent.
Límits
- Limita't al reproductor a pantalla completa. Les teves regles no han d'afectar res fora de
#fullscreen-player.ls-env-<id>. - No amaguis ni tapis
#fs-close-btnni#fs-lightshow-btn, i mantén utilitzables els controls de reproducció. - El CSS rep la paleta, no el pols. Dibuixa a la teva capa tot el que es mogui amb la música.
Eines
RAINY_DEV=1 RAINY_ENVIRONMENTS_DEV=<carpeta> |
Serveix paquets sense empaquetar des d'una carpeta, sense memòria cau. Cadascun apareix com un entorn amb l'etiqueta Desenvolupament, i ocupa el lloc del paquet instal·lat amb el mateix id. |
python scripts/pack_environment.py <carpeta> [-o <sortida>] |
Comprova una carpeta com un servidor comprova una pujada i escriu <id>-<version>.zip, a dist per defecte. Els mateixos fitxers donen sempre el mateix zip. |
node --import ./tests/js/sdk-hook.mjs --test <fitxers> |
Executa els tests propis d'un paquet a Node, amb @rainy/lightshow resolt com el resol el navegador. |