Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- defmodule Techno2 do
- @part_list [:drum, :bass, :syn1, :syn2]
- @part_channel_map %{ drum: "K", bass: "A" , syn1: "D" , syn2: "E"}
- @kick "@10c"
- @hihat "@12c"
- def gen_blocks(list) do
- list
- |> Enum.map(fn b -> gen_block(b) end )
- end
- def to_mml(music) do
- music
- |> List.flatten
- |> Enum.reduce("", fn e, acc -> acc <> e <> "\n" end)
- end
- def gen_block(block) do
- @part_list
- |> Enum.map( fn part -> gen_part(part, block) end)
- end
- def gen_units(units) do
- units
- |> Enum.map( fn unit -> gen_unit(unit) end)
- end
- def gen_music() do
- [:header,
- :intro, :amelo, :bmelo, :amelo2, :bmelo2,
- :intro, :amelo, :amelo2, :bmelo2, :bmelo2,
- :outro]
- |> gen_blocks()
- |> to_mml()
- end
- # header part
- def gen_part(part, phrases) when is_list(phrases) do
- phrases
- |> Enum.map(fn phrase -> gen_phrase(part, phrase) end)
- end
- def gen_part(:drum, :header) do gen_part(:drum, [:drum_header]) end
- def gen_part(:bass, :header) do gen_part(:bass, [:bass_header]) end
- def gen_part(:syn1, :header) do gen_part(:syn1, [:syn1_header]) end
- def gen_part(:syn2, :header) do gen_part(:syn2, [:syn2_header]) end
- # intro part
- def gen_part(:drum, :intro) do gen_part(:drum, [:drum_11, :drum_12]) end
- def gen_part(:bass, :intro) do gen_part(:bass, [:bass_11, :bass_12]) end
- def gen_part(:syn1, :intro) do gen_part(:syn1, [:rest , :syn1_intro]) end
- def gen_part(:syn2, :intro) do gen_part(:syn2, [:rest , :syn2_intro]) end
- # amelo part
- def gen_part(:drum, :amelo) do gen_part(:drum, [:drum_11, :drum_12]) end
- def gen_part(:bass, :amelo) do gen_part(:bass, :intro) end
- def gen_part(:syn1, :amelo) do gen_part(:syn1, [:syn1_11, :syn1_12]) end
- def gen_part(:syn2, :amelo) do gen_part(:syn2, [:rest, :rest]) end
- # bmelo part
- def gen_part(:drum, :bmelo) do gen_part(:drum, [:drum_21, :drum_22]) end
- def gen_part(:bass, :bmelo) do gen_part(:bass, [:bass_21, :bass_22]) end
- def gen_part(:syn1, :bmelo) do gen_part(:syn1, [:syn1_21, :syn1_22]) end
- def gen_part(:syn2, :bmelo) do gen_part(:syn2, [:rest, :rest]) end
- # amelo part
- def gen_part(:drum, :amelo2) do gen_part(:drum, [:drum_11, :drum_12]) end
- def gen_part(:bass, :amelo2) do gen_part(:bass, :intro) end
- def gen_part(:syn1, :amelo2) do gen_part(:syn1, [:syn1_11, :syn1_12]) end
- def gen_part(:syn2, :amelo2) do gen_part(:syn2, [:syn2_11, :syn2_12]) end
- # bmelo part
- def gen_part(:drum, :bmelo2) do gen_part(:drum, [:drum_21, :drum_22]) end
- def gen_part(:bass, :bmelo2) do gen_part(:bass, [:bass_21, :bass_22]) end
- def gen_part(:syn1, :bmelo2) do gen_part(:syn1, [:syn1_21, :syn1_22]) end
- def gen_part(:syn2, :bmelo2) do gen_part(:syn2, [:syn2_21, :syn2_22]) end
- # outro part
- def gen_part(:drum, :outro) do gen_part(:drum, [:drum_11]) end
- def gen_part(:bass, :outro) do gen_part(:bass, [:bass_11]) end
- def gen_part(:syn1, :outro) do gen_part(:syn1, [:syn1_outro]) end
- def gen_part(:syn2, :outro) do gen_part(:syn2, [:syn2_outro]) end
- # header
- def gen_phrase(part, phrase) do
- channel = @part_channel_map[part]
- phrase = gen_phrase(phrase)
- "#{channel} #{phrase}"
- end
- def gen_phrase(:rest) do gen_units([:rest, :rest]) end
- def gen_phrase(:drum_header) do gen_header(1, 50, 2) end
- def gen_phrase(:bass_header) do gen_header(3, 13, 2, 31) end
- def gen_phrase(:syn1_header) do gen_header(4, 13, 2, 3) <> "l16 M16,1,30,4,15" end
- def gen_phrase(:syn2_header) do gen_header(3, 13, 2, 3) <> "l16 M16,1,30,4,15 D-18" end
- # drum
- def gen_phrase(:drum_11) do gen_units([:drum_1_1, :drum_1_1]) end
- def gen_phrase(:drum_12) do gen_units([:drum_1_1, :drum_1_2]) end
- def gen_phrase(:drum_21) do gen_units([:drum_2_1, :drum_2_1]) end
- def gen_phrase(:drum_22) do gen_units([:drum_2_1, :drum_2_2]) end
- # bass
- def gen_phrase(:bass_11) do gen_units([:bass_1_1, :bass_1_1]) end
- def gen_phrase(:bass_12) do gen_units([:bass_1_1, :bass_1_2]) end
- def gen_phrase(:bass_21) do gen_units([:bass_2_1, :bass_2_1]) end
- def gen_phrase(:bass_22) do gen_units([:bass_2_1, :bass_2_2]) end
- # syn1
- def gen_phrase(:syn1_intro) do "g1&>g1<" end
- def gen_phrase(:syn1_outro) do "g1&<g1>" end
- def gen_phrase(:syn1_11) do gen_units([:syn1_1_1, :syn1_1_1]) end
- def gen_phrase(:syn1_12) do gen_units([:syn1_1_1, :syn1_1_2]) end
- def gen_phrase(:syn1_21) do gen_units([:syn1_2_1, :syn1_2_2]) end
- def gen_phrase(:syn1_22) do gen_units([:syn1_2_1, :syn1_2_3]) end
- # syn2
- def gen_phrase(:syn2_intro) do "b-1&>b-1<" end
- def gen_phrase(:syn2_outro) do "b-1& g-1 " end
- def gen_phrase(:syn2_11) do gen_units([:syn2_1_1, :syn2_1_1]) end
- def gen_phrase(:syn2_12) do gen_units([:syn2_1_1, :syn2_1_2]) end
- def gen_phrase(:syn2_21) do gen_units([:syn2_1_1, :syn2_1_2]) end
- def gen_phrase(:syn2_22) do gen_units([:syn2_1_1, :syn2_1_2]) end
- # header
- def gen_header() do "C192 T140 " end
- def gen_header(o, v, q) do gen_header() <> "o#{o} v#{v} q#{q} " end
- def gen_header(o, v, q, at) do gen_header(o,v,q) <> "@#{at} " end
- # units
- def gen_unit(:rest) do "r4r4r4r4 " end
- def gen_unit(:drum_1_1) do "[#{@kick}4]4 " end
- def gen_unit(:drum_1_2) do "[#{@kick}8]4 [#{@kick}16]8 " end
- def gen_unit(:drum_2_1) do "[#{@kick}8#{@hihat}8]4 " end
- def gen_unit(:drum_2_2) do "[#{@kick}8#{@hihat}8]2 [#{@kick}16#{@hihat}16]4 " end
- def gen_unit(:bass_1_1) do "K0l16[gc>dg<]4 " end
- def gen_unit(:bass_1_2) do "K7l16[gc>dg<]4 " end
- def gen_unit(:bass_2_1) do "K0l16[gg-gg-]4 " end
- def gen_unit(:bass_2_2) do "K7l16[gggg]4 " end
- def gen_unit(:syn1_1_1) do "K0 l16 [c&g&e-&g&]4 " end
- def gen_unit(:syn1_1_2) do "K0 l16 [g&b&>c-&d+&<]4 " end
- def gen_unit(:syn1_2_1) do "K0 g2.& g+4 " end
- def gen_unit(:syn1_2_2) do "K0 b2.& a+4" end
- def gen_unit(:syn1_2_3) do "K0 g1" end
- def gen_unit(:syn2_1_1) do "K0 l16 [gc>dg<]4 " end
- def gen_unit(:syn2_1_2) do "K0 l16 [gc>dg<]4 " end
- def gen_unit(:syn2_2_1) do "K0 g4e4d4c4 " end
- def gen_unit(:syn2_2_2) do "K-8 g4e-4d4c4 " end
- end
- Techno2.gen_music()
- |> IO.puts
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement