# Hier is die dan het door AI gegenereerde SonicPi programma.
Als je run gedaan hebt gaat het programma pas aan-de-gang wat er veranderd is , of geknip-plakt is , of geprogrammeerd is.
Knip-plak dan eerst zoals je het wil hebben daarna run doen en dan met het indrukken van C3 >>>> laat hij C3 horen en direct daarna E3 En G3
In dit geval.
Die zijn naar eigen inzicht aan te vullen of te veranderen.
Let ook op de komma`s dubbele punten e.d. Als er even iets fout staat doet ìe het al niet meer.
midi:irig_pro_duo_midi_0:1/note_on" <<< dat is mijn eigen midi inteface maar heb je een ander ? dan vul je die op die plaats in.
Die irig . . . enz. verschijnt in groene letters. Heel veel met knip-plak cntr X of cntr C of plak cntr C
Direct na het hekje # kun je aanwijzingstekst invullen dat blijft buiten het programma.
set :held_notes, {}
# Definieer per toets 2–3 noten
melodies = {
48 => [:c3, :e3, :g3], # C3
50 => [:d3, :f3, :a3], # D3
52 => [:e3, :g3], # E3
53 => [:f3, :a3], # F3
55 => [:g3, :b3], # G3
57 => [:a3, :c4], # A3
59 => [:b3, :d4], # B3
60 => [:c4, :e4], # C4
62 => [:d4, :f3], # D4
64 => [:e4, :g3], # E4
65 => [:f4, :a4], # F4
67 => [:g4, :b4], # G4
69 => [:a4, :c5], # A4
71 => [:b4, :d5], # B4
72 => [:c5, :e5], # C5
74 => [:d5, :f5], # D5
76 => [:e5, :g5], # E5
77 => [:f5, :a5], # F5
79 => [:g5, :b5], # G5
81 => [:a5, :c6], # A5
83 => [:b5, :d6], # B5
84 => [:c6, :e6] # C6
}
live_loop :midi_looper do
note, velocity = sync "/midi:irig_pro_duo_midi_0:1/note_on"
held = get(:held_notes)
if melodies.keys.include?(note)
if velocity > 0
unless held[note]
set :held_notes, held.merge({note => true})
in_thread(name: "melody_#{note}") do
while get(:held_notes)[note]
melodies[note].each do |n|
midi_note_on n, vel: 80, channel: 1
sleep 0.2
midi_note_off n, channel: 1
end
end
end
end
else
set :held_notes, held.merge({note => false})
end
end
end