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..."