Guia da linguagem
O código Untzel é uma linguagem pequena e fechada, feita para música. Ela é analisada, nunca executada: não tem funções, variáveis, laços nem importações, então o mesmo texto toca sempre a mesma música, no app e onde mais for aberto. Palavras-chave, nomes de instrumento, parâmetros e códigos de erro são em inglês; o app mostra cada mensagem de erro no idioma dele.
Todo exemplo desta página toca como está. Copie, cole no painel Code e mude.
A estrutura de um texto
Um texto tem quatro partes, nesta ordem, e todas são opcionais:
- globais:
title,tempo,key,swingeloop; - faixas, uma por linha;
- seções, com
section; - no máximo um
song.
Linha vazia é ignorada, e // começa um comentário que vai até o fim da linha.
// globals first, then tracks, then sections, then the songtempo 124key a minorswing 0.08kick: kick x... x... x... x...hat: hat ..x. ..x. ..x. ..x.bass: bass a1 . . a1 . . c2 .section intro kick hatsection main kick hat basssong intro 8, main 16 | loopSem song, toda faixa que não tem mute toca em loop.
Tempo, tom, swing e loop
tempo define as batidas por minuto, de 40 a 300; sem ele o texto toca a 132. Um valor fora da faixa é erro, nunca um ajuste silencioso.
key recebe uma tônica, de a a g com b ou # opcional, e uma escala: minor, major, dorian, phrygian ou chromatic. Sem ele o tom é c minor.
swing atrasa as colcheias pares, de 0 até 0,5. Cada global aparece uma vez só.
tempo 126key d dorianswing 0.12hat: hat x.x. x.x. x.x. x.x.bass: bass d2 . f2 . a2 . c3 .Comprimento do loop
loop define quantos compassos dura uma passada do modo Loop, um número inteiro de 1 a 16. Em cada passada todos os padrões e sinais recomeçam do compasso 1: um padrão de 2 compassos toca 4 vezes num loop 8, e um padrão mais longo que o loop toca só os primeiros compassos. Sem loop, cada padrão se repete no próprio tamanho, como antes.
// 8 bars per pass: the 2-bar bass plays 4 times and the cutoff rises across the passtempo 124key c minorloop 8kick: kick x... x... x... x...hat: hat ..x. ..x. ..x. ..x.bass: bass . c2 . c2 . c2 . eb2 / . ab1 . ab1 . c2 . g1 | cutoff saw(8) 300..2400Um comprimento novo entra no próximo compasso e a música nunca para. O modo Song ignora loop: ali mandam as seções e a linha song. loop continua sendo nome de faixa válido e a palavra do fim de song … | loop. O chip Length do transporte escreve essa linha por você (Usar o app).
Título da música
title "Midnight Coast" dá nome à música: até 60 caracteres entre aspas duplas, onde \" escreve uma aspa e \\ uma barra invertida. Ele nunca muda o som. O app mostra o título na barra de cima e na aba do navegador, e ele vai para os nomes dos arquivos, para o vídeo exportado e para o link compartilhado. Renomear a música no app escreve essa linha (Usar o app). Título vazio ou com mais de 60 caracteres é aviso, não erro: a música continua tocando, sem título ou com os 60 primeiros caracteres. Uma segunda linha title é erro, como um segundo tempo. title continua sendo nome de faixa válido.
// the title names the song; it never changes the soundtitle "Midnight Coast"tempo 122key f minorkick: kick x... x... x... x...keys: piano Fm7 ~ ~ ~ / Dbmaj7 ~ ~ ~Faixas com nome
Uma linha de faixa tem um nome opcional seguido de dois-pontos, um instrumento, um padrão e modificadores depois de |. O nome é como seções, blocos e mensagens se referem à faixa. Nomes são minúsculos, começam por letra e têm no máximo 24 caracteres.
Duas faixas podem usar o mesmo instrumento com padrões e sons diferentes: cada faixa é uma instância independente. Uma faixa sem nome recebe o nome do instrumento, ou o próximo número livre.
// two bass tracks: two independent instancessub: bass c1 . . . c1 . . . | cutoff 160bass: bass . . c2 . . . eb2 . | cutoff 900 | pan 0.2// without a name, a track takes the instrument's: hat, then hat2hat ..x. ..x. ..x. ..x.hat x.x. x.x. x.x. x.x. | gain 0.4A ordem das linhas é a ordem das faixas na tela.
Padrões: a mini-notação
Um padrão descreve um compasso; / separa os compassos de um padrão mais longo, que se repete quando acaba. Os passos de um compasso dividem o tempo por igual.
| Escreva | Quer dizer |
|---|---|
x X . | uma batida, uma batida acentuada, uma pausa. Numa sequência como x... cada caractere é um passo |
~ | prolonga o passo anterior por mais um passo: x~~~ segura uma batida por quatro passos |
c2 eb2 f#1 | uma nota com a oitava, para instrumentos que tocam notas |
[x x] | um grupo: subdivide um passo |
x? x?0.3 | toca com uma chance; sem número a chance é 0,5 |
x*4 [c2 g1]*2 | repete dentro do mesmo passo |
/ | o próximo compasso do padrão |
kick: kick X... x... X... x...clap: hat .... x~.. .... x~.. | open 0.4roll: hat x x [x x] x*2 | decay 0.03ghost: hat x?0.3 x? x? x? | gain 0.5fill: kick x... x... x... x... / x... x... x.x. xxxxContar passos
Espaços separam elementos, mas numa sequência de batidas cada caractere já é um passo, então x... x... e x...x... são os mesmos oito passos. x... x... x... x... é um compasso de 16 passos, cada um uma semicolcheia; c2 . eb2 c3 . c2 g1 . tem 8 passos, cada um uma colcheia. Um compasso tem no máximo 64 passos e grupos se aninham no máximo 4 níveis.
Notas e acordes
Instrumentos que tocam notas recebem nomes de nota em minúscula com a oitava: c1, eb2, f#1. Um . é pausa e ~ segura a nota.
key c minorsub: bass c1 ~ . c1 ~ . c1 . | cutoff 180line: bass c2 eb2 g2 bb2 c3 . g2 . | cutoff 1200 | decay 0.2Notas ligadas por + soam juntas num passo, como um acorde que você mesmo abre: c3+eb3+g3. Um ! depois de uma batida ou de uma nota a acentua, como o X na bateria.
key c minorkeys: piano c3+eb3+g3 ~ ~ . bb2+d3+f3 ~ . . | reverb widekick: kick x . . . x . . . x . . . x! . x .lead: lead c4! . eb4 . g4 . bb4! . | cutoff 2000Nomes de acorde começam com maiúscula, como Cm7, Abmaj7 ou Gsus4, e precisam de um instrumento do tipo chord. Escrever um acorde para um instrumento que toca notas é o erro PATTERN_KIND_MISMATCH (referência).
Disponível agora Acordes. Nomes de acorde como Cm7 precisam de um instrumento do tipo chord.
A trava de tom
Com key, toda nota fora da escala vai para o grau mais próximo dela, então nota errada é impossível. | free desliga a trava numa faixa, e key c chromatic desliga no texto inteiro.
key c minor// in c minor, e2 plays eb2 and b2 plays bb2locked: bass c2 e2 g2 b2// free plays every note as writtenloose: bass c2 e2 g2 b2 | freeModificadores
Modificadores vêm depois do padrão, cada um depois de um |, e são lidos da esquerda para a direita. Se o mesmo modificador aparece duas vezes, vale o último, e o anterior recebe o aviso DUPLICATE_MODIFIER; aviso nunca para a música.
Há modificadores gerais que toda faixa aceita (gain, pan, tone, reverb, delay, duck, transpose, swing, shift, mute, free) e os parâmetros de cada instrumento, como cutoff no bass ou open no hat. A tabela completa com cada faixa está na referência, e cada parâmetro de instrumento está na página Instrumentos.
kick: kick x... x... x... x... | drive 0.4bass: bass c2 . c2 . c2 . eb2 . | duck 0.7 | tone 0.6echo: bass . . g2 . . . c3 . | delay 3/16 | reverb sea | gain 0.5 | pan -0.4up: bass c2 . . . c2 . . . | transpose 12 | shift 2 | muteQuando tone e um parâmetro que ele move aparecem juntos, vence o parâmetro escrito.
Sinais
Todo parâmetro numérico que permite pode receber uma onda lenta no lugar de um número: uma forma, um período em compassos e uma faixa. A faixa é obrigatória e fica dentro dos limites do parâmetro; o período é de no máximo 256 compassos.
| Forma | Move |
|---|---|
sine(8) | sobe e desce suave |
tri(4) | sobe e desce em linha reta |
saw(4) | sobe e recomeça |
square(2) | alterna entre os dois extremos |
rand(1) | vai para um valor novo a cada período, o mesmo em toda execução |
bass: bass c2 . c2 . c2 . eb2 . | cutoff sine(8) 300..2400hat: hat x.x. x.x. x.x. x.x. | open tri(4) 0..0.8 | pan rand(1) -0.5..0.5rise: hat x x x x x x x x | gain saw(4) 0.1..0.8gate: hat x*4 x*4 x*4 x*4 | gain square(2) 0.2..0.6Numa música, o sinal recomeça no início de cada seção, então saw(4) numa seção de 4 compassos sobe exatamente do começo ao fim dela (Receitas).
Seções e a música
section dá nome a um conjunto de faixas que tocam juntas; uma faixa pode estar em quantas seções quiser. Uma seção pode mudar o tempo a partir do seu início e o gain de todas as suas faixas. song toca as seções em ordem, cada uma por um número de compassos, de 1 a 256; a mesma seção pode voltar.
tempo 124key a minorkick: kick x... x... x... x...hat: hat ..x. ..x. ..x. ..x.sub: bass a1 . . a1 . . a1 . | cutoff 180bass: bass . a2 . a2 . c3 . e2 | cutoff saw(4) 300..1800section intro kick hatsection build kick hat sub bass | gain 0.8section drop kick hat sub bass | tempo 126song intro 8, build 4, drop 16, intro 4Repetir a música
Uma música para quando acaba. Com | loop no fim da linha song, ela recomeça.
kick: kick x... x... x... x...bass: bass c2 . . c2 . . g1 .section a kicksection b kick basssong a 4, b 8 | loopSeções sem música
kick: kick x... x... x... x...hat: hat ..x. ..x. ..x. ..x.// no song: in Song mode each section plays 8 bars, in order, in a cyclesection first kicksection second kick hatModos Loop e Song
O modo não fica escrito no texto: é um seletor do transporte, como tocar e parar. No modo Loop toda faixa sem mute toca sem fim, em passadas de loop <bars> quando o texto tem, e as seções são ignoradas. No modo Song as partes tocam em ordem; com seções e sem song, cada seção toca 8 compassos, em ordem, em ciclo. mute silencia a faixa nos dois modos, mesmo dentro de uma seção. O trecho de execução também não é escrito: escolher quais compassos ou partes repetem muda como você toca, nunca o texto (Usar o app).
Limites
A linguagem não limita faixas, faixas por instrumento, seções nem partes da música; o aparelho limita, e o medidor de CPU mostra quanto está em uso. Os limites fixos protegem o analisador e mantêm o texto legível: um texto tem no máximo 65.536 caracteres, um padrão no máximo 64 compassos. Todos os limites estão na referência.
Determinismo
A chance (?) e o rand são sorteados a partir de uma semente feita do próprio texto, do nome da faixa e do compasso. O mesmo texto toca as mesmas notas toda vez, em qualquer aparelho. Mude um caractere do texto e o sorteio muda; a linha title é a exceção, então renomear uma música nunca muda o que ela toca.
Conteúdo da documentação do Untzel, sob a licença CPAL-1.0. Ler a licença