# -*- coding: ISO-8859-1 -*- """ capellaScript -- Copyright (c) 2004-2008 Hartmut Ring >>> Histogramm der Notenhöhenverteilung Die Notenhöhenverteilung wird in einer HTML-Datei angezeigt.|| Vom höchsten bis zum tiefsten vorkommenden Halbton wird je eine Zeile mit der Bezeichnung der Tonhöhe und einem Balken für die Anzahl angezeigt. <<< Histogram of ocurring pitches

The histogram is shown in an HTML file.

This script ist an extension of the demo script Histogramm-SAX taking transposing instruments into account.

Histogram van toonhoogte verdeling

Het histogram wordt in een HTML bestand getoond.

Van de hoogste tot de laagste voorkomende halftoon wordt een regel met de aanduiding van de toonhoogte en een balk met het aantal getoond.

Histogramm der Notenhöhenverteilung

Die Verteilung der Notenhöhen wird in einer HTML-Datei angezeigt.

Vom höchsten bis zum tiefsten vorkommenden Halbton wird je eine Zeile mit der Bezeichnung der Tonhöhe und einem Balken für die Anzahl angezeigt.

""" english = { "htmlTitle" : "Pitch histogram of", "export" : "Histogram export", "save" : "Please save score before exporting!", "target" : "Histogram export to:", "Histogram" : "Histogram"} dutch = { "htmlTitle" : "Verdeling van de toonhoogten in", "export" : "Histogram export", "save" : "Sla het bestand op voor exporteren!", "target" : "Histogram export naar:", "Histogram" : "Histogram"} german = { "htmlTitle" : "Verteilung der Notenhöhen in", "export" : "Histogramm-Export", "save" : "Bitte erst Datei speichern!", "target" : "Histogramm-Export nach:", "Histogram" : "Histogramm"} try: setStringTable( ("en", english), ("nl", dutch), ("de", german)) except: def tr(s): return german[s] #------------------------------------------------------------------- import os, tempfile, zipfile, xml.sax capFile = "" class HistogramExport (xml.sax.handler.ContentHandler): def __init__(self, outputFile): self.f = outputFile def startDocument(self): global capFile self.pitches = {} self.f.write("\n%s\n\n" % capFile) self.f.write("

" + tr("htmlTitle") + "
%s

\n" % capFile) self.f.write("\n") self.inHead = False self.chromatic = 0 self.staffLayout = None self.transpositions = {} self.transpositionStep = 0 def startElement(self, name, attrs): if name == "head": self.inHead = True p = attrs.getValue("pitch") i = "CDEFGAB".find(p[0]) self.chromatic = (0,2,4,5,7,9,11)[i] + 12 * int(p[1]) elif self.inHead and name == "alter": if "step" in attrs.keys(): self.chromatic += int(attrs.getValue("step")) # Transpositionen aus Layout speichern elif name == "staffLayout": self.staffLayout = attrs.getValue("description") elif name == "sound": assert self.staffLayout != None if "transpose" in attrs.keys(): self.transpositions[self.staffLayout] = int(attrs.getValue("transpose")) # Beim Start einer Notenzeile Transposition nachschlagen elif name == "staff": staffLayout = attrs.getValue("layout") self.transpositionStep = self.transpositions.get(staffLayout, 0) def endElement(self, name): if name == "head": self.chromatic += self.transpositionStep if self.chromatic in self.pitches: self.pitches[self.chromatic] += 1 else: self.pitches[self.chromatic] = 1 self.inHead = False # Transpositionen aus Layout speichern elif name == "staffLayout": self.staffLayout = None def endDocument(self): if getLocale()[:2] == "de": scale = ("C", "Cis", "D", "Dis", "E", "F", "Fis", "G", "Gis", "A", "B", "H") else: scale = ('C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B') allPitches = self.pitches.keys() minPitch = 0 maxPitch = -1 if len(allPitches) > 0: minPitch = min(allPitches) maxPitch = max(allPitches) pitch = maxPitch while pitch >= minPitch: octave = pitch // 12 note = scale[pitch % 12] if octave > 3: # kleine Oktave (4) oder höher note = note.lower() # Kleinbuchstaben if octave > 4: # hochgestellte Ziffer anhängen note += "%d" % (octave-4) elif octave < 3: # tiefer als große Oktave (3): tiefgestellte Ziffer anhängen note += "%d" % (3-octave) count = self.pitches.get(pitch, 0) self.f.write('\n' % (note, count * "|", count)) pitch -= 1 self.f.write("
%s%s %d
\n") self.f.write("

\n") #----------------------------------------------------------------------- if activeScore(): capFile = activeScore().pathName() if capFile == "": messageBox(tr("export"), tr("save"), 4) else: htmlFile = os.path.splitext(capFile)[0] + "-%s.html" % tr("Histogram") messageBox(tr("target"), htmlFile, 2) tempFile = tempfile.mktemp(".capx") activeScore().write(tempFile) z = zipfile.ZipFile(tempFile, "r") f = file(htmlFile, "wt") handler = HistogramExport(f) s = z.read("score.xml") z.close() xml.sax.parseString(s, handler) f.close() os.remove(tempFile)