[ SonicPi ] Live Coding

Общение на тему гитар, дудок, ударных и других инструментов
Ответить
zOobRa
Сообщения: 72
Зарегистрирован: Вт сен 08, 2009 10:00 pm

[ SonicPi ] Live Coding

Сообщение zOobRa » Ср фев 22, 2017 6:48 pm

Всех с праздниками!
Прошу вас не воспринимать этот пост слишком серьезно :)

Недавно мне захотелось поиграть на каком-нибудь нестандартном музыкальном инструменте, чем-то совсем отличающимся от привычных мне харпа, сакса или пианино.

Сначала подумал о даксофоне или терменвоксе, но потом обнаружил "лайв кодинг". 
Тем более, чтобы играть в энтот "лайв кодинг" ничего кроме компьютера и не нужно.

"Лайв кодинг" - это способ создания электронной музыки, только вместо нажатия на клавиши синтезатора или кручения блинов, нужно писать код. 
А потом на ходу можно менять любые константы, переменные, добавлять новые структуры кода и слышать как музыка меняется.
Хотя конечно традиционная нотная запись мне кажется гораздо удобнее.
Ну код и код, фиг с ним, я не ханжа. 
Тем более для предупреждения закостеневания ума врачи рекомендуют постоянно осваивать что-то новое.

Существует много программ для "лайв кодинга". Самой простой и удобной мне показалась - Sonic Pi.
По своему прямому назначению она используется для фоновой электронной музыки, т.е. разного рода dnb/edm-колбасы. Тут вы можете посмотреть примеры такой музыки.
Впрочем мне такое не очень интересно.

Давайте сегодня попробуем создать что-нибудь для нас более привычное…
Я выбрал произведение "Saint James Infirmary Blues".

Попробуем сделать декодирование мелодии в код, добавим ритм-секцию и импровизацию, причем так, чтобы каждый раз произведение звучало немного по-разному.
Пусть всякий раз произведение звучит немного с разным интонированием, атакой, вибрато, фразировкой, чтобы импровизация каждый раз получалась разной, но в разумных пределах. 
Кстати на подобную наркоманию меня вдохновил сериал HBO Westworld, рекомендую :)

Код и пример в первом посте.
Последний раз редактировалось zOobRa Ср фев 22, 2017 6:56 pm, всего редактировалось 1 раз.
zOobRa
Сообщения: 72
Зарегистрирован: Вт сен 08, 2009 10:00 pm

Re: [ SonicPi ] Live Coding

Сообщение zOobRa » Ср фев 22, 2017 6:54 pm

Итак получился такой код (вы можете вставить его к себе в SonicPi):

Код: Выделить всё

# St. James Infirmary Blues

#################################
# Let's initialize stuff first: #
#################################

use_bpm 110
offbeat = 0.2 # for simplicity (fifth part of the beat)
time = Time.new # to make it truly random

define :melody do |n, t=1| #n is the notes list, t is the duration between notes (default to 1 beat)
  use_synth :prophet
  n.each_index do |i|
    if i.even? then
      play n[i], cutoff: 80,  amp: 5+t[i], sustain: t[i]-t[i]/4, release: t[i]/8, vibrato_rate: 4, vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0
    else
      play n[i], cutoff: 85,  amp: 7+t[i], sustain: t[i]-t[i]/4, release: t[i]/4, vibrato_rate: 4, vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0
    end
    sleep t[i]
  end
end

define :infirmary_melody do
  with_fx :reverb do
    #               <----  NOTES  ---->                                      <----  DURATIONS  ---->
    melody [:D4, :F4, :A4, :A4, :G4, :A4, :G4, :F4, :D4],           [1-offbeat,1+offbeat,2-offbeat,2+offbeat,3,0.5-offbeat/4,0.5+offbeat/4,1,1]
    sleep 4
    melody [:D4, :F4, :A4, :A4, :D5, :Bb4,:A4],                     [1-offbeat,1+offbeat,2-offbeat,2+offbeat,3-offbeat,1,2+offbeat]
    sleep 4
    melody [:D4, :F4, :A4, :G4, :A4, :G4, :A4, :G4, :F4, :D4],      [1-offbeat,1+offbeat,0.5-offbeat,0.5+offbeat,3,3,0.5-offbeat,0.5+offbeat,1,1+1]
    sleep 4
    melody [:D4, :F4, :D4, :F4, :D4, :G4, :A4, :F4, :D4],           [1-offbeat,1+offbeat,1-offbeat,1+offbeat,1-offbeat,1+offbeat,1-offbeat,1+offbeat,1+3]
    sleep 4
  end
end

define :percussion do
  use_random_seed time.usec + rrand(0,150)
  sleep 1
  sample  :drum_cymbal_soft, sustain: 0, release: 0.1, amp: 2 if not one_in(8)
  sleep 1
  sample  :drum_cymbal_soft, sustain: 0, release: 0.1, amp: rrand(0.2,1.5) if not one_in(4)
  sleep 1-offbeat
  sample  :drum_cymbal_soft, sustain: 0, release: 0.1, amp: rrand(0.4,1.5) if not one_in(4)
  sleep 1+offbeat
end

define :chord_progression do
  use_synth :chipbass
  chords = [chord(:D3, :minor7),chord(:G3, :minor7),chord(:D3, :minor7),chord(:D3, :minor7),
            chord(:D3, :minor7),chord(:G3, :minor7),chord(:D3, :minor7),chord(:D3, :minor7),
            chord(:D3, :minor7),chord(:G3, :minor7),chord(:D3, :minor7),chord(:D3, :minor7),
            chord(:D3, :minor7),chord(:G3, :dom7),  chord(:A3, :dom7),  chord(:D3, :minor7),]
  chords.each_index do |i|
    use_random_seed time.usec + rrand(0,50)
    play chords[i], attack: rrand(0.5,1), amp: rrand(8,12), sustain: 0.5, release: 2.5 if not one_in(10)
    sleep 4
  end
end

define :kinda_improvisation do
  use_synth :pluck
  use_random_seed time.usec + rrand(-70,70)
  play :D2, release: 0.1, amp: 18, cutoff: 60,  amp: 15, sustain: 10, release: 6, vibrato_rate: 5, vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0 if not one_in(8)
  notes = (scale :D2, :minor_pentatonic, num_octaves: 2)
  8.times do
    sleep 1
    play notes.choose, amp: rrand(10,18), cutoff: rrand(40,60), amp: rrand(10,20), sustain: rrand(1,1.5), release: rrand(0.5,7), vibrato_rate: 5, vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0 if not one_in(5)
    sleep 1
    play notes.choose, amp: rrand(10,18), cutoff: rrand(40,60), amp: rrand(10,20), sustain: rrand(1,1.5), release: rrand(0.5,7), vibrato_rate: 5, vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0 if not one_in(5)
    sleep 1-offbeat
    play notes.choose, amp: rrand(10,18), cutoff: rrand(40,60), amp: rrand(10,20), sustain: rrand(1,2.5), release: rrand(0.5,7), vibrato_rate: 5, vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0 if not one_in(5)
    sleep 1+offbeat
    use_random_seed time.usec + rrand(0,100)
    16.times do
      play notes.choose, amp: rrand(14,28), cutoff: rrand(50,60), amp: rrand(10,20), sustain: rrand(0.25,1), release: rrand(0.0125,7), vibrato_rate: 3, vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0 if not one_in(4)
      sleep 0.25
    end
  end
  play :D3, release: 0.1, amp: 25, cutoff: 60,  amp: rrand(10,20), sustain: 1, release: 5, vibrato_rate: rrand(3,6), vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0 #if not one_in(8)
  sleep 2-offbeat
  play :A3, release: 0.1, amp: 18, cutoff: rrand(40,70),  amp: rrand(10,25), sustain: rrand(0.5,3) , release: rrand(3,6), vibrato_rate: 5, vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0 #if not one_in(8)
  sleep 2+offbeat
  play :F3, release: 0.1, amp: 22, cutoff: rrand(40,70),  amp: rrand(10,20), sustain: 1, release: 3, vibrato_rate: rrand(3,6), vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0 #if not one_in(8)
  sleep 2
  play :D2, release: 0.1, amp: 30, cutoff: 60,  amp: 20, sustain: 1, release: 4, vibrato_rate: 5, vibrato_depth: 0.25, vibrato_onset: 0.1, vibrato_delay: 0# if not one_in(8)
  sleep 8
end

##############################
# Now let's play some music: #
##############################

in_thread do # basslines goes here
  cue :tick
  78.times {percussion}
end

in_thread do
  sync :tick
  sleep 32
  4.times {chord_progression}
end

in_thread do # solo goes here
  sync :tick
  2.times do
    use_synth :blade
    sleep 2
    bend = play :D3, release: 2, sustain: 10, cutoff: 50, amp: 40, vibrato_rate: 5, vibrato_depth: 0.3, vibrato_onset: 0.1, vibrato_delay: 0
    sleep 4+offbeat
    control bend, note: :Db3 # bend the note a half-step
    sleep 4-offbeat
    control bend, note: :D3, amp: 30
    sleep 2+offbeat
    sleep 4-offbeat
  end
  
  infirmary_melody
  
  2.times {kinda_improvisation}
  
  infirmary_melody
  
end

… или прослушать запись одного из возможных воспроизведений:

[Расширение wav было запрещено, вложение больше недоступно.]

Не судите строго, это моя первая попытка.
Над тембром не заморачивался использовал синты по-умолчанию.

А вообще народ делает и по-интереснее. Например, "Бах с элементами джаза": код тут, послушать тут.

При создании музыки таким способом поражаешься как много мы, как музыканты, делаем подсознательно (атака, вибрато, ритм,..). 
Здесь, к сожалению, все нюансы произведения нужно прописывать сознательно.

Да я догадываюсь что некоторые обо мне подумали, но я всеже считаю что у этого способа создания музыки определенно есть право на жизнь:
  • - Такая музыка ничего не весит (пара килобайт текста), что может найти свое применение в играх и программах;
    - Ее удобно хранить, можно использовать системы контроля версий для коллективной работы;
    - Лайв кодинг идеально подходит для создания музыки основанной на принципах рандомизации, повторяемости и шаблонизации;
    - А еще, например, можно завязать переменные вашего произведения на значения каких-нибудь датчиков (температура? освещенность? задымление? вибрация?) и наблюдать как ваше произведение меняется под влиянием внешней среды.
Последний раз редактировалось zOobRa Ср фев 22, 2017 7:32 pm, всего редактировалось 2 раза.
zOobRa
Сообщения: 72
Зарегистрирован: Вт сен 08, 2009 10:00 pm

Сообщение zOobRa » Ср фев 22, 2017 7:07 pm

Да, сейчас еще раз прослушал, кажется где-то слегка косякнул с гармонией.
Собственно то, о чем я и говорил выше.. сыграть просто, а разложить сложнее.
Вообщем ваши советы и предложения принимаются :) Тем более я не уверен что сделал все по фэншую.

Также было бы интересно узнать ваше мнение про такой (пока еще) экзотический способ создания музыки.

Ответить