Produza o seguinte trecho da Canon de Pachelbel em D como áudio:
Regras
- Qualquer formato / codificação pode ser usado, desde que exista um codec antes da criação deste desafio
- Qualquer instrumento (um instrumento real, síntese MIDI, etc.) pode ser usado
- O tempo deve ser de 65 BPM (como indicado na partitura) - se você não conseguir exatamente 65 BPM, poderá usar qualquer tempo dentro do intervalo (inclusive) de 64,75 - 65,25
- As partituras estão em sintonia
- É necessário usar o ajuste de temperamento igual (especificamente 12-ET com A4 = 440 Hz)
Para referência, aqui está um snippet de pilha que reproduzirá o trecho:
Respostas:
JavaScript (ES7),
249242241 bytesObrigado a @Neil e @PatrickRoberts pela economia de bytes!
Explicação
A notação é compactada na sequência em que cada caractere é uma nota única como um dígito de base 36. Os valores das notas são determinados pela fórmula
(19 - pitch) * time + 1
ondepitch
é o número de semitons menor que A5 etime
é1
para um semiquaver ou20
para um quaver. O0
no final interrompe ofor
loop.O tempo é
65.22bpmEdit: exatamente 65bpm agora, por mais 2 bytes .Esta explicação / demonstração usa em
Math.pow
vez de**
compatibilidade com o navegador. Também define o ganho dos osciladores para.3
que o acorde final não faça seus ouvidos sangrarem (o ganho padrão é1
).Você pode pressionar o botão acima para testá-lo em qualquer navegador que suporte a API de áudio da Web HTML5 .
fonte
880*2**(-~-n%20/12)
você deve economizar alguns bytes.-~-
também, alterando o formato da embalagem de minhas anotações (+ 1
a fórmula está lá apenas porque preciso0
interromper ofor
ciclo e fiquei com preguiça de pensar muito sobre isso antes de postar).c=new AudioContext;
comwith(new AudioContext)
e remover as duas ocorrências dec.
no programa.<<
, o converteria em um número inteiro.Mathematica,
212152139 139135 bytesProduz um
Sound
objeto que reproduz a Canon de Pachelbel em D quando o botão Play é pressionado. O instrumento é o instrumento MIDI # 41 "Violin".O áudio
Clique em mim!
Explicação
Encontre os números das letras de cada caractere na sequência ("a" -> 1, "b" -> 2 e assim por diante), agrupada com a
List
. (Essa string representa o Canon de Pachelbel em D)Defina
s
para aSoundNote
função cujo instrumento é # 41. Defina a duração como 1 e mapeie essa função para cada elemento noList
(criandoSoundNote
objetos primitivos).Faça a última tríade. (A duração
16
existe para tornar a última nota 16 vezes mais longa - uma nota inteira é dezesseis vezes uma décima sexta nota.)Faça um
Sound
objeto com18.5
alguns segundos de duração (porque o tempo é de 65 bpm [5 compassos de 4/4 com tempo de 65 bpm = aproximadamente 18,5 segundos]).Versão de 126 bytes, não concorrente
Não concorrente porque a saída contém duas semicolcheias em vez de uma colcheia e a separação é bastante perceptível.
fonte
Chiclete , 203 bytes
Experimente online!
Este é um hexdump (reverso com
xxd -r
) do código fonte. O arquivo MIDI produzido é o seguinte (também um hexdump):fonte
BBC BASIC, 141 caracteres ASCII (65.217BPM)
Revisado para acomodar o limite de andamento. Atualizará a explicação mais tarde.
BBC BASIC, 123 caracteres ASCII (não-concorrentes como 60BPM)
Faça o download do intérprete em http://www.bbcbasic.co.uk/bbcwin/download.html
Reproduz a música diretamente quando é executada.
Ungolfed
Explicação
j
é uma bandeira indicando se estamos nas primeiras 4 barras ou no acorde final. TRUE está-1
no BBC BASIC.A
SOUND
declaração usa 4 parâmetros:CANAL: para as 4 primeiras barras, este é o canal 1. Para as 3 notas do acorde na 5ª barra, os números dos canais são 201, 202 e 203 hexadecimais (513.514 e 515 decimais.) Isso significa tocar nos canais 1,2 e 3, o significado 2 inicial toca simultaneamente com 2 notas em outros canais (ou seja, toca um acorde de 3 notas).
VOLUME: Dado como um valor negativo, porque valores positivos representam outros efeitos (envelopes sonoros.). Defina -9 (subirá para -15, mais alto.)
PASSO: Para esta música, varia de D4 = 108 a A5 = 184. Cada passo inteiro é 1/4 de um semitom. Os valores são armazenados como códigos ASCII no intervalo de 54 a 92 e dobrados para gerar novamente o valor correto. As notas 1/8 são armazenadas como notas 1/16 duplicadas. O acorde final é armazenado em 3 arremessos separados e o comprimento da nota varia para a nota inteira, como abaixo.
DURAÇÃO: em 1/20 de segundo. A duração da 1/16 da nota é 5/20 de segundo, portanto 60 1/4 da nota por minuto (a resolução é insuficiente para tornar o andamento mais preciso.) A nota inteira é 5 - (- 75) = 80 unidades (4 segundos ) grandes.
fonte
Anterior, 242 bytes
A música é gravada em stdout no formato de um arquivo MIDI. Você precisará redirecionar essa saída para um arquivo .mid para reproduzir o trecho.
Experimente online! , embora eu ache que atualmente não é possível salvar a saída de forma a manter a integridade binária dos dados.
Explicação
A primeira linha é essencial apenas para um cabeçalho MIDI codificado, que é produzido no início da linha dois. O restante da linha dois codifica a sequência de notas como seus valores MIDI, que são convenientemente ASCII. A terceira linha grava os comandos MIDI para tocar essas notas, com a duração sendo calculada automaticamente (cada nota é um semiquaver, a menos que i% 14 == 0). O acorde final é tratado como um caso especial nas linhas quatro e cinco (já que isso exige que várias teclas sejam pressionadas simultaneamente), e a sexta linha escreve o marcador final final da faixa MIDI.
fonte
C,
248 228 210 198 193191 bytesIsso produz uma sequência de amostras não assinadas de 8 bits destinadas a serem reproduzidas a 8000 amostras por segundo. Se você tiver uma configuração mais antiga do UNIX / Linux, poderá redirecionar a saída para
/dev/audio
. Em algumas distribuições Linux mais recentes, pode ser necessário canalizar a saída para o player de linha de comando ALSAaplay
fonte
SmileBASIC, 115 bytes
Usar um bom instrumento valia 4 bytes extras :)
fonte
JavaScript (ES6) usando WAV.js , 325 bytes
fonte