মার্কভ চেইন বিটবক্স জেনারেটর


16

অন্যদিন আমার কাছে কেবল একটি ধারণা ছিল: পূর্বনির্ধারিত শব্দগুলির একটি মার্কভ চেইনকে অনুসরণ করে মারধর করা ।

আমার মনে আছে কেউ গুগল ট্রান্সলেট এবং জার্মান ভাষার সাথে একটি বেটবক্স করেছে ( লিঙ্কটি অনুসরণ করুন এবং শুনুন টিপুন)।

সুতরাং, চ্যালেঞ্জটি হ'ল প্রদত্ত চেইন থেকে গুগল ট্রান্সলেটে একটি পাঠ্য ইনপুট তৈরি করা। বা আপনি সঙ্গীত নোটগুলি ব্যবহার করতে পারেন এবং এটি নিজে খেলতে পারেন :) :)

মার্কভ চেইন

আপনি মারার সংখ্যার সাথে একটি লাইন পড়ার একটি প্রোগ্রাম তৈরি করতে পারেন, অন্যটির নাম এবং সম্ভাবনার একটি ম্যাট্রিক্স উপস্থাপনা (আপনি উপস্থাপনাটি চয়ন করতে পারেন)।

আপনি এই তিনটি যুক্তি দিয়ে কোনও ফাংশনও করতে পারেন।

যেমন

[ইনপুট]

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

[আউটপুট] এর মতো কিছু:

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

প্রারম্ভিক সম্ভাবনা প্রতিটি বিট জন্য একই।

এটি কোনও কোড-গল্ফ চ্যালেঞ্জ নয় কারণ আমি কিছু সুন্দর সমাধান দেখতে চাই (সৃজনশীল হও)।

আপনি যদি নতুন মারধর উদ্ভাবন করেন এবং / অথবা সম্ভাবনার একটি টেবিল বেছে নেন যা বেশিরভাগ সময় সুন্দর বীট দেয় তবে অতিরিক্ত পয়েন্ট।

আপনি যদি চান তবে আপনি আসল বিটগুলি ব্যবহার করতে পারেন (বহু ভাষায় পাইথনের মডিউলের .wavমতো ফাইলগুলি খোলার পক্ষে সহজ wave) এবং সংগীত উত্পন্ন করতে পারেন! এখানে কিছু নিখরচায় নমুনা বীট দেওয়া আছে।

প্রয়োজনে আমি একটি রেফারেন্স বাস্তবায়ন পোস্ট করতে পারি।


আপনি কি ম্যাট্রিক্সের প্রিপ্রোসেসড ফর্মগুলিকে অনুমতি দিচ্ছেন? অর্থাত্, এমন একটি ফর্ম যার মধ্যে সংখ্যাগুলি আর ঘটে না?
হ্যান্স-পিটার স্টার

@hstoerr হ্যাঁ আপনি যদি এটি চান তবে এটি ফাংশন আর্গুমেন্ট হিসাবে রাখতে পারেন
জেবার্নার্ডো

দয়া করে আমাদের র্যান্ডম শেয়ার করার জন্য একটি ফাইল হোস্টিংয়ের পরামর্শ দিন। WAVs :)
ডঃ বেলিসারিয়াস

@ বিলেসারিয়াস ওয়েল আমি জানি যে সানক্লাউড তার পক্ষে ভাল তবে আপনি যে কোনও ফাইল হোস্টিং ব্যবহার করতে পারেন।
জেবার্নার্ডো

মডেলটিতে একাধিক নোটের উপসর্গগুলি ব্যবহার করা গ্রহণযোগ্য হবে?
স্পার

উত্তর:


6

আমি এই ট্র্যাকগুলি তৈরি করেছি:

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

নিম্নলিখিত রূপান্তর ম্যাট্রিক্স ব্যবহার করে:

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

ম্যাথমেটিকায় এবং নিম্নলিখিত প্রোগ্রাম:

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]

ওহ্হ দারুন. আমি কিছু শব্দ করার চেষ্টাও করেছি, তবে আমার মনে হয় আমি যে প্রহার করেছি তা নিয়ে কিছু ভুল ছিল (তাদের মধ্যে কিছুটা নীরবতা ছিল)।
জবার্নার্ডো

দেখে মনে হচ্ছে আপনি
মারাকে সুপারপজ করেছেন

@ জেবার্নার্ডো নমুনায় চারটি "কর্ড" রয়েছে: 1) "ফাঁদ", 2) Sla "থাপ্পড়" এবং "শ্যাচার"}, 3) Open "ওপেনট্রিঙ্গল" এবং "মারাকাস"}, 4) "রাইডবেল"; এটি সেখানে আপনি শুনছেন এমন
সুপারপজিশন

3

জার্মান হওয়ার কারণে, আমাদের ভাষার এই সৃজনশীল আপত্তি শুনে হাসতে হাসতে আমি প্রায় চেয়ার থেকে নামছিলাম। :-)

এখানে কিছু স্কেলা। আমি একটি মানচিত্রে সম্ভাব্যতাগুলি এনকোড করছি যা উত্তরাধিকারী বীটের তালিকায় থাকা বীটকে মানচিত্র করে যেখানে তার সম্ভাবনার সাথে আনুপাতিক আনুপাতিক আনুপাতিকভাবে প্রহার ঘটে। বীটের একটি অসীম অলস মূল্যায়ন স্ট্রিম তৈরি করা হয়, যার প্রথম 10 বিট প্রথম আউটপুট বিটের উপযুক্ত এলোমেলোতা পেতে এড়িয়ে যায়। আমরা সেই স্ট্রিমের শুরু থেকেই উপযুক্ত সংখ্যক প্রহারটি ফিরিয়ে দিই। আমি সংক্ষিপ্ত এবং জেনেরিক হতে প্যারামিটার টি টাইপ ব্যবহার করি।

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)
}

যাকে এরকম বলা যেতে পারে:

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

আমি একটি জাভাস্ক্রিপ্ট ফাংশন লিখেছি। তবে এটি নিজেই বীটবক্সিং শুরু করেছে ...

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;}

ব্যবহারের উদাহরণ: bschk(20,'pv jk bschk kkkk'.split(' '),[[.1,.4,.5,0],[.3,.2,.3,.2],[0,.3,.2,.5],[.1,.8,.1,0]])


0

পাইথনে কেবল একটি রেফারেন্স বাস্তবায়ন:

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)

এবং একটি পরীক্ষা প্রোগ্রাম:

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))

এবং কিছু ফলাফল:

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

তবে এর মধ্যে কেউই খুব ভাল একটি বীটবক্স তৈরি করে না কারণ সেখানে অনেক বেশি kkkk:)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.