Máy phát Beatbox Chain Markov


16

Chỉ là một ý tưởng mà tôi đã có vào một ngày khác: Tạo ra các nhịp theo chuỗi Markov của các âm thanh được xác định trước.

Tôi nhớ ai đó đã làm một beatbox với Google Dịch và tiếng Đức (theo liên kết và nhấn nghe).

Vì vậy, thách thức là xây dựng một kiểu nhập văn bản cho Google Dịch từ một chuỗi nhất định. Hoặc bạn có thể sử dụng các nốt nhạc và tự chơi nó :).

Chuỗi Markov

Bạn có thể tạo một chương trình đọc một dòng có số nhịp, một số khác có tên của chúng và biểu diễn ma trận của xác suất (bạn có thể chọn biểu diễn).

Bạn cũng có thể tạo một hàm với ba đối số đó.

Ví dụ

[đầu vào]

20
pv zk bschk kkkk
[[.1, .4, .5, 0.],
 [.3, .2, .3, .2],
 [0., .3, .2, .5],
 [.1, .8, .1, 0.]]

[đầu ra] đại loại như:

pv zk bschk zk pv bschk zk pv zk bschk kkkk pv bschk zk bschk bschk bschk zk kkkk bschk

Xác suất bắt đầu là như nhau cho mỗi nhịp.

Đó không phải là một thử thách chơi gôn vì tôi muốn thấy một số giải pháp hay (sáng tạo).

Điểm bổ sung nếu bạn phát minh ra nhịp đập mới và / hoặc chọn một bảng xác suất mang lại nhịp đập tốt trong hầu hết thời gian.

Nếu bạn muốn, bạn có thể sử dụng nhịp đập thực (Trong nhiều ngôn ngữ, thật dễ dàng để mở .wavcác tệp, như wavemô-đun trong Python) và tạo nhạc! Dưới đây là một số nhịp mẫu miễn phí.

Tôi có thể đăng một triển khai tham khảo nếu cần thiết.


Bạn có cho phép các hình thức tiền xử lý của ma trận? Đó là, một hình thức trong đó các số như vậy không xảy ra nữa?
Hans-Peter Störr

@hstoerr Vâng. Bạn có thể có nó làm đối số chức năng nếu bạn muốn
JBernardo

Vui lòng đề xuất một tệp lưu trữ để chia sẻ .WAV ngẫu nhiên của chúng tôi :)
Tiến sĩ belisarius

@belisarius Tôi biết Songcloud là tốt cho điều đó, nhưng bạn có thể sử dụng bất kỳ lưu trữ tập tin.
JBernardo

Có thể chấp nhận sử dụng tiền tố nhiều ghi chú trong mô hình không?
Sparr

Câu trả lời:


6

Tôi đã thực hiện các bài hát này:

http://soundcloud.com/belisarius/sets/golf-music

Sử dụng ma trận chuyển tiếp sau đây:

{{10,  1,  3/2, 2},  
 {1/2, 10, 3/2, 2},  
 {1/2, 1,  10,  2},  
 {1/2, 1,  3/2, 10}} 

Và chương trình sau đây trong Mathicala:

musicGen[n_, notes_, transMatrix_] :=
 Module[{
          im := IdentityMatrix[Length@notes],
          a  := Array[2^(# - 1) &, Length@notes],
          soundLength = .1  n,
          which
          },
  which[x_] := Position[x, 1][[1, 1]];
  Sound[Join[
    (SoundNote /@ notes[[
        which[#] & /@
         NestList[
          RandomChoice[transMatrix[[which@#]] -> im] &,
          RandomChoice@im,
          n - 1]
        ]]
     )
    ],
   soundLength]
  ]
tm = {{10, 1, 3/2, 2}, {1/2, 10, 3/2, 2}, {1/2, 1, 10, 2}, {1/2, 1, 3/2, 10}}
notesSet = {"Snare", {"Slap", "Shaker"}, {"OpenTriangle", "Maracas"}, "RideBell"};
m = Array[If[#2 == 5 || #2 == #1, 10, #2/2] &, {Length@notesSet,Length@notesSet}];
mg = musicGen[100, notesSet, tm]

Ồ, tốt đẹp. Tôi cũng đã thử tạo ra một số âm thanh, nhưng tôi nghĩ có gì đó không đúng với nhịp đập tôi đã sử dụng (có một số khoảng lặng giữa chúng).
JBernardo

Có vẻ như bạn chồng các nhịp đập
JBernardo

@JBernardo Có bốn "hợp âm" trong mẫu: 1) "Snare", 2) {"Slap" & "Shaker"}, 3) {"OpenTrigin" & "Maracas"}, 4) "RideBell"; Đó là sự chồng chất mà bạn nghe thấy ở đó
Tiến sĩ belisarius

3

Là người Đức, tôi gần như té ghế cười vì sự lạm dụng sáng tạo ngôn ngữ này. :-)

Đây là một số Scala. Tôi đang mã hóa các xác suất trong một bản đồ ánh xạ nhịp đến một danh sách các nhịp kế tiếp trong đó các nhịp xuất hiện với tần số tỷ lệ thuận với xác suất của chúng. Một luồng nhịp được đánh giá lười biếng vô hạn được tạo ra, có 10 nhịp đầu tiên được bỏ qua để có được sự ngẫu nhiên thích hợp của nhịp đầu ra đầu tiên. Chúng tôi trả lại số lượng nhịp phù hợp từ đầu luồng đó. Tôi sử dụng tham số loại T để ngắn hơn và chung chung.

def markovChain[T](length : Int, nodes : Seq[T], probabilities : Map[T, Seq[T]]) : Seq[T] = {
  def randomElement(seq : Seq[T]) = seq(Random.nextInt(seq.length))
  def chain(node: T): Stream[T] =
    Stream.cons(node, chain(randomElement(probabilities(node))))
  return chain(randomElement(nodes)) drop(10) take(length)
}

có thể được gọi như thế này:

val nodes = List("pv", "zk", "bschk", "kkkk")

val probabilities = Map(
  "pv" -> List("pv", "zk", "zk", "zk", "zk", "bschk", "bschk", "bschk", "bschk", "bschk"),
  "zk" -> List("pv", "pv", "pv", "zk", "zk", "bschk", "bschk", "bschk", "kkkk", "kkkk") ,
  "bschk" -> List("zk", "zk", "zk", "bschk", "bschk", "kkkk", "kkkk", "kkkk", "kkkk", "kkkk"),
  "kkkk" -> List("pv", "zk", "zk", "zk", "zk", "zk", "zk", "zk", "zk", "bschk"))

markovChain(20, nodes, probabilities) foreach (s => print (s + " "))

1

Tôi đã viết một chức năng Javascript. Tuy nhiên, nó đã bắt đầu beatboxing ...

function bschk(jk,pv,kkkk){jkjk='pv jk bschk kkkk'.split(' ');boom='indexOf';eval(
function(jkpv){for(pvpv=0,bschkpv='';pvpv<jkpv.length;jkpvpv=jkpv[pvpv++].split(' '),
bschkpv+=String.fromCharCode(jkjk[boom](jkpvpv[0])+jkjk[boom](jkpvpv[1])*4+jkjk[
boom](jkpvpv[2])*16+jkjk[boom](jkpvpv[3])*64));return bschkpv}((
'bschk jk bschk jk  kkkk kkkk bschk jk  bschk pv kkkk jk  pv bschk bschk pv  bschk '
+'jk kkkk jk  jk pv bschk jk  bschk pv kkkk jk  pv pv bschk pv  jk jk bschk jk  jk '
+'kkkk kkkk pv  bschk kkkk kkkk jk  bschk kkkk kkkk jk  pv bschk bschk pv  jk kkkk '
+'pv jk  jk pv bschk jk  pv jk kkkk jk  pv bschk bschk jk  bschk kkkk bschk pv  bsc'
+'hk pv kkkk jk  jk pv bschk jk  bschk kkkk bschk jk  pv jk bschk jk  kkkk kkkk bsc'
+'hk jk  jk kkkk bschk jk  pv bschk bschk pv  jk bschk bschk pv  bschk bschk bschk '
+'pv  pv pv kkkk jk  bschk jk kkkk jk  bschk kkkk bschk pv  pv kkkk bschk jk  jk jk'
+' bschk jk  bschk kkkk bschk jk  kkkk jk bschk jk  pv jk kkkk jk  pv bschk bschk j'
+'k  jk bschk bschk pv  pv kkkk bschk pv  jk bschk bschk jk  jk kkkk kkkk pv  pv pv'
+' kkkk pv  pv kkkk bschk pv  bschk jk bschk jk  pv kkkk bschk pv  kkkk jk bschk jk'
+'  pv kkkk bschk pv  kkkk pv bschk jk  kkkk bschk bschk jk  kkkk pv bschk jk  kkkk'
+' bschk bschk jk  bschk pv bschk jk  kkkk kkkk bschk jk  kkkk kkkk bschk jk  jk kk'
+'kk bschk jk  jk kkkk kkkk pv  kkkk jk bschk pv  kkkk jk bschk pv  kkkk bschk kkkk'
+' pv  jk bschk bschk jk  pv kkkk kkkk pv  bschk bschk bschk jk  kkkk bschk bschk j'
+'k  kkkk bschk kkkk pv  jk bschk bschk jk  kkkk bschk bschk pv  kkkk bschk bschk p'
+'v  jk bschk bschk pv  kkkk bschk kkkk jk  kkkk pv bschk jk  kkkk bschk bschk jk  '
+'kkkk pv bschk jk  kkkk bschk bschk jk  bschk pv bschk jk  kkkk kkkk bschk jk  kkk'
+'k kkkk bschk jk  jk kkkk bschk jk  kkkk bschk bschk pv  jk kkkk kkkk pv  pv pv kk'
+'kk jk  bschk jk kkkk jk  kkkk bschk jk jk  jk jk bschk jk  jk kkkk jk jk  kkkk bs'
+'chk bschk pv  kkkk jk bschk pv  pv pv bschk pv  kkkk jk bschk pv  kkkk bschk kkkk'
+' pv  kkkk jk bschk jk  jk kkkk kkkk pv  jk kkkk pv jk  jk pv bschk jk  pv jk kkkk'
+' jk  pv bschk bschk jk  bschk kkkk bschk pv  bschk pv kkkk jk  jk pv bschk jk  bs'
+'chk kkkk bschk jk  pv jk bschk jk  kkkk kkkk bschk jk  jk kkkk bschk jk  pv bschk'
+' bschk pv  jk bschk bschk pv  kkkk bschk kkkk pv  bschk jk bschk jk  jk kkkk kkkk'
+' pv  jk kkkk bschk pv  jk pv kkkk pv  kkkk bschk kkkk pv  kkkk jk kkkk jk  pv bsc'
+'hk bschk jk  jk bschk bschk jk  pv kkkk bschk jk  jk jk bschk jk  pv bschk bschk '
+'pv  kkkk jk bschk jk  bschk kkkk kkkk pv  jk kkkk kkkk pv  pv pv kkkk pv  jk bsch'
+'k bschk pv  kkkk jk bschk jk  jk kkkk bschk pv  jk kkkk kkkk pv  kkkk bschk bschk'
+' jk  kkkk bschk bschk jk  kkkk bschk bschk jk  kkkk bschk bschk jk  kkkk bschk jk'
+' jk  jk jk bschk jk  jk kkkk jk jk  kkkk bschk jk jk  kkkk bschk bschk pv  kkkk b'
+'schk bschk pv  bschk jk bschk jk  jk kkkk jk jk  kkkk bschk kkkk pv  jk jk bschk '
+'jk  jk kkkk kkkk pv  bschk jk bschk jk  kkkk bschk kkkk pv  jk kkkk kkkk jk').split
('  ')));return ckckboom;}

Ví dụ sử dụng: bschk(20,'pv jk bschk kkkk'.split(' '),[[.1,.4,.5,0],[.3,.2,.3,.2],[0,.3,.2,.5],[.1,.8,.1,0]])


0

Chỉ là một triển khai tham chiếu trong Python:

from random import random

def find(num, pdf):
    ''' Find position of number in CDF from PDF (must sum 100%) '''
    cdf = (sum(pdf[:i+1]) for i in range(len(pdf)))
    for i,j in enumerate(cdf):
        if num < j:
            return i

def build(t, beats, table):
    node = int(random()*len(table))
    nodes = [node]
    for i in range(t-1):
        node = find(random(), table[node])
        nodes.append(node)
    return ' '.join(beats[i] for i in nodes)

Và một chương trình thử nghiệm:

table = [[.1, .4, .5, 0.],
         [.3, .2, .3, .2],
         [0., .3, .2, .5],
         [.1, .8, .1, 0.]]

print(build(20, 'pv zk bschk kkkk'.split(), table))

Và một số kết quả đầu ra:

pv zk bschk zk kkkk zk bschk kkkk zk zk zk bschk kkkk zk bschk zk pv bschk kkkk zk
zk bschk kkkk zk zk kkkk zk bschk kkkk zk bschk zk pv zk pv zk zk bschk kkkk bschk
kkkk zk zk pv bschk bschk zk zk kkkk zk kkkk zk zk kkkk zk pv zk bschk kkkk zk

Nhưng không ai trong số họ tạo ra một beatbox thực sự tốt vì có quá nhiều kkkk:).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.