Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Brick.py
diff options
context:
space:
mode:
Diffstat (limited to 'Brick.py')
-rw-r--r--Brick.py194
1 files changed, 194 insertions, 0 deletions
diff --git a/Brick.py b/Brick.py
new file mode 100644
index 0000000..5d6a1b7
--- /dev/null
+++ b/Brick.py
@@ -0,0 +1,194 @@
+import random
+from copy import deepcopy
+
+class Brick:
+ def minusone(self, n1, n2):
+ array = [[-1 for i in range(n2)] for j in range(n1)]
+ return array
+
+ def zeros(self, n1, n2):
+ array = [[0 for i in range(n2)] for j in range(n1)]
+ return array
+
+ def zeros3(self, n1, n2, n3):
+ array = [[[0 for i in range(n3)] for j in range(n2)] for k in range(n1)]
+ return array
+
+ def __init__(self, w, h, platform, mp):
+
+ self.platform = platform
+# self.top = self.minusone(w, h)
+
+ self.map = self.zeros3(8, w, h)
+ self.cut = self.zeros3(8, w, h)
+
+ self.filename = ""
+ self.ngrid_h = w
+ self.ngrid_v = h
+
+ self.title = ""
+ self.description = ""
+ self.note = ""
+ self.sval = 0.5
+ self.scale_mode = 0
+ self.key_shift = 0
+ self.author = ""
+ self.brick_type = 0 # 0: normal(pitch) 1: scale 2: rhythm
+
+ self.is_blank = 1
+# self.width = self.ngrid_h/2 * self.gridw # width for empty score = 1/2 full score width
+# self.swid = self.ngrid_h/2
+ self.swid = 27
+ self.width = self.swid # width for empty score = 1/2 full score width
+
+ self.cx, self.cy = 0, 0
+
+ self.main = mp
+
+ def clear_self(self):
+ self.is_blank = 1
+ self.filename = ""
+ self.swid = 27
+ self.width = self.swid
+ self.scale_mode = 0
+ self.key_shift = 0
+
+ def copy_brick(self, brick):
+ if brick.is_blank == 1:
+ self.clear_self()
+ return
+ self.is_blank = 0
+ self.filename = brick.filename
+ self.brick_type = brick.brick_type
+ self.swid = brick.swid
+ self.width = brick.width
+ self.scale_mode = brick.scale_mode
+ self.key_shift = brick.key_shift
+ self.sval = brick.sval
+ self.map = deepcopy(brick.map)
+ self.cut = deepcopy(brick.cut)
+ self.cx = brick.cx
+ self.cy = brick.cy
+
+ def clear_score(self):
+ w = self.ngrid_h
+ h = self.ngrid_v
+# self.top = self.minusone(w, h)
+ self.map = self.zeros3(8, w, h)
+ self.cut = self.zeros3(8, w, h)
+
+ def dump_score(self, map, cut, mode, shift):
+ # update width
+ x0, x1 = -1, -1
+ y0, y1 = -1, -1
+ self.clear_score()
+ for k in range(self.ngrid_h):
+ for i in range(8):
+ for j in range(self.ngrid_v):
+ if map[i][k][j] != 0:
+ if x0 == -1:
+ x0 = k
+ x1 = k
+ if y0 == -1 or j < y0:
+ y0 = j
+ if y1 == -1 or j > y1:
+ y1 = j
+ self.map[i][k-x0][j] = map[i][k][j]
+ self.cut[i][k-x0][j] = cut[i][k][j]
+ self.swid = x1-x0+1
+ self.width = self.swid
+ self.scale_mode = mode
+ self.key_shift = shift
+ (self.cx, self.cy) = ((x1-x0)/2, (y1+y0)/2)
+ self.is_blank = 0
+
+ def read_score(self, filename, score):
+ if filename == self.filename:
+ return
+ (map, cut, a, self.scale_mode, self.key_shift, type, author, self.title, self.description, self.note) = score.read_score("myscore/"+filename)
+ self.filename = filename
+ self.brick_type = type
+ self.author = author
+ self.dump_score(map, cut, self.scale_mode, self.key_shift)
+ self.sval = a
+
+ def filename_generator(self):
+ if self.brick_type == 0:
+ name = self.main.username + "_0_" + str(self.scale_mode) + "_br" + str(random.randint(0, 9999999)) + ".mpb"
+ else:
+ name = self.main.username + "_2_0_br" + str(random.randint(0, 9999999)) + ".mpb"
+ print "filename generated: " + name
+ return name
+
+ def write_score(self, score): # generate a filename and save
+ self.filename = self.filename_generator()
+ score.write_score("myscore/" + self.filename, self.map, self.cut, self.main.toolbar.sval, self.scale_mode, self.key_shift, self.brick_type)
+
+ def is_pitch_brick(self):
+ for k in range(self.ngrid_h):
+ for j in range(self.ngrid_v):
+ for i in range(7):
+ if self.map[i][k][j] != 0:
+ return True
+ return False
+
+ def is_rhythm_brick(self):
+ for k in range(self.ngrid_h):
+ for j in range(self.ngrid_v):
+ if self.map[7][k][j] != 0:
+ return True
+ return False
+
+ def play_music(self):
+# print "play brick..."
+ csound = self.main.csound
+ if csound.status != 1:
+ return
+ if self.is_blank == 1:
+ return
+ score = self.main.score
+ score.startSessionTime = score.currentTime
+# if self.play_state == -1:
+# self.main.canvas.highlight_grid(True)
+ if self.brick_type == 1 or self.brick_type == -1 or self.filename.endswith("mps") or score.play_continue != -1:
+ score.play_continue = -1
+ score.time_continue = 99999999
+ csound.sendClearLines()
+# self.startSessionTime = self.currentTime
+
+ div = 0.1 * pow(6.25, 1-self.sval)
+# print "%.2f %.2f" % (self.sval, div)
+ (events, st, et) = score.score2events(self.map, self.cut, div)
+# self.backup_events = events
+ score.ecnt = len(events) #length
+ limit = 144
+ if st != -1:
+ if score.ecnt > limit:
+ t = limit
+ score.play_continue = limit
+ score.time_continue = events[limit][1] + score.currentTime - 0.5
+ score.backup_events = events
+ else:
+ t = score.ecnt
+ score.play_continue = -1
+ score.time_continue = 99999999
+ for i in range(t):
+ if events[i][0] == 8:
+ estr = "i" + str(events[i][0]) + " " + str(events[i][1]) + " " + str(events[i][2]) + " " + str(events[i][3]) + " " + str(events[i][4])
+ elif events[i][0] == 7:
+ n = score.note2str(score.map_scale2(events[i][4],self.scale_mode,self.key_shift-12))
+ estr = "i" + str(events[i][0]) + " " + str(events[i][1]) + " " + str(events[i][2]) + " " + str(events[i][3]) + " " + str(n)
+ else:
+ n = score.note2str(score.map_scale2(events[i][4],self.scale_mode,self.key_shift))
+ estr = "i" + str(events[i][0]) + " " + str(events[i][1]) + " " + str(events[i][2]) + " " + str(events[i][3]) + " " + str(n)
+ csound.sendLinevt(estr)
+# self.sendEvents()
+# self.play_time = 0
+# self.play_state = -1
+# self.score_start_time = st
+# self.score_end_time = et
+# else:
+# self.play_state = -2
+
+# if _showCSoundMsg:
+# print "Playing CSound Music..."