ITM
Euclidean Rhythm
Basic paper: The Euclidean Algorithm Generates Traditional Musical Rhythms
Python code
# Making Euclidean Rhythm with Bjorklund's distribution
# by hTaka
import sys
class EuclideanRhythm:
def getRhythm(self,steps,hit,shift):
self.result = ""
if hit > steps:
raise NameError("Number of hit must less than steps")
pause = steps - hit
leftUnit = "X"
rightUnit = "."
print "process>{0}|{1} / left:{2} right:{3}".format(("["+leftUnit+"]") * hit , ("["+rightUnit+"]") * pause , hit , pause)
self.makeEuclidRhythm(hit,pause,leftUnit,rightUnit)
if abs(shift)%steps != 0:
print "Result> Steps:{0} hit:{1} shift:{2} [{3}] (before shift)".format(steps,hit,shift,self.result)
self.shiftRhythm(steps,shift)
return self.result
def makeEuclidRhythm(self,numL,numR,leftUnit,rightUnit):
unitBuffer = leftUnit
if numR==0 or numR == 1:
self.result = leftUnit * numL+ rightUnit * numR
return
if numR > numL:
m,k = numR,numL
isRightRemain = True
leftUnit += (rightUnit * (m // k))
else:
m,k = numL,numR
isRightRemain = False
leftUnit += rightUnit
if isRightRemain:
print "process>{0}|{1} / left:{2} right:{3} {4} {5}".format(("["+leftUnit+"]") * k, ("["+rightUnit+"]") * (m % k), k , m%k ,"RightUnit Remain with" , "[" + rightUnit + "]")
self.makeEuclidRhythm(k,m%k,leftUnit,rightUnit)
else:
print "process>{0}|{1} / left:{2} right:{3} {4} {5}".format(("["+leftUnit+"]") * k, ("["+unitBuffer+"]") * (m - k), k, m-k,"RightUnit Replace with Left" , "[" + unitBuffer + "]")
self.makeEuclidRhythm(k,m-k,leftUnit,unitBuffer)
def shiftRhythm(self,steps,shift):
if shift > 0:
shift = shift % steps
self.result = "{0}{1}".format(self.result[steps - shift :],self.result[0 : -1 * shift])
if shift < 0:
shift = (abs(shift) % steps)
self.result = "{0}{1}".format(self.result[shift :],self.result[0 : shift])
return
def main(arg):
try:
steps = int(arg[1])
hit = int(arg[2])
shift = int(arg[3])
except:
print "Args error! usage: python EuclideanRhythms.py <STEPS> <HIT> <SHIFT>"
print "using hard coded params."
steps,hit,shift = 16,7,0
rhythm = EuclideanRhythm()
print "Result> Steps:{0} hit:{1} shift:{2} [{3}]".format(steps,hit,shift,rhythm.getRhythm(steps,hit,shift))
if __name__ == '__main__':
main(sys.argv)
Result
process>[X][X][X][X][X][X][X]|[.][.][.][.][.][.][.][.][.] / left:7 right:9 process>[X.][X.][X.][X.][X.][X.][X.]|[.][.] / left:7 right:2 RightUnit Remain with [.] process>[X..][X..]|[X.][X.][X.][X.][X.] / left:2 right:5 RightUnit Replace with Left [X.] process>[X..X.X.][X..X.X.]|[X.] / left:2 right:1 RightUnit Remain with [X.] Result> Steps:16 hit:7 shift:0 [X..X.X.X..X.X.X.]
花見
昨日今日と天気予報は雨だったんですけど、日中は晴れましたね。
昨日は会社で花見。今日は大阪城までブラブラ歩いて。

腰はバキバキ。
さむっ
ひさしぶりに更新すると思ったら、オテンキのはなしですか?と。
ここ大阪で積もることなんてめったに無いですから、オッサンになってもテンション上がりますよね。まぁそれも家出るまでの話ですが。

晴れて来て、雨も降ってないのにそこかしこの雨どいから雪解け水がジャバジャバ出る音を聞くとヘンな胸騒ぎがするのは僕だけでしょうか。
なんせ寒い。
よいお年を!
今年のブログ7件!少なっ!
遅くなりましたが今年嬉しかった事の一つがこれっ!
庄野須賀様の歌集の「揺れてゐる」の装画にこのブログに2006年(!!)投稿のグラフィックを採用していただきました。90歳になられるおばあちゃんの作品集やぜっ!まさかProse55ingでジェネレートされたCGが採用されるとはね!
あらためて少しずつでも、つくり発信し続ける事が大切だと思い知らされました。
来年はもうちょっと記事が増やせるよう頑張ります!
「揺れてゐる」[Amazon.co.jp]



