Всех с праздниками! Прошу вас не воспринимать этот пост слишком серьезно :)
Недавно мне захотелось поиграть на каком-нибудь нестандартном музыкальном инструменте, чем-то совсем отличающимся от привычных мне харпа, сакса или пианино.
Сначала подумал о даксофоне или терменвоксе, но потом обнаружил "лайв кодинг". Тем более, чтобы играть в энтот "лайв кодинг" ничего кроме компьютера и не нужно.
"Лайв кодинг" - это способ создания электронной музыки, только вместо нажатия на клавиши синтезатора или кручения блинов, нужно писать код. А потом на ходу можно менять любые константы, переменные, добавлять новые структуры кода и слышать как музыка меняется. Хотя конечно традиционная нотная запись мне кажется гораздо удобнее. Ну код и код, фиг с ним, я не ханжа. Тем более для предупреждения закостеневания ума врачи рекомендуют постоянно осваивать что-то новое.
Существует много программ для "лайв кодинга". Самой простой и удобной мне показалась - Sonic Pi. По своему прямому назначению она используется для фоновой электронной музыки, т.е. разного рода dnb/edm-колбасы. Тут вы можете посмотреть примеры такой музыки. Впрочем мне такое не очень интересно.
Давайте сегодня попробуем создать что-нибудь для нас более привычное… Я выбрал произведение "Saint James Infirmary Blues".
Попробуем сделать декодирование мелодии в код, добавим ритм-секцию и импровизацию, причем так, чтобы каждый раз произведение звучало немного по-разному. Пусть всякий раз произведение звучит немного с разным интонированием, атакой, вибрато, фразировкой, чтобы импровизация каждый раз получалась разной, но в разумных пределах. Кстати на подобную наркоманию меня вдохновил сериал HBO Westworld, рекомендую :)
Код и пример в первом посте.
Последний раз редактировалось zOobRa Ср фев 22, 2017 6:56 pm, всего редактировалось 1 раз.
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 :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
… или прослушать запись одного из возможных воспроизведений:
Не судите строго, это моя первая попытка. Над тембром не заморачивался использовал синты по-умолчанию.
А вообще народ делает и по-интереснее. Например, "Бах с элементами джаза": код тут, послушать тут.
При создании музыки таким способом поражаешься как много мы, как музыканты, делаем подсознательно (атака, вибрато, ритм,..). Здесь, к сожалению, все нюансы произведения нужно прописывать сознательно.
Да я догадываюсь что некоторые обо мне подумали, но я всеже считаю что у этого способа создания музыки определенно есть право на жизнь:
- Такая музыка ничего не весит (пара килобайт текста), что может найти свое применение в играх и программах; - Ее удобно хранить, можно использовать системы контроля версий для коллективной работы; - Лайв кодинг идеально подходит для создания музыки основанной на принципах рандомизации, повторяемости и шаблонизации; - А еще, например, можно завязать переменные вашего произведения на значения каких-нибудь датчиков (температура? освещенность? задымление? вибрация?) и наблюдать как ваше произведение меняется под влиянием внешней среды.
Последний раз редактировалось zOobRa Ср фев 22, 2017 7:32 pm, всего редактировалось 2 раза.
Да, сейчас еще раз прослушал, кажется где-то слегка косякнул с гармонией. Собственно то, о чем я и говорил выше.. сыграть просто, а разложить сложнее. Вообщем ваши советы и предложения принимаются :) Тем более я не уверен что сделал все по фэншую.
Также было бы интересно узнать ваше мнение про такой (пока еще) экзотический способ создания музыки.