ASCII-Scores

27

In den Tiefen Ihres temporären Ordners finden Sie einige Kompositionen für das Klavier. Leider wurden diese Kompositionen nur mit Notennamen und -dauer geschrieben, und Sie haben nur Zugriff auf ein Textterminal. Ihre Aufgabe ist es daher, ein Programm zu schreiben, mit dem die Kompositionen als ASCII-Kunst dargestellt werden.

Eingang

Ihr Programm sollte zwei Zeichenfolgen als Eingabe akzeptieren. Die erste Saite repräsentiert die Noten des oberen Notensystems (mit dem Violinschlüssel), während die zweite Saite die Noten des unteren Notensystems repräsentiert.

Die Noten werden in wissenschaftlicher Tonhöhennotation weitergegeben . Die Notizen des obersten Personals werden immer zwischen C4und C6einschließlich sein. Die Notizen des unteren Personals werden immer zwischen C2und C4einschließlich sein.

Jede Note wird mit einer Dauer kommen, die sein: 1, 2, 4, 8. Diese repräsentieren eine ganze Note (Semibreve), eine halbe Note (Minim), eine Viertelnote (Crotchet) bzw. eine Achtelnote (Quaver).

Noten mit einer anderen Dauer werden niemals in der Eingabe angezeigt.

Wie die Note und die Dauer getrennt werden und wie jede Note von anderen Noten in der Eingabe getrennt wird, liegt in Ihrem Ermessen. Das Folgende ist ein Beispiel für die Eingabe der Top-Mitarbeiter:

E4/4 A4/8 C#5/8 E5/2

Hier sind die Noten durch ein Leerzeichen und die Dauer durch einen Schrägstrich von der Note getrennt. Diese Begrenzungslinien sind nicht festgelegt, und Sie können sie ändern oder ganz weglassen.

Sie können davon ausgehen, dass in jedem Notensystem mindestens eine Notiz vorhanden ist. Die Eingabe enthält keine Pausen.

Ausgabe

Ihr Programm soll die Partitur als ASCII-Grafik ausgeben, die den folgenden Beschreibungen entspricht.

Die Schlüssel sollten als erstes links von Ihrer Ausgabe stehen (der Abstand zwischen den beiden Notenzeilen sollte nicht geändert werden):

       ^    
      | |   
------|/----
      /     
-----/|-----
    / |     
---/--__----
   | /  \   
---\-\|-|---
    \ | /   
------|-----
      |     
    \_/     





----___-----
   /   \ |  
---\---|----
       | |  
-------/----
      /     
-----/------

------------

Der Stiel einer Note (die vertikale Linie neben dem Kreis) sollte nach oben zeigen, wenn sich die Note unter der Mittellinie eines Notensystems befindet. Es sollte nach unten zeigen, wenn sich die Note über der Mittellinie eines Notensystems befindet. Befindet sich die Note in der Mittellinie, kann der Stiel in beide Richtungen zeigen. (Die einzige Ausnahme hiervon betrifft den Bonus und tritt auf, wenn die später beschriebenen Achtelnoten verbunden werden.) Der Stiel sollte in der Linie über / unter dem Kreis beginnen und 6hoch sein.

Alle Arten von Noten mit Ausnahme ganzer Noten haben Stiele. Das Flag einer Achtelnote wird durch zwei Schrägstriche in verschiedenen Zeilen dargestellt (siehe Beispielnotizen unten).

Ein ausgefüllter Notenkopf (für Viertelnoten und Achtelnoten) wird durch dargestellt (@). Ein leerer Notenkopf (für halbe und ganze Noten) wird durch dargestellt ( ).

Zufällige Zeichen (scharfe, flache, natürliche Zeichen) sollten wie in den Beispielnotizen gezeigt mit genau einem Zeichen zwischen der rechten Seite des zufälligen und der linken Seite des Notenkopfs platziert werden.

Hauptbuchzeilen sollten bei Bedarf verwendet werden und 7Zeichen umfassen, die um den Notenkopf zentriert sind.

Jede Notiz sollte 12Zeichen breit sein.

Beispiel Notizen:

                                         |_                    
                                         |_| ( )                
                      |                    |------              
                      |                                         
------------ ---------|-- ------------ ------------ ------------
                      |                                         
------------ ---------|-- ---|-------- ------------ ------------
      (@)    _|_|_    |      |_                                 
-----|------ _|_|_-( )--- ---|/-(@)--- ------------ ---------|\-
     |        | |              |                             | \
-----|------ ------------ -----|------ ------------ ---------|--
     |                         |                             |  
-----|------ ------------ -----|------ ------------ ---------|--
     |                         | /                           | 
                               |/                       --(@)--

quarter note half note    eighth note  whole note   eighth note
              sharped      flatted      natural

Lassen Sie nach der 12-stelligen Notiz die 2 * 12 - 12 = 12Zeichen leer (entweder oder -abhängig von der Zeile), wenn die Notiz eine Viertelnote ist. Wenn die Note eine halbe Note ist, lassen Sie die 4 * 12 - 12 = 36Zeichen leer. Wenn die Notiz eine ganze Notiz ist, lassen Sie die 8 * 12 - 12 = 84Zeichen leer. Fügen Sie keine zusätzlichen Zeichen für Achtelnoten hinzu.

Geben Sie am Ende jedes Taktes (96 Zeichen nach dem Notenschlüssel oder dem Taktstrich) einen Taktstrich aus. Dies wird durch hinunter jedes Zeichen zwischen den obersten und untersten meisten Linien (einschließlich) durchgeführt, und das Ersetzen mit |und -mit +. (Siehe Beispielausgabe am Ende der Frage).

Geben Sie am Ende des Stücks das Musikende aus, indem Sie 3 Taktstriche hintereinander ausgeben, jedoch mit einem Leerzeichen zwischen dem ersten und dem zweiten. Das ist:

+-++
| ||
+-++
| ||
. .. 
. .. 

Beachten Sie, dass Schärfen, Abflachungen und Naturtöne bis zum Ende der Messung bestehen bleiben. Das natürliche Zeichen sollte nur verwendet werden, um eine Schärfe oder Abflachung auszugleichen, die zuvor im selben Maß verwendet wurde.

Bei dieser Aufgabe wirken sich Scharfe, Ebenen und Naturtöne nur auf eine Note in einer Oktave und in einem Notenschlüssel aus (ein Scharfzeichen auf A5 bewirkt kein Scharfzeichnen von A4 und ein Scharfzeichen auf C4 im oberen Notensystem bewirkt nichts C4 im unteren Stab abgeflacht sein).

Informationen nur für den Bonus

Der Bonus besteht darin, die Achtelnoten richtig zu verbinden.

Wenn zwei aufeinanderfolgende Achtelnoten vorhanden sind, die auf den Viertelnotentakt ausgerichtet sind (mit anderen Worten, die Anzahl der Zeichen vor der ersten Achtelnote ist ein Vielfaches von 24), müssen die beiden Achtelnoten verbunden werden.

Lassen Sie Note A die Note sein, die am weitesten von der Mitte des Stabes entfernt ist. Wenn beide Noten den gleichen Abstand von der Mitte haben, kann es sich bei jeder Note um Note A handeln . Lassen Sie die andere seine Anmerkung Anmerkung B .

Die Richtung beider Stiele sollte die Richtung des Stiels von Note A sein .

Der Stiel einer der Noten sollte 6(wie im Allgemeinen bei Stielen) gerade sein, und der Stiel der anderen Note sollte bis zum Ende des Stiels der anderen Note verlängert sein.

Die Stiele sollten mit verbunden sein _.

Beispiel verbundene Achtelnoten:

                                   ___________                            
                                  |           |                           
                                  |           |                           
                                  |           |                           
                                  |           |       --(@)--             
                            |     |           |        |                  
------------------------ ---|_----|-----------|-- -----|------------------
                            |/ (@)            |        |        |_        
------------------------ ---------------------|-- -----|--------|_|-(@)---
      (@)   _|_|_                             |        |          ||      
-----|------_|_|_-(@)--- ---------------------|-- -----|-----------|------
     |       | | |                            |        |           |      
-----|-----------|------ ---------------------|-- -----|-----------|------
     |           |                            |        |           |      
-----|-----------|------ ------------------(@)--- -----|___________|------
     |           |                                                        
     |___________|                                                        

Beispiel für Ein- und Ausgabe

Eingabe :

A#4/4 G#4/4 F#4/2 A#4/4 G#4/4 F#4/2 F#4/8 F#4/8 F#4/8 F#4/8 G#4/8 G#4/8 G#4/8 G#4/8 A#4/4 G#4/4 F#4/2
A#3/4 G#3/4 F#3/2 A#3/4 G#3/4 F#3/2 F#3/2 G#3/2 F#3/4 E#3/4 F#3/2

Ausgabe :

       ^                                                                                                                                                                                                                                                                                                                                                                                                                      
      | |            |                                                                                                |                                                                                                                                                                                                 |                                                                                          
------|/-------------|-----------------------|--------------------------------------------------------------+---------|-----------------------|--------------------------------------------------------------+----------___________-------------___________------------|\----------|\----------|\----------|\-+---------|-----------------------|--------------------------------------------------------------+-++
      /              |                       |                       |                                      |         |                       |                       |                                      |         |           |           |           |           | \         | \         | \         | \|         |                       |                       |                                      | ||
-----/|--------------|-----------------------|-----------------------|--------------------------------------+---------|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+---------|-----------------------|-----------------------|--------------------------------------+-++
    / |              |                       |                       |                                      |         |                       |                       |                                      |         |           |           |           |           |           |           |           |  |         |                       |                       |                                      | ||
---/--__----_|_|_----|-----------------------|-----------------------|--------------------------------------+_|_|_----|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+_|_|_----|-----------------------|-----------------------|--------------------------------------+-++
   | /  \   _|_|_ (@)               _|_|_    |                       |                                      |_|_|_ (@)               _|_|_    |                       |                                      |         |           |           |           |  _|_|_    |           |           |           |  |_|_|_ (@)               _|_|_    |                       |                                      | ||
---\-\|-|----|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+_|_|_----|-----------|-----------|-----------|--_|_|_-(@)---------(@)---------(@)---------(@)---+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-++
    \ | /                            | |                    _|_|_ ( )                                       |                         | |                    _|_|_ ( )                                       |_|_|_ (@)         (@)         (@)         (@)    | |                                            |                         | |                    _|_|_ ( )                                       | ||
------|------------------------------------------------------|-|--------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-|-|--------------------------------------------------------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-++
      |                                                                                                     |                                                                                                |                                                                                                |                                                                                                | ||
    \_/                                                                                                     |                                                                                                |                                                                                                |                                                                                                | ||
                                                                                                            |                                                                                                |                                                                                                |                                                                                                | ||
                                                                                                            |                                                                                                |                                                                                                |                                                                                                | ||
                                                                                                            |                                                                                                |                                                                                                |                                                                                                | ||
                                                                                                            |                                                                                                |                                                                                                |                                                                                                | ||
            _|_|_                                                                                           |_|_|_                                                                                           |                                                                                                |                                                                                                | ||
----___-----_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+------------------------------------------------_|_|_-------------------------------------------+------------------------------------------------------------------------------------------------+-++
   /   \ |   | | |                  _|_|_ (@)               _|_|_                                           | | | |                  _|_|_ (@)               _|_|_                                           |_|_|_                                           _|_|_ ( )                                       |_|_|_                                                                                           | ||
---\---|---------|-------------------|-|-|------------------_|_|_-( )---------------------------------------+-----|-------------------|-|-|------------------_|_|_-( )---------------------------------------+_|_|_-( )----------------------------------------|-|-|------------------------------------------+_|_|_ (@)---------------_|_|_-------------------------( )---------------------------------------+-++
       | |       |                       |                   | | |                                          |     |                       |                   | | |                                          | | | |                                               |                                          | | | |                  _|_|_ (@)                    |                                          | ||
-------/---------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-------------------|-|-|-----------------------|------------------------------------------+-++
      /          |                       |                       |                                          |     |                       |                       |                                          |     |                                               |                                          |     |                       |                       |                                          | ||
-----/-----------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
                                         |                       |                                          |                             |                       |                                          |     |                                               |                                          |     |                       |                       |                                          | ||
-----------------------------------------------------------------|------------------------------------------+-----------------------------------------------------|------------------------------------------+-----|------------------------------------------------------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
                                                                                                                                                                                                                                                                                                                                            |                                                                      

Zur Veranschaulichung sind im dritten Takt die F#Achtelnoten miteinander verbunden, die G#Achtelnoten jedoch nicht. Ihr Programm sollte entweder die Achtelnoten verbinden, wenn dies zutreffend ist (für den Bonus), oder sie alle getrennt lassen.

Andere Informationen

  • Jede Menge von nachgestellten Leerzeichen / Zeilen ist akzeptabel.
  • Es sollte kein zusätzliches Leerzeichen vor den Notenschlüsseln und kein Leerzeichen zwischen den Noten stehen. Vor / nach der Ausgabe können beliebig viele Leerzeilen ausgegeben werden.
  • Der Bonus für das Verbinden von Achtelnoten beträgt 0,75 * Byte Quellcode .
  • Das ist , also gewinnt der kürzeste Code.
es1024
quelle
Sie haben in einem Ihrer Beispiele den Achtel in Mittel-C (unter der Annahme eines Violinschlüssels) nicht ausgefüllt.
Muzer
@ Muzer Danke, behoben.
Es1024
Ich muss auch sagen, was für eine wundervolle Herausforderung. Ich habe im Moment keine Zeit, selbst einen Eintrag zu schreiben, aber ich bin sehr gespannt, was sich die Leute einfallen lassen. (PS: Ist es schlimm, dass ich die Melodie sofort erkannt habe?;))
Muzer
@steveverrill Du bist richtig, behoben.
es1024
7
Das ist fantastisch! Schwer, aber großartig.
kirbyfan64sos

Antworten:

15

Python - 8.85 ... KB ( 9369 9066 B)

Haha! Schnellste Waffe im ... Westen?

Dies ist weit davon entfernt, richtig Golf zu spielen, aber es funktioniert zumindest. Im Moment der Veröffentlichung ist es der kürzeste Eintrag, also ... yay?

Lassen Sie mich zunächst sagen, dass ich noch nie so viel Golf gespielt habe und nicht einmal weiß, wo ich anfangen soll.

Dieser Eintrag enthält noch nicht die Bonuspunkte, aber ich möchte das noch hinzufügen, bevor ich Golf spiele.

Ich habe im Grunde genommen eine Art ASCII-Rendering-Klasse geschrieben, die die Zeichen, aus denen jeder "Block" besteht, in einem 2D-Format speichert, sodass eine beliebige Anzahl verschiedener "Symbole" über das 2D-Raster gezeichnet werden kann. Bei Notenblöcken wurde zuerst der Stab gezeichnet, dann der Stab, der die Stäbe nach Bedarf ausdehnte, dann der Notenkopf, gefolgt von Stamm und Schwanz (falls zutreffend) und zuletzt der Zufall.

Bei folgenden zwei Eingängen für Höhen- und Tiefenschlüssel:

A#4/4 G#4/4 F#4/2 A#4/4 G#4/4 F#4/2 F#4/8 F#4/8 F#4/8 F#4/8 G#4/8 G#4/8 G#4/8 G#4/8 A#4/4 G#4/4 F#4/2
A#3/4 G#3/4 F#3/2 A#3/4 G#3/4 F#3/2 F#3/2 G#3/2 F#3/4 E#3/4 F#3/2

Die folgenden Ausgabeergebnisse:

       ^                                                                                                                                                                                                                                                                                                                                                                                                           
      | |            |                                                                                                |                                                                                                                                                                                                 |                                                                                          
------|/-------------|-----------------------|--------------------------------------------------------------+---------|-----------------------|--------------------------------------------------------------+---------------------------------------------------------|\----------|\----------|\----------|\-+---------|-----------------------|--------------------------------------------------------------+-++
      /              |                       |                       |                                      |         |                       |                       |                                      |         |\          |\          |\          |\          | \         | \         | \         | \|         |                       |                       |                                      | ||
-----/|--------------|-----------------------|-----------------------|--------------------------------------+---------|-----------------------|-----------------------|--------------------------------------+---------|-\---------|-\---------|-\---------|-\---------|-----------|-----------|-----------|--+---------|-----------------------|-----------------------|--------------------------------------+-++
    / |              |                       |                       |                                      |         |                       |                       |                                      |         |           |           |           |           |           |           |           |  |         |                       |                       |                                      | ||
---/--__----_|_|_----|-----------------------|-----------------------|--------------------------------------+_|_|_----|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+_|_|_----|-----------------------|-----------------------|--------------------------------------+-++
   | /  \   _|_|_ (@)               _|_|_    |                       |                                      |_|_|_ (@)               _|_|_    |                       |                                      |         |           |           |           |  _|_|_    |           |           |           |  |_|_|_ (@)               _|_|_    |                       |                                      | ||
---\-\|-|----|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+_|_|_----|-----------|-----------|-----------|--_|_|_-(@)---------(@)---------(@)---------(@)---+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-++
    \ | /                            | |                    _|_|_ ( )                                       |                         | |                    _|_|_ ( )                                       |_|_|_ (@)         (@)         (@)         (@)    | |                                            |                         | |                    _|_|_ ( )                                       | ||
------|------------------------------------------------------|-|--------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-|-|--------------------------------------------------------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-++
      |                                                                                                     |                                                                                                |                                                                                                |                                                                                                | ||
    \_/                                                                                                     |                                                                                                |                                                                                                |                                                                                                | ||
                                                                                                            |                                                                                                |                                                                                                |                                                                                                | ||
                                                                                                            |                                                                                                |                                                                                                |                                                                                                | ||
                                                                                                            |                                                                                                |                                                                                                |                                                                                                | ||
                                                                                                            |                                                                                                |                                                                                                |                                                                                                | ||
            _|_|_                                                                                           |_|_|_                                                                                           |                                                                                                |                                                                                                | ||
----___-----_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+------------------------------------------------_|_|_-------------------------------------------+------------------------------------------------------------------------------------------------+-++
   /   \ |   | | |                  _|_|_ (@)               _|_|_                                           | | | |                  _|_|_ (@)               _|_|_                                           |_|_|_                                           _|_|_ ( )                                       |_|_|_                                                                                           | ||
---\---|---------|-------------------|-|-|------------------_|_|_-( )---------------------------------------+-----|-------------------|-|-|------------------_|_|_-( )---------------------------------------+_|_|_-( )----------------------------------------|-|-|------------------------------------------+_|_|_-(@)---------------_|_|_-------------------------( )---------------------------------------+-++
       | |       |                       |                   | | |                                          |     |                       |                   | | |                                          | | | |                                               |                                          | | | |                  _|_|_ (@)                    |                                          | ||
-------/---------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-------------------|-|-|-----------------------|------------------------------------------+-++
      /          |                       |                       |                                          |     |                       |                       |                                          |     |                                               |                                          |     |                       |                       |                                          | ||
-----/-----------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
                                         |                       |                                          |                             |                       |                                          |     |                                               |                                          |     |                       |                       |                                          | ||
-----------------------------------------------------------------|------------------------------------------+-----------------------------------------------------|------------------------------------------+-----|------------------------------------------------------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++

Hier ist eine funktionierende Version des Codes mit etwas falschem Eingabecode, da diese spezielle Python-Web-IDE keine simulierten Eingaben oder separate Dateien zuließ.

grandstaff.py

Enthält sowohl Trebble- als auch Bassschlüsselstäbe sowie Griffe zum Zeichnen der Taktstriche zwischen den beiden.

class GrandStaff:
  def __init__(self, trebbleStr, bassStr):
    self.trebbleStr = trebbleStr
    self.bassStr = bassStr
    self.trebbleStaff = Staff("trebble", self.trebbleStr)
    self.bassStaff = Staff("bass", self.bassStr)
    self.bassOffset = 16

    self.lines = {}
    maxmin = self.trebbleStaff.getYExtremes()
    for y in range(maxmin[0], maxmin[1] + 1):
      self.lines[y] = self.trebbleStaff.lines[y]
    maxmin = self.bassStaff.getYExtremes()
    for y in range(maxmin[0], maxmin[1] + 1):
      self.lines[y + self.bassOffset] = self.bassStaff.lines[y]

    for y in range(5, 12):
      self.lines.setdefault(y, [" " for x in range(len(self.trebbleStaff.getLineStr(0)))])
      xpos = 0
      for block in self.trebbleStaff.getBlocks():
        if block.type == "barline":
          self.lines[y][xpos] = '|'
        elif block.type == "finalDoubleBarline":
          for x in [0, 2, 3]:
            self.lines[y][xpos + x] = '|'
        xpos += block.width

  def __str__(self):
    outstr = ""
    maxmin = sorted(self.lines.keys())
    for y in range(maxmin[0], maxmin[-1]):
      self.lines.setdefault(y, [" " for x in range(len(self.trebbleStaff.getLineStr(0)))])
      outstr += ''.join(self.lines[y]) + '\n'

        return outstr

staff.py

Ein einziger Stab. Enthält ein Array von "Block" -Objekten, die Noten, Taktstriche, Schlüssel usw. darstellen. Diese Klasse verwaltet den Abstand der Noten und das Einfügen der Taktstriche an den entsprechenden Stellen.

class Staff:
  def __init__(self, clef, inputStr):
    self.clef = clef
    self.inStr = inputStr
    self.lines = {}
    self.__blocks = []
    if clef == "trebble":
      self.__blocks.append(Block("trebbleClef"))
    elif clef == "bass":
      self.__blocks.append(Block("bassClef"))

    notes = inputStr.split(" ");
    measureLength = 0
    for note in notes:
      if measureLength >= 1:
        self.__blocks.append(Block("barline"))
        measureLength -= 1
      parts = note.split("/")
      noteLength = 0
      if len(parts) == 2:
          noteLength += 1 / float(parts[1])
          measureLength += noteLength
      self.__blocks.append(Block("note", note, self.clef))
      for n in range(int(noteLength * 8) - 1):
          self.__blocks.append(Block("staff"))
    self.__blocks.append(Block("finalDoubleBarline"))

    sharps = []
    flats = []
    naturals = []
    for block in self.__blocks:
      if block.type == "note":
        val = block.value

        if block.isSharp:
          if val not in sharps:
            sharps.append(val)
          else:
            block.clearAccidental()
        elif block.isFlat:
          if val not in flats:
            flats.append(val)
          else:
            block.clearAccidental()
        else:
          if val in sharps:
            sharps.remove(val)
            block.setNatural()
          if val in flats:
            flats.remove(val)
            block.setNatural()

      elif block.type == "barline" or block.type == "finalDoubleBarline":
        sharps = []
        flats = []

    maxmin = self.getYExtremes()
    for y in range(maxmin[0], maxmin[1] + 1):
      self.lines[y] = list(self.getLineStr(y))

  def getLineStr(self, lineNum):
    outstr = ""
    for block in self.__blocks:
      outstr += block.getLineStr(lineNum)
    return outstr

  def getYExtremes(self):
    maxmin = [0, 0]
    for block in self.__blocks:
      mm = block.getYExtremes()
      maxmin[0] = mm[0] if mm[0] < maxmin[0] else maxmin[0]
      maxmin[1] = mm[1] if mm[1] > maxmin[1] else maxmin[1]
    return maxmin

  def getBlocks(self):
    return self.__blocks

  def __str__(self):
    maxmin = self.getYExtremes()
    outstr = ""
    for line in range(maxmin[0], maxmin[1] + 1):
      outstr += self.getLineStr(line) + "\n"
    return outstr

block.py

Diese Klasse behandelt das "Rendern" (oder möglicherweise die Komposition) des ASCII-Texts. Darin befinden sich die hartcodierten Symbole wie der Höhen- und Tiefenschlüssel, ein leerer Stab, Taktstriche, Vorzeichen und die erforderlichen Teile, um Noten mit unterschiedlicher Dauer zu erstellen. Diese werden nacheinander auf ein 2D-Raster von Zeichen- "Pixeln" "gezeichnet", um den endgültigen ASCII-Block zu erzeugen.

class Block:

  __staff = [[range(-4, 5, 2),"w",'-']]
  __trebble = [[-6, 7, '^'], [range(-5, 6), 6, '|'], [-5, 8, '|'], [-4, 7, '/'], [-3, 6, '/'], [-2, 5, '/'], [-1, 4, '/'], [0, 3, '/'], [0, range(6,8), '_'], [1, 3, '|'], [1, 5, '/'], [1, 6, ' '], [1, 8, '\\'], [2, 3, '\\'], [2, 5, '\\'], [2, 8, '|'], [3, 4, '\\'], [3, 8, '/'], [6, 4, '\\'], [6, 5, '_'], [6, 6, '/']]
  __bass = [[-4, range(4, 7), '_'], [-3, 3, '/'], [-3, 7, '\\'], [range(-3, 0, 2), 9, '|'], [-2, 3, '\\'], [range(-2, 0), 7, '|'], [0, 7, '/'], [1, 6, '/'], [2, 5, '/']]
  __sharp = [[range(-1, 1), range(0, 5), '_'], [range(-1, 2), range(1, 4, 2), '|']]
  __flat = [[range(-2, 1), 3, '|'], [-1, 4, '_'], [0, 4, '/']]
  __natural = [[range(-1, 1), 2, '|'], [range(-1, 1), 3, '_'], [range(0, 2), 4, '|']]
  __noteOpen = [[0, 6, '('], [0, 7, ' '], [0, 8, ')']]
  __noteClosed = [[0, 6, '('], [0, 7, '@'], [0, 8, ')']]
  __stemUp = [[range(-6, 0), 9, '|']]
  __stemDown = [[range(1, 7), 5, '|']]
  __eighthTailUp = [[-6, 10, '\\'], [-5, 11, '\\']]
  __eighthTailDown = [[6, 6, '/'], [5, 7, '/']]
  __barline = [[range(-4, 5), 0, '+'], [range(-3, 4, 2), 0, '|']]
  __finalBarline = [[range(-4, 5, 2), [0, 2, 3], '+'], [range(-3, 4, 2), [0, 2, 3], '|'], [range(-4, 5, 2), 1, '-']]
  __staffExtender = [[0, range(4, 11), '-']]

  def __init__(self, type, notestr = "", clef = "trebble"):
    if type == "note":
      self.clef = clef
      self.notestr = notestr.upper().split('/')[0]
      self.duration = int(notestr.upper().split('/')[1])
      self.isSharp = True if notestr[1] == '#' else False
      self.isFlat = True if notestr[1] == 'b' else False
      self.isNatural = False;
      self.__clefCallibration = {"trebble":{"A":1,"B":0,"C":6,"D":5,"E":4,"F":3,"G":2,"octave":4}, "bass":{"A":-4,"B":-5,"C":1,"D":0,"E":-1,"F":-2,"G":-3,"octave":3}}
      self.value = self.__clefCallibration[self.clef][self.notestr[0]] + ((self.__clefCallibration[self.clef]["octave"] - int(self.notestr[-1])) * 7)

    self.lines = {}
    self.type = type

    self.__drawBlock()

  def __drawBlock(self):
    self.lines = {}
    if self.type == "note":
      self.width = 12
      self.__draw(self.__staff)

      for y in range(6, self.value + 1, 2):
        self.__draw(self.__staffExtender, y)
      for y in range(-6, self.value - 1, -2):
        self.__draw(self.__staffExtender, y)

      if self.duration in [1, 2]:
        self.__draw(self.__noteOpen, self.value)
      else:
        self.__draw(self.__noteClosed, self.value)

      if self.duration != 1:
        if self.value < 0:
          self.__draw(self.__stemDown, self.value)
          if self.duration == 8:
            self.__draw(self.__eighthTailDown, self.value)
        else:
          self.__draw(self.__stemUp, self.value)
          if self.duration == 8:
            self.__draw(self.__eighthTailUp, self.value)

      if self.isSharp:
        self.__draw(self.__sharp, self.value)
      elif self.isFlat:
        self.__draw(self.__flat, self.value)
      elif self.isNatural:
        self.__draw(self.__natural, self.value)

      # self.__draw(__staffExtender, self.value)
    elif self.type == "staff":
      self.width = 12
      self.__draw(self.__staff)
    elif self.type == "barline":
      self.width = 1
      self.__draw(self.__barline)
    elif self.type == "finalDoubleBarline":
      self.width = 4
      self.__draw(self.__finalBarline)
    elif self.type == "trebbleClef":
      self.width = 12
      self.__draw(self.__staff)
      self.__draw(self.__trebble)
    elif self.type == "bassClef":
      self.width = 12
      self.__draw(self.__staff)
      self.__draw(self.__bass)

  def __draw(self, data, yOffset = 0):
    for char in data:
        self.__drawChunk(char, yOffset)

  def __drawChunk(self, char, yOffset = 0):
      xrng = []
      yrng = []
      drawChr = char[2]

      if type(char[0]) == int:
        yrng = [char[0]]
      elif type(char[0]) == list:
        yrng = char[0]
      else:
        print("ERROR: invalid y range input")

      if type(char[1]) == str:
        if char[1] == 'w':
          xrng = range(self.width)
      elif type(char[1]) == int:
        xrng = [char[1]]
      elif type(char[1]) == list:
        xrng = char[1]
      else:
        print("ERROR: invalid x range input")

      yrng = [y + yOffset for y in yrng]

      for y in yrng:
        self.lines.setdefault(y,[" " for i in range(self.width)])
        for x in xrng:
          self.lines[y][x] = drawChr

  def getLineStr(self, lineNum):
    return "".join(self.lines.setdefault(lineNum, [" " for i in range(self.width)]))

  def getYExtremes(self):
    k = sorted(self.lines.keys())
    return [k[0], k[-1]]

  def setSharp(self):
    self.isSharp = True
    self.isFlat = False
    self.isNatural = False
    self.__drawBlock()

  def setFlat(self):
    self.isSharp = False
    self.isFlat = True
    self.isNatural = False
    self.__drawBlock()

  def setNatural(self):
    self.isSharp = False
    self.isFlat = False
    self.isNatural = True
    self.__drawBlock()

  def clearAccidental(self):
    self.isSharp = False
    self.isFlat = False
    self.isNatural = False
    self.__drawBlock()

  def __str__(self):
    strOut = ""
    first = sorted(self.lines.keys())[0]
    last = sorted(self.lines.keys())[-1]
    for line in range(first, last + 1):
        strOut += self.getLineStr(line) + "\n"
    return strOut

main.py

Diese Klasse "führt" das Programm einfach aus, indem sie eine Instanz von GrandStaff erstellt, die angegebenen Zeichenfolgeneingaben übergibt und den Zeichenfolgenwert ausgibt.

import sys
from block import *
from grandstaff import *
from staff import *

print (GrandStaff(sys.argv[1],sys.argv[2]))
Taylor Lopez
quelle