Transcribe music sheet and play along with your instrument

Hi, with the help of GPTs I came up with this code… With this code, you can easily transcribe sheet music into Sonic Pi by using scale degrees instead of absolute note names. This simplifies the process of adapting melodies, harmonies, and basslines to different keys and octaves. By referencing musical scale degrees (e.g., 1 for tonic, 5 for dominant) and adding optional alterations (sharp, flat, or natural), you can efficiently reproduce melodies and harmonies without worrying about recalculating exact notes for every key change.

Additionally, the code allows you to isolate musical layers. For instance, you can mute the melody, bass, or harmony while keeping other parts active. This is especially useful for play-along practice with your instrument. You can play the melody or solo part yourself while the program provides harmonic and rhythmic accompaniment, turning it into a highly customizable backing track.

By combining layers and adjusting the playback settings, this code is a versatile tool for learning, practicing, and performing music.

AS FOLLOWS:

# Noite Feliz / Silent Night
# Referência: https://youtu.be/isBnNxnvBOE?si=fDrPsa4_OhKMBhGM

# Tempo / Tempo
use_bpm 77 # Silent Night é tocada em andamento lento / Silent Night is played at a slow tempo

# Tonalidade / Key
TONALIDADE = :a # Define a tonalidade da música / Defines the song's key
ESCALA = scale(TONALIDADE, :major) # Gera a escala baseada na tonalidade / Generates the scale based on the key

# Função para calcular graus da escala com oitava
# Function to calculate scale degrees with octave
def grau(n, oitava = 4, alteracao = nil)
  nota_base = ESCALA[n - 1] # Nota no grau da escala / Note in the scale degree
  nota = nota_base + (oitava - 4) * 12 # Ajusta para a oitava desejada / Adjusts to the desired octave
  alterar_nota(nota, alteracao) # Aplica alterações (bemol, sustenido, etc.) / Applies alterations (flat, sharp, etc.)
end

# Função para alterar uma nota (sustenido, bemol ou bequadro)
# Function to alter a note (sharp, flat, or natural)
def alterar_nota(nota, alteracao)
  caso = {
    flat: -1,     # Bemol: abaixa meio tom / Flat: lowers half a step
    sharp: 1,     # Sustenido: sobe meio tom / Sharp: raises half a step
    natural: 0    # Bequadro: retorna a nota natural / Natural: resets the note
  }
  if alteracao == :natural
    nota_original = ESCALA.find { |n| n % 12 == nota % 12 } # Nota natural na mesma oitava / Natural note in the same octave
    return nota_original + (nota / 12).floor * 12 # Garante a oitava correta / Ensures the correct octave
  elsif caso.key?(alteracao)
    return nota + caso[alteracao]
  else
    return nota
  end
end

# Mapeamento de durações nomeadas / Mapping of named durations
DURACOES = {
  semibreve: 4,    # Whole note
  minima: 2,       # Half note
  seminima: 1,     # Quarter note
  colcheia: 0.5,   # Eighth note
  semicolcheia: 0.25, # Sixteenth note
  fusa: 0.125,     # Thirty-second note
  semifusa: 0.0625 # Sixty-fourth note
}

# Função para calcular durações com ponto de aumento
# Function to calculate dotted note durations
def ponto(duracao_nomeada)
  if DURACOES.key?(duracao_nomeada)
    DURACOES[duracao_nomeada] * 1.5
  else
    puts "Duração '#{duracao_nomeada}' não encontrada. Usando 0." # Duration not found. Using 0.
    0
  end
end

# Função para tocar notas ou acordes com respeito ao tempo
# Function to play notes or chords respecting their duration
def tocar_camada(camadas, tipo: :nota)
  camadas.each do |elemento|
    som, duracao_nomeada = elemento
    duracao = duracao_nomeada.is_a?(Numeric) ? duracao_nomeada : DURACOES[duracao_nomeada] || 0
    if som == :pausa
      sleep duracao # Pausa / Rest
    else
      if tipo == :sample
        sample som, amp: 0.8 # Percussão / Percussion
      elsif som.is_a?(Array) # Para acordes / For chords
        play som, amp: 1, release: duracao
      else
        play som, amp: 1, release: duracao
      end
      sleep duracao
    end
  end
end

# Função para construir acordes baseados nos graus e oitavas
# Function to build chords based on scale degrees and octaves
def acorde(grau, oitava, tipo = :major)
  chord(grau(grau, oitava), tipo)
end

# Camadas musicais / Musical layers
# Melodia / Melody
# Harmonia / Harmony
# Baixo / Bass
# Percussão / Percussion

# Noite Feliz: Camadas
melodia = [
  # 1 a 5 é pausa
  # 6 e 30
  [grau(5, 4), ponto(:seminima)], # Noi
  [grau(6, 4), :colcheia], # te
  [grau(5, 4), :seminima], # fe
  # 7 e 31
  [grau(3, 4), ponto(:minima)], # liz
  #8 e 32
  [grau(5, 4), ponto(:seminima)], # noi
  [grau(6, 4), :colcheia], [grau(5, 4), :seminima], # te fe
  #9 e 33
  [grau(3, 4), ponto(:minima)], # liz
  # 10 e 34
  [grau(2, 5), :minima], [grau(2, 5), :seminima], # Ó se
  # 11 e 35
  [grau(7, 4), ponto(:minima)], # nhor
  #12 e 36
  [grau(1, 5), :minima], [grau(1, 5), :seminima], # Deus de a
  #13 e 37
  [grau(5, 4), ponto(:minima)], # mor
  #14 e 38
  [grau(6, 4), :minima], [grau(6, 4), :seminima], # Pobre
  #15 e 39
  [grau(1, 5), ponto(:seminima)], [grau(7, 4), :colcheia], [grau(6, 4), :seminima], # zinho na
  #16 e 40
  [grau(5, 4), ponto(:seminima)], [grau(6, 4), :colcheia], [grau(5, 4), :seminima], # sceu em Be
  #17 e 41
  [grau(3, 4), ponto(:minima)], # lém
  # 18 e 42
  [grau(6, 4), :minima], [grau(6, 4), :seminima], # Eis na
  # 19 e 43
  [grau(1, 5), ponto(:seminima)], [grau(7, 4), :colcheia], [grau(6, 4), :seminima], # lapa Je
  # 20 e 44
  [grau(5, 4), ponto(:seminima)], [grau(6, 4), :colcheia], [grau(5, 4), :seminima], # sus nosso
  # 21 e 45
  [grau(3, 4), ponto(:minima)], # bem
  # 22 e 46
  [grau(2, 5), :minima], [grau(2, 5), :seminima], #Dorme
  #23 e 47
  [grau(4, 5), ponto(:seminima)], [grau(2, 5), :colcheia], [grau(7, 4), :seminima], # em paz ó
  # 24 e 48
  [grau(1, 5), ponto(:minima)], # Je
  # 25 e 49
  [grau(3, 5), ponto(:minima)], # su
  #26 e 50
  [grau(1, 5), :seminima], [grau(5, 4), :seminima], [grau(3, 4), :seminima], # us Dorme
  #27 e 51
  [grau(5, 4), ponto(:seminima)], [grau(4, 4), :colcheia], [grau(2, 4), :seminima], # em paz ó Je
  # 28 e 29 (arco de ligação) e 52 a 53
  [grau(1, 4), ponto(:semibreve)] #sus
]


harmonia_inicio_fim =  [
  # Compassos 1 a 5 e 54 a 57
  [acorde(1, 3), ponto(:minima)], # D3 (Grau 1, oitava 3)
  [acorde(5, 3), ponto(:minima)], # A3
  [acorde(4, 3, :minor), ponto(:minima)], # G3
  [acorde(5, 3), ponto(:minima)], # A3
  [acorde(4, 3), ponto(:minima)], # G3
]

harmonia = [
  # 6 e 30
  [acorde(1, 3), ponto(:minima)], # D3 (Grau 1, oitava 3)
  # 7 e 31
  [acorde(5, 3), ponto(:minima)], # A3
  # 8 e 32
  [acorde(4, 3), ponto(:minima)], # G3
  #9 e 33
  [acorde(3, 3), ponto(:minima)], # liz
  # 10 e 34
  [acorde(2, 4), ponto(:minima)], # Ó se
  # 11 e 35
  [acorde(7, 3), ponto(:minima)], # nhor
  #12 e 36
  [acorde(1, 4), ponto(:minima)], # Deus de a
  #13 e 37
  [acorde(5, 3), ponto(:minima)], # mor
  #14 e 38
  [acorde(6, 3), ponto(:minima)], # Pobre
  #15 e 39
  [acorde(1, 4), ponto(:minima)], # zinho na
  #16 e 40
  [acorde(5, 3), ponto(:minima)], # sceu em Be
  #17 e 41
  [acorde(3, 3), ponto(:minima)],
  # 18 e 42
  [acorde(6, 3), ponto(:minima)],
  # 19 e 43
  [acorde(1, 4), ponto(:minima)],
  # 20 e 44
  [acorde(5, 3), ponto(:minima)],
  # 21 e 45
  [acorde(3, 3), ponto(:minima)],
  # 22 e 46
  [acorde(2, 4), ponto(:minima)],
  #23 e 47
  [acorde(4, 4), ponto(:minima)],
  # 24 e 48
  [acorde(1, 4), ponto(:minima)],
  # 25 e 49
  [acorde(3, 4), ponto(:minima)],
  #26 e 50
  [acorde(1, 4), ponto(:minima)],
  #27 e 51
  [acorde(5, 3), ponto(:minima)],
  # 28 e 29 (arco de ligação) e 52 a 53
  [acorde(1, 3), ponto(:semibreve)]
]

baixo = [
  # 1 a 5 em silêncio
  # 6 e 30
  [grau(1, 2), ponto(:minima)], # D2
  # 7 e 31
  [grau(5, 2), ponto(:minima)], # A2
  # 8 e 32
  [grau(4, 2), ponto(:minima)], # G2
  #9 e 33
  [grau(3, 2), ponto(:minima)], # liz
  # 10 e 34
  [grau(2, 3), ponto(:minima)], # Ó se
  # 11 e 35
  [grau(7, 2), ponto(:minima)], # nhor
  #12 e 36
  [grau(1, 3), ponto(:minima)], # Deus de a
  #13 e 37
  [grau(5, 2), ponto(:minima)], # mor
  #14 e 38
  [grau(6, 2), ponto(:minima)], # Pobre
  #15 e 39
  [grau(1, 3), ponto(:minima)], # zinho na
  #16 e 40
  [grau(5, 2), ponto(:minima)], # sceu em Be
  #17 e 41
  [grau(3, 2), ponto(:minima)],
  # 18 e 42
  [grau(6, 2), ponto(:minima)],
  # 19 e 43
  [grau(1, 3), ponto(:minima)],
  # 20 e 44
  [grau(5, 2), ponto(:minima)],
  # 21 e 45
  [grau(3, 2), ponto(:minima)],
  # 22 e 46
  [grau(2, 3), ponto(:minima)],
  #23 e 47
  [grau(4, 3), ponto(:minima)],
  # 24 e 48
  [grau(1, 3), ponto(:minima)],
  # 25 e 49
  [grau(3, 3), ponto(:minima)],
  #26 e 50
  [grau(1, 3), ponto(:minima)],
  #27 e 51
  [grau(5, 2), ponto(:minima)],
  # 28 e 29 (arco de ligação) e 52 a 53
  [grau(1, 2), ponto(:semibreve)]
]

# Percussão (Padrão 3/4 usando samples)
percussao = [
  #1 compasso
  [:drum_cymbal_closed, :colcheia], [:pausa, :colcheia], [:drum_bass_hard, :colcheia],
  [:pausa, :colcheia], [:drum_snare_hard, :colcheia], [:pausa, :colcheia]
]

# Reproduz a música uma vez
in_thread {tocar_camada(harmonia_inicio_fim, tipo: :nota)
           2.times do
             tocar_camada(harmonia, tipo: :nota)
           end
           tocar_camada(harmonia_inicio_fim.drop(2), tipo: :nota)}
in_thread { sleep 15
            tocar_camada(baixo, tipo: :nota) }
in_thread {
  sleep 15 # Compassos 1 a 5
  46.times do
    tocar_camada(percussao, tipo: :sample)
  end
}
sleep 15 # Compassos 1 a 5
2.times do
  tocar_camada(melodia, tipo: :nota)
end

User Manual for the Code

1. Requirements

  • Install Sonic Pi on your computer.
  • Copy and paste the complete code into a Sonic Pi buffer.

2. Initial Setup

  • Change the key: Adjust the TONALIDADE variable to set the desired key (e.g., :a for A major, :d for D major).
  • Change the tempo (BPM): Modify the use_bpm value to set the playback speed (e.g., 77 for a slow tempo).

3. Modifying the Music

  • Melody, Harmony, and Bass:

    • These are defined in the melodia, harmonia, and baixo arrays.
    • Add or edit notes using the grau(n, oitava, alteracao) function:
      • n: Scale degree (1 for tonic, 5 for dominant, etc.).
      • oitava: Octave of the note (e.g., 4 for middle range, 5 for higher range).
      • alteracao (optional): Use :sharp for sharp, :flat for flat, or :natural to remove accidentals.
  • Percussion Patterns:

    • Modify the percussao array to create new rhythms.
    • Example:
      percussao = [
        [:drum_bass_hard, :colcheia], [:drum_snare_soft, :colcheia], [:pausa, :colcheia],
        [:drum_cymbal_closed, :colcheia], [:pausa, :colcheia], [:drum_bass_hard, :colcheia]
      ]
      

4. Running the Code

  • Press the “Run” button in Sonic Pi to play the song.
  • The program will play Silent Night (Noite Feliz) once, including synchronized melody, harmony, bass, and percussion.

5. Customizing Notes

  • Use the grau function to reference scale degrees instead of absolute note names:
    • Example: grau(1, 4) corresponds to the tonic in the 4th octave (e.g., D4 in D major).
  • Alterations:
    • Add :sharp for sharp notes, :flat for flat notes, or :natural to return to a natural note.

6. Advanced Customization

  • Adding New Layers:

    • Create new layers, e.g., new_layer = [...], and play them using in_thread:
      in_thread { tocar_camada(new_layer, tipo: :nota) }
      
  • Changing Instruments:

    • Adjust the synthesizer or sample used for each layer:
      • Replace :saw with other options like :piano, :pluck, etc., in the play method.
      • For percussion, use Sonic Pi’s built-in drum samples, such as :drum_snare_soft or :drum_tom_hi_soft.

7. Example Adjustments

Change Key to G Major:

TONALIDADE = :g

Faster Tempo:

use_bpm 120

Add Variation to Percussion:

percussao = [
  [:drum_bass_hard, :colcheia], [:drum_snare_hard, :colcheia], [:drum_cymbal_closed, :colcheia],
  [:pausa, :colcheia], [:drum_snare_soft, :colcheia], [:drum_bass_hard, :colcheia]
]

Summary of Functions

  1. grau(n, oitava = 4, alteracao = nil):

    • Converts scale degrees to actual notes.
    • Example: grau(5, 4, :sharp) gives the 5th degree (dominant) with a sharp alteration in the 4th octave.
  2. alterar_nota(nota, alteracao):

    • Alters notes with :sharp, :flat, or :natural.
  3. ponto(duracao_nomeada):

    • Calculates dotted durations.
    • Example: ponto(:minima) returns 3 beats for a dotted half note.
  4. tocar_camada(camadas, tipo: :nota):

    • Plays the specified layer (melodia, harmonia, baixo, or percussao).
  5. acorde(grau, oitava, tipo = :major):

    • Constructs chords based on scale degrees.
    • Example: acorde(1, 3, :minor) gives the tonic chord in minor.

3 Likes

A new transcribed music: Blue Bossa!
Anyone wanting to make it sound more professional? Tips and help are welcome! I’m a newbie with Sonic Pi :slight_smile:

# Blue Bossa: Lyrics by Joan Cartwright, Music by Kenny Dorham
# Reference: Pg. 30 of https://veltzer.github.io/openbook/web/viewer.html?file=../output/openbook.pdf
# Para tocar em Mib como na referência no Sax Alto aqui deve ficar em Fá# (Fs)

# Tempo / Tempo
use_bpm 150 # (referência = 150 / Allegro)

# Tonalidade / Key
TONALIDADE = :fs # tonalidade da música / song's key
ESCALA = scale(TONALIDADE, :major) # escala / scale based on the key

# Função para calcular graus da escala com oitava
# Function to calculate scale degrees with octave
def grau(n, oitava = 4, alteracao = nil)
  nota_base = ESCALA[n - 1] # Nota no grau da escala / Note in the scale degree
  nota = nota_base + (oitava - 4) * 12 # Ajusta para a oitava desejada / Adjusts to the desired octave
  alterar_nota(nota, alteracao) # Aplica alterações (bemol, sustenido, etc.) / Applies alterations (flat, sharp, etc.)
end

# Função para alterar uma nota (sustenido, bemol ou bequadro)
# Function to alter a note (sharp, flat, or natural)
def alterar_nota(nota, alteracao)
  caso = {
    bemol: -1,     # Bemol: abaixa meio tom / Flat: lowers half a step
    sustenido: 1,     # Sustenido: sobe meio tom / Sharp: raises half a step
    bequadro: 0    # Bequadro: retorna a nota natural / Natural: resets the note
  }
  if alteracao == :bequadro
    nota_original = ESCALA.find { |n| n % 12 == nota % 12 } # Nota natural na mesma oitava / Natural note in the same octave
    return nota_original + (nota / 12).floor * 12 # Garante a oitava correta / Ensures the correct octave
  elsif caso.key?(alteracao)
    return nota + caso[alteracao]
  else
    return nota
  end
end

# Mapeamento de durações nomeadas / Mapping of named durations
DURACOES = {
  semibreve: 4,    # Whole note
  minima: 2,       # Half note
  seminima: 1,     # Quarter note
  colcheia: 0.5,   # Eighth note
  semicolcheia: 0.25, # Sixteenth note
  fusa: 0.125,     # Thirty-second note
  semifusa: 0.0625 # Sixty-fourth note
}

# Função para calcular durações com ponto de aumento
# Function to calculate dotted note durations
def ponto(duracao_nomeada)
  if DURACOES.key?(duracao_nomeada)
    DURACOES[duracao_nomeada] * 1.5
  else
    puts "Duração '#{duracao_nomeada}' não encontrada. Usando 0." # Duration not found. Using 0.
    0
  end
end

# Função para tocar notas ou acordes com respeito ao tempo
# Function to play notes or chords respecting their duration
def tocar_camada(camadas, tipo: :nota)
  camadas.each do |elemento|
    som, duracao_nomeada = elemento
    duracao = duracao_nomeada.is_a?(Numeric) ? duracao_nomeada : DURACOES[duracao_nomeada] || 0
    if som == :pausa
      sleep duracao # Pausa / Rest
    else
      if tipo == :sample
        sample som, amp: 0.5 # Percussão / Percussion
      elsif som.is_a?(Array) # Para acordes / For chords
        play som, amp: 1, release: duracao
      else
        play som, amp: 1, release: duracao
      end
      sleep duracao
    end
  end
end

# Função para construir acordes baseados nos graus e oitavas
# Function to build chords based on scale degrees and octaves
def acorde(grau, oitava, tipo = :major)
  chord(grau(grau, oitava), tipo)
end

# Função para transpor notas para instrumento transpositor
def transpor(nota)
  nota + 9 # Transpõe 9 semitons acima _para_sax_alto
end

# Função para exibir letras e notas (com base na melodia existente)
def letra_e_nota(melodia, letras)
  melodia.each_with_index do |(nota, duracao), index|
    letra = letras[index]
    if nota == :pausa
      puts "--- : #{letra}" # Indica pausa
    else
      nota_transposta = transpor(nota)
      nome_nota = note_info(nota_transposta).pitch_class # Converte para nome legível
      puts "#{nome_nota.to_s.ljust(3)} : #{letra}" # Exibe nota transposta e letra
    end
    sleep DURACOES[duracao] || duracao # Respeita o tempo da nota
  end
end

# Camadas musicais / Musical layers
# Compassos 4/4
melodia_1 = [
  # 1 - Anacruse
  [grau(3, 4), :seminima] # A
]

melodia_2_15 = [
  # 2 +
  [grau(3, 5), ponto(:seminima)], # place
  [grau(2, 5), :colcheia], # in
  [grau(1, 5), :colcheia], # side
  [grau(7, 4), :seminima], # my
  [grau(6, 4), 3.5], # heart
  # 3
  [grau(7, 4), :seminima], #is
  # 4 e 5
  [grau(4, 4), :minima], # where
  [grau(3, 5), ponto(:seminima)], #you
  [grau(2, 5), 4.5], # live
  #6 +
  [grau(2, 5), ponto(:seminima)], # Mem
  [grau(1, 5), :colcheia], # ories
  [grau(7, 4), :colcheia], # of
  [grau(6, 4), :seminima], #our
  [grau(5, 4), 3.5], #start
  # 7
  [grau(4, 4), :seminima], # The
  # 8 e 9
  [grau(3, 4), :minima], # love
  [grau(2, 5), ponto(:seminima)], # you
  [grau(1, 5), 4.5], # give
  # 10 +
  [grau(1, 4), ponto(:seminima)], # Days
  [grau(7, 4, :bemol), :colcheia], # when
  [grau(6, 4), :colcheia], # we're
  [grau(5, 4), :seminima], # a
  [grau(4, 4), 3.5], # lone
  # 11
  [grau(3, 4, :bemol), :seminima], # And
  # 12 e 13
  [grau(3, 4, :bemol), :seminima], # you
  [grau(2, 4), :colcheia], # are
  [grau(5, 4), :seminima], # in
  [grau(2, 4), :colcheia], # my
  [grau(4, 4), 5], # arms
  # 14
  [grau(4, 4), :seminima], # The blue
  [grau(3, 4), :colcheia], # ness
  [grau(5, 4), ponto(:minima)], # of
  # 15
  [grau(4, 4), :seminima], # The true
  [grau(3, 4), :colcheia], # ness
  [grau(5, 4), :minima], # of
  [grau(4, 4), :colcheia] # our
]

melodia_16_17 = [
  # 16 +
  [grau(3, 4), 7], # love
  # 17
  [grau(3, 4), :seminima] # The
]

melodia_18_19 = [
  # 18 e 19
  [grau(3, 4), 7],
  [:pausa, :seminima]
]

harmonia_2_15 = [
  # 2
  [acorde(6, 3, :minor7), :semibreve], #
  # 3
  [:pausa, :semibreve], #
  # 4
  [acorde(2, 3, :minor7), :semibreve], #
  # 5
  [:pausa, :semibreve], #
  # 6
  [acorde(7, 3, :minor7), :semibreve], #
  # 7
  [acorde(3, 3, :major7), :semibreve], #
  # 8
  [acorde(6, 3, :minor7), :semibreve], #
  # 9
  [:pausa, :semibreve], #
  # 10
  [acorde(1, 3, :minor7), :semibreve],
  # 11
  [acorde(4, 3, :major7), :semibreve],
  # 12
  [acorde(7, 3), :semibreve],
  # 13
  [:pausa, :semibreve],
  # 14
  [acorde(2, 3, :minor7), :semibreve],
  # 15
  [acorde(3, 3, :major7), :semibreve]
]

harmonia_16_17 = [
  # 16
  [acorde(6, 3, :minor7), :semibreve],
  # 17
  [acorde(2, 3, :minor7), :minima],
  [acorde(3, 3, :major7), :minima]
]

harmonia_18 = [
  # 18
  [acorde(6, 3, :minor7), :semibreve]
]



baixo_2_15 = [
  # 2
  [grau(6, 2, :minor7), :semibreve], #
  # 3
  [:pausa, :semibreve], #
  # 4
  [grau(2, 2, :minor7), :semibreve], #
  # 5
  [:pausa, :semibreve], #
  # 6
  [grau(7, 2, :minor7), :semibreve], #
  # 7
  [grau(3, 2, :major7), :semibreve], #
  # 8
  [grau(6, 2, :minor7), :semibreve], #
  # 9
  [:pausa, :semibreve], #
  # 10
  [grau(1, 2, :minor7), :semibreve],
  # 11
  [grau(4, 2, :major7), :semibreve],
  # 12
  [grau(7, 2), :semibreve],
  # 13
  [:pausa, :semibreve],
  # 14
  [grau(2, 2, :minor7), :semibreve],
  # 15
  [grau(3, 2, :major7), :semibreve]
]

baixo_16_17 = [
  # 16
  [grau(6, 2, :minor7), :semibreve],
  # 17
  [grau(2, 2, :minor7), :minima],
  [grau(3, 2, :major7), :minima]
]

baixo_18 = [
  # 18
  [grau(6, 2, :minor7), :semibreve]
]

# Percussão (Compasso 4/4 usando samples)
percussao = [
  #1 compasso
  [:drum_cymbal_closed, :colcheia], [:pausa, :colcheia],
  [:drum_bass_hard, :colcheia],  [:pausa, :colcheia],
  [:drum_snare_hard, :colcheia], [:pausa, :colcheia],
  [:drum_cymbal_closed, :colcheia], [:pausa, :colcheia]
]

# Letra
letra_1 = [
  # 1 - Anacruse
  'A'
]

letra_2_15_a = [
  # 2 +
  'place', 'in_', 'side', 'my', 'heart',
  # 3
  'is',
  # 4 e 5
  'where', 'you', 'live.',
  #6 +
  'Mem_', 'ories', 'of', 'our', 'start.',
  # 7
  'The',
  # 8 e 9
  'love', 'you', 'give.',
  # 10 +
  'Days', 'when', 'we\'re', 'a_', 'lone.',
  # 11
  'And',
  # 12 e 13
  'you', 'are', 'in', 'my', 'arms.',
  # 14
  'The blue_', 'ness', 'of',
  # 15
  'the true_',
  'ness', 'of', 'our',
]

letra_16_17_a = [
  # 16 +
  'love.',
  # 17
  'The',
]

letra_2_15_b = [
  # 2 +
  'Nights', 'of', 'moon_', 'lit', 'skies.',
  # 3
  'A',
  # 4 e 5
  'gen_', 'tle', 'kiss.',
  #6 +
  'Some_', 'thing', 'in', 'your', 'eyes.',
  # 7
  'Fills',
  # 8 e 9
  'me', 'with', 'bliss.',
  # 10 +
  'Hold', 'me', 'in', 'your', 'arms.',
  # 11
  'And',
  # 12 e 13
  'then', 'I', 'will', 're_', 'call.',
  # 14
  'The blue_', 'ness', 'of',
  # 15
  'the true_',
  'ness', 'of', 'our',
]

letra_16_17_c = [
  # 16 +
  'love.',
  # 17
  'The',
]

letra_2_15_c = [
  # 2 +
  'thought', 'of', 'how', 'we', 'met.',
  # 3
  'Still',
  # 4 e 5
  'lin_', 'gers', 'on.',
  #6 +
  'How', 'can', 'I', 'for_', 'get.',
  # 7
  'That',
  # 8 e 9
  'ma_', 'gic', 'dawn.',
  # 10 +
  'All', 'the', 'warm', 'de_', 'sire.',
  # 11
  'The',
  # 12 e 13
  'fi_', 're', 'in', 'your', 'touch.',
  # 14
  'The blue_', 'ness', 'of',
  # 15
  'the true_',
  'ness', 'of', 'our',
]

letra_16_17_b = [
  # 16 +
  'love.',
  # 17
  '',
]

letra_18_19 = [ '' ]



# Reproduz a música uma vez
with_fx :reverb do
  
  in_thread {
    use_synth :growl
    sleep 1 # 1
    tocar_camada(harmonia_2_15, tipo: :nota) # 2 a 15
    tocar_camada(harmonia_16_17, tipo: :nota) # 16 e 17
    tocar_camada(harmonia_2_15, tipo: :nota) # 2 a 15
    tocar_camada(harmonia_16_17, tipo: :nota) # 16 e 17
    tocar_camada(harmonia_2_15, tipo: :nota) # 2 a 15
    tocar_camada(harmonia_18, tipo: :nota) # 18
  }
  in_thread {
    use_synth :subpulse
    sleep 1 # 1
    tocar_camada(baixo_2_15, tipo: :nota) # 2 a 15
    tocar_camada(baixo_16_17, tipo: :nota) # 16 e 17
    tocar_camada(baixo_2_15, tipo: :nota) # 2 a 15
    tocar_camada(baixo_16_17, tipo: :nota) # 16 e 17
    tocar_camada(baixo_2_15, tipo: :nota) # 2 a 15
    tocar_camada(baixo_18, tipo: :nota) # 18
  }
  in_thread {
    sleep 1
    46.times do
      tocar_camada(percussao, tipo: :sample)
    end
  }
  
  # Reproduz melodia com exibição de letras e notas
  in_thread {
    letra_e_nota(melodia_1, letra_1) # Exibe notas e letras no console
    letra_e_nota(melodia_2_15, letra_2_15_a)
    letra_e_nota(melodia_16_17, letra_16_17_a)
    letra_e_nota(melodia_2_15, letra_2_15_b)
    letra_e_nota(melodia_16_17, letra_16_17_b)
    letra_e_nota(melodia_2_15, letra_2_15_c)
    letra_e_nota(melodia_16_17, letra_16_17_c)
  }
  
  use_synth :tech_saws
  tocar_camada(melodia_1, tipo: :nota) # 1
  tocar_camada(melodia_2_15, tipo: :nota) # 2 a 15
  tocar_camada(melodia_16_17, tipo: :nota) # 16 e 17
  tocar_camada(melodia_2_15, tipo: :nota) # 2 a 15
  tocar_camada(melodia_16_17, tipo: :nota) # 16 e 17
  tocar_camada(melodia_2_15, tipo: :nota) # 2 a 15
  tocar_camada(melodia_18_19, tipo: :nota) # 18 e 19
  
  
  
end