Tocando notas musicais

Uma vez escolhido um instrumento (use_synth :piano, por ememplo), podem-se tocar, com o comando play notas musicais, representadas por letras ou números.

Notação por letras
As letras :C, :D, :E, :F, :G, :A, :B correspendem às notas musicais Dó, Ré, Mi, Fá, Sol, Lá e Sí.
As notas sustenidas são representadas com a letra s (:Cs4).
As notas bemol são representadas com a letra b (:Cb4).

Ao representar as notas como letras (:C,:D,:E,:F,:G,:A,:B), podemos especificar a oitava da nota:
:C é igual a :C4
:C3 é uma oitava abaixo (mais grave) do que :C4
:C5 é uma oitava acima (mais aguda) do que :C4

use_synth :piano
# as três próximas linhas produzem o mesmo som
#             Dó, Ré, Mí, Fá, Sol, Lá, Sí
play_pattern [:C, :D, :E, :F, :G, :A, :B ]
play_pattern [:C4,:D4,:E4,:F4,:G4,:A4,:B4]
play_pattern [60,  62, 64, 65, 67, 69, 71]

Notação por números
Podemos tocar as notas pelo mapeamento de teclado no padrão MIDI. Nesse padrão, 12 números correspondem à uma oitava.


Algumas opções do comando play
amp: define o volume da nota tocada
amp_slide: duração (medido em beats - batidas) da mudança de volume
pan: posição no campo estéreo - esquerda/direita (-1 a 1)
pan_slide: duração (em beats) da mudança de pan (0 a 1)
attack: duração (em beats) do início da nota
sustain: duração (em beats) da nota em seu volume total
release: duração (em beats) do final da nota


Ficando criativo com os números:

Que tal perguntármos ao computador o horário atual (somente os segundos) e usarmos este número para tocar notas? - É simples. Após descobrirmos este número (que vai de 0 a 60 e depois reinicia) somaremos a ele o número 40. Assim tocaremos as notas de 40 a 100. Se não somássemos 40, tocaríamos notas muito graves (algumas inaudíveis), de 0 a 60.

use_bpm 60
use_synth :fm
128.times do
  t = Time.new
  puts t.sec, ' -> ', t.sec + 40 #lista notas escolhida
  play t.sec + 40, amp: 2.2
  sleep 1
end

Uma variação do código acima, com o ponteiro do segundo modificando também parâmetros do sintetizador.

use_bpm 120
use_synth :fm
with_fx :normaliser, mix: 0.5 do
  128.times do 
    t = Time.new
    y = ((t.sec+1)/61.0) #gera fração de 0.0 a 1.0
    puts t.sec, ' -> ', t.sec + 40 #lista notas escolhida
    play t.sec + 40, amp: 1.6, divisor: 2.0 * y, depth: 32.0 * y
    sleep 0.5
  end
end