diff options
Diffstat (limited to 'Brick.py')
-rw-r--r-- | Brick.py | 194 |
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..." |