# -*- coding: ISO-8859-1 -*- """ capellaScript -- Copyright (c) 2004 Hartmut Ring >>> Taktnummern : Taktnummerierung in wählbaren Abständen Abstände, Form und Lage der Taktnummerierung werden in einem Dialog erfragt.|| Für automatische Taktnummern am Anfang jedes Systems verwenden Sie bitte die in capella eingebaute Funktion (Menü: Extras -- Taktnummerierung) <<< Anpassungen von Paul Villiger 14.05.05 - BarCount implementiert. Die Korrektur der automatischen Taktnummerierung wird berücksichtigt. Anpassung von Peter Becker 07.06.05 - Setzen von Taktnummern an der Cursorposition 13.06.05 - Bugfix Anpassungen von Paul Villiger 30.06.05 - Bugfix: Cursor innerhalb eines Taktes funktioniert - Bugfix: Cursor am Zeilenende führt nicht zu Absturz """ #---------------------------------------------------------------------------- cs = curSelection()[0] # Cursor Position als Index co = cursorObj() # NoteObj nach Cursor t = dict(type = 'rectangle', x1 = 0, y1 = 0, x2 = 0, y2 = 0, lineWidth = 0.3) t['tag'] = '2086-50' if co <> 0 and (co.isChord() or co.isRest()): # nur markieren wenn Note oder Pause co.addDrawObj(t) # NoteObj markieren #----------------------------------------------------------------------------- barNumTag = '0-1' colors = [Color.black, Color.red, Color.blue, Color.green] colorNames = ['schwarz', 'rot', 'blau', 'grün' ] def markBar(obj, n, xBar, y, color, size, colorF, sansSerif, form): dx = obj.posX() - xBar Breite = (1.2 + 1.3 * len(str(n))) * size/11.0 txt = dict( type = 'text', x = Breite/2-dx, y = y + size/22.0, content = str(n), align = 'center', font = dict(height=size, color=colors[colorF])) if sansSerif: txt['font']['face'] = 'Arial' if form == 0: txt['x'] -= size/11.0 txt['tag'] = barNumTag obj.addDrawObj(txt) else: frame = dict( type = 'rectangle', x1 = -dx, y1 = y-1.75*(size/11.0), x2 = Breite-dx, y2 = y+1*(size/11.0), lineColor = colors[color], fillColor = Color.white) if form == 2: frame['type'] = 'ellipse' group = dict( type = 'group', items = [frame, txt], #, wmf], tag = barNumTag) obj.addDrawObj(group) def getUpbeat(staff): """ ermittelt, ob die Notenzeile mit einem Auftakt beginnt. Ausschlaggebend ist dabei die erste Stimme. """ time = 0 tFirstBar = staff.defaultMeter() for obj in staff.voice(0).noteObjs(): if time == 0: if obj.subType() == NoteObj.METER: tFirstBar = obj.meter() else: if obj.subType() in (NoteObj.METER, NoteObj.KEY, NoteObj.EXPL_BARLINE): return (time < tFirstBar) elif obj.implBarline() != 0: return False time += obj.duration() return False def markBars(staff, cond, y, color, size, colorF, sansSerif, form, start=1): """ markiert alle Takte, deren Nummern das Prädikat cond erfüllen und liefert die Nummer des ersten Taktes des nächsten Systems zurück """ voice = staff.voice(0) # an erster Stimme orientieren tFirstBar = staff.defaultMeter() tLastBar = 0 n = start xBar = 0 upbeat = getUpbeat(staff) if upbeat: xBar = -1 # ersten Takt nicht zählen time = 0 setSingle = False for obj in voice.noteObjs(): #------------------------------------------------------------------------------ if step == 0: if xBar >= 0: sav_xBar = xBar # Taktstrich Position sichern for i in range(obj.nDrawObjs()): # einzelne Taktnummer ausgeben d = obj.drawObj(i) if d.has_key('tag')and d['tag'] == '2086-50': # markBar(obj, n, xBar, y, color, size, colorF, sansSerif, form) obj.deleteDrawObj(i) xBar = sav_xBar setSingle = True #------------------------------------------------------------------------------ #--- Taknummer an nächster Note oder Pause verankern --- if xBar >= 0 and (obj.isChord() or obj.isRest()): if cond(n) or setSingle: markBar(obj, n, xBar, y, color, size, colorF, sansSerif, form) setSingle = False xBar = -1 if obj.isRest(): #if obj.fullMeasures(): # n += obj.duration() - 1 if obj.fullMeasures() > 0: n += obj.fullMeasures() - 1 upbeat = False if obj.subType() in (NoteObj.METER, NoteObj.KEY, NoteObj.EXPL_BARLINE): if time == 0 and obj.subType() == NoteObj.METER: tFirstBar = obj.meter() if time > tLastBar: tLastBar = time if time >= tFirstBar: if not upbeat: n += 1 xBar = obj.posX() if time != 0: upbeat = False if obj.implBarline() != 0: upbeat = False n += 1 xBar = obj.implBarline().posX() time += obj.duration() return n options = ScriptOptions() opt = options.get() #---------------------------------------------------- #----- Dialogaufbau --------------------------------- #---------------------------------------------------- # (1) alle durch ... teilbaren Takte edit1 = Edit(opt.get('step', '5'), min=0, max=50, width=4) hBox1 = HBox([Label('alle durch'), edit1, Label ('teilbaren Takte (0 = einzelne Taktnummer)')], padding=8) #---------------------------------------------------- # (2) Vertikale Lage ... /2 Zw. über Mittellinie comboY = ComboBox([str(i) for i in range(-16,16)], value=int(opt.get('y', '10'))+16) hBox4 = HBox([Label('&Vertikale Lage'), comboY, Label('/2 Zw. über Mittellinie')], padding=8) #---------------------------------------------------- # (3) Gruppe: Schrift # (3a) Größe ... Punkt comboSize = ComboBox([str(i) for i in range(6,15)], value=int(opt.get('size', '11'))-6) hBox5 = HBox([Label('&Größe'), comboSize, Label('Punkt', width=10)], padding=8) # (3b) ohne Serifen checkS = CheckBox('ohne Serifen', value=int(opt.get('sansSerif', '0'))) # (3c) Farbe ... comboColorF = ComboBox(colorNames, width=8, value=int(opt.get('clrF', '0'))) hBoxF = HBox([Label('Farbe'), comboColorF], padding=16) # Gruppe Schrift zusammensetzen: vBoxF = VBox([hBox5, checkS, hBoxF], text='Schrift', padding=8) #---------------------------------------------------- # (4) Gruppe: Rahmen # (4a) Radiobuttons radio = Radio(['keiner','rechteckig','oval'], value=int(opt.get('form', '1'))) # (4b) Farbe ... comboColor = ComboBox(colorNames, width=8, value=int(opt.get('clr', '0'))) vBox2 = VBox([Label('Farbe'), comboColor], padding=16) # Gruppe Rahmen zusammensetzen: hBox3 = HBox([radio, vBox2], padding=4, text='Rahmen') #---------------------------------------------------- # (5) vorhandene Taktnummern entfernen ... check = CheckBox('vorhandene Taktnummern entfernen', value=int(opt.get('clear', '1'))) #---------------------------------------------------- #--- alles zusammensetzen: vBox = VBox([hBox1, hBox4, vBoxF, hBox3, check], padding=16) #---------------------------------------------------- dlg = Dialog('Taktnummerierung', vBox) if dlg.run(): activeScore().registerUndo("Taktnummerierung einfügen") step = int(edit1.value()) y = comboY.value() - 16 form = radio.value() clear = check.value() color = comboColor.value() colorF = comboColorF.value() size = comboSize.value() + 6 sansSerif = checkS.value() if clear: activeScore().deleteTaggedGraphics(barNumTag) if step >= 0: def showCond(n): if step == 0: # einzelne Taktnummer return 0 else: return n % step == 0 # regelmäßige Taktnummern n = 1 for s in activeScore().systems(): barCount = s.getBarCount() if barCount['reset'] == 1: n = 1 n = n + barCount['nAdd'] if n < 1: # Fehler bei Eingabe n = 1 n = markBars(s.staff(0), showCond, # Bedingung für Anzeige -0.5 * y, # vert. Lage color, size, colorF, sansSerif, form, # Form n) # Frequenz opt.update(dict(step=step, y=y, form=form, clear=clear, size=size, sansSerif=sansSerif, clrF=colorF, clr=color)) options.set(opt)