ASCII Skorları


27

Temp klasörünüzün derinliklerinde dolaşırken, piyano için bazı besteler bulabilirsiniz. Ne yazık ki, bu kompozisyonlar sadece not isimleri ve süreleri ile yazılmıştır ve sadece bir metin terminaline erişiminiz vardır. Bu nedenle, göreviniz kompozisyonları ASCII sanatı olarak göstermek için bir program yazmak.

Giriş

Programınız giriş olarak iki dizeyi kabul etmelidir. İlk dize üst kadro notlarını (tiz nota anahtarı ile) temsil ederken, ikinci dize alt kadro notlarını temsil edecektir.

Notlar bilimsel adımlarda gösterilecektir . Üst kadro notları her zaman arasında C4ve C6dahil olacaktır. Alt kadro notları her zaman arasında C2ve C4dahil olacaktır.

Her nota biri olacak bir süre, birlikte gelir: 1, 2, 4, 8. Bunlar sırasıyla tam bir notayı (semibreve), yarım notayı (minim), çeyrek notayı (kasık) ve sekizinci notayı (tuhaf) gösterir.

Başka bir sürenin notları girdide asla görünmeyecektir.

Notun ve sürenin nasıl ayrıldığı ve her notun girişteki diğer notlardan nasıl ayrıldığı sizin takdirinize bağlıdır. Aşağıdakiler üst düzey personel için örnek bir girdidir:

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

Burada, notlar boşlukla ayrılır ve süre, nottan eğik çizgi ile ayrılır. Bu sınırlayıcılar sabit değildir ve bunları değiştirmeyi ya da tamamen atlamayı tercih edebilirsiniz.

Her personelde en az bir not olduğunu varsayabilirsin. Girişte hiç dinlenme yok.

Çıktı

Programınız, aşağıdaki açıklamalara uygun olarak, skoru ASCII sanatı olarak göstermektir.

Çıktılarınızın solundaki ilk şey nota anahtarı olmalıdır (iki asanın arasındaki mesafenin değişmemesi gerekir):

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





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

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

Not bir personelin orta çizgisinin altındaysa, bir notun gövdesi (dairenin yanındaki dikey çizgi) yukarı bakmalıdır. Not, bir personelin orta çizgisinin üzerinde ise aşağı doğru işaret etmelidir. Not orta çizgideyse, gövde her iki yöne de gelebilir. (Bunun tek istisnası, ikramiye içindir ve sekizinci notları sonradan tarif ederken bağlarken ortaya çıkar). Kök, dairenin üstündeki / altındaki çizgide başlamalı ve 6çizgiler uzun olmalıdır.

Bütün notlar hariç her türlü notta kaynaklanıyor. Sekizinci notun bayrağı, farklı çizgilerdeki iki eğik çizgiyle temsil edilir (aşağıdaki örnek notlara bakın).

Doldurulmuş bir not başlığı (çeyrek ve sekizinci notlar için) ile gösterilir (@). Boş bir not başı (yarım ve tam notalar için) ile temsil edilir ( ).

Kazalar (keskin uçlar, düzlükler, doğal maddeler), örnek notlarda gösterildiği gibi, kazayla sağ taraf ile not başının sol tarafı arasında tam olarak bir karakter olacak şekilde yerleştirilmelidir.

Defter çizgileri gerektiğinde kullanılmalı 7ve not başlığı çevresinde ortalanmış uzunlukta karakterlerden oluşmalıdır .

Her notun 12karakterleri geniş olması gerekir .

Örnek notlar:

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

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

12 karakterlik nottan sonra, not çeyrek not ise 2 * 12 - 12 = 12karakterleri boş bırakın (hatta veya -satıra bağlı olarak). Not yarım not ise 4 * 12 - 12 = 36karakterleri boş bırakın . Not bir not ise, 8 * 12 - 12 = 84karakterleri boş bırakın . Sekizinci notalar için fazladan karakter eklemeyin.

Her ölçünün sonunda (nota anahtarı veya çubuk çizgisinden sonra 96 ​​karakter), bir çubuk çizgisi oluşturur. Bu, en üstteki ve en alttaki satırlar (herşey dahil) arasındaki her karakteri aşağıya ve ile |ve -ile değiştirerek yapılır +. (Sorunun altındaki örnek çıktıya bakın).

Parçanın sonunda, art arda 3 bar çizgi çıkartarak, ancak birinci ile ikinci arasında bir boşluk bırakarak müziğin sonunu verin. Yani:

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

Keskinliklerin, düzlüklerin ve doğalların ölçü sonuna kadar dayandığını unutmayın. Doğal işaret, yalnızca aynı önlemde daha önce kullanılan keskin veya düz olanları iptal etmek için kullanılmalıdır.

Bu görevin amacı için, keskin uçlar, yassılar ve doğal maddeler sadece bir oktavdaki ve bir notadaki notu etkiler (A5 keskinliği A4'ün keskinleşmesine neden olmaz ve üst kadrodaki C4'te düzlük olmaz C4 alt kadroda düzleşir).

Sadece bonus için bilgi

Bonus, sekizinci notaların doğru şekilde bağlanmasını içerir.

Çeyrek nota vuruşuyla aynı hizada olan iki ardışık sekiz nota olduğunda (diğer bir deyişle, ilk sekizinci notadan önceki karakter sayısı 24'ün katıdır), iki sekizinci nota bağlanmalıdır.

Not A personelin ortasından en uzaktaki not olmalıdır. Her iki not da ortala aynı mesafedeyse, notlardan biri A notu olabilir . Diğer notun notu B olsun .

Her iki sapın yönü, A notunun gövdesinin yönü olmalıdır .

Notlardan birinin 6gövdesi, (genel olarak saplamalar için olduğu gibi) yüksek çizgiler içermeli ve diğer notun gövdesi, diğer notun ucuna kadar uzatılmalıdır.

Sapları ile bağlantılı olmalıdır _.

Örnek bağlı sekizinci notlar:

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

Örnek giriş ve çıkış

Giriş :

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

Çıktı :

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

Gösteri uğruna, üçüncü önlemde, F#sekizinci notalar birbirine bağlanırken, sekizinci notalar birbirine bağlanmaz G#. Programınız, uygulanabilir olduğunda (bonus için) sekizinci notları birleştirmeli veya hepsini bağlantısız bırakmalıdır.

Diğer bilgiler

  • Herhangi bir sondaki boşluk / satır miktarı kabul edilebilir.
  • Notalardan önce fazladan boşluk kalmamalı, notlar arasında boşluk kalmamalı. Çıktıdan önce / sonra herhangi bir sayıda boş satır yayılabilir.
  • Sekizinci notları bağlamak için bonus 0.75 * kaynak kod bayt sayısıdır .
  • Bu , yani en kısa kod kazanır.

Örneklerinizden birinin orta kısmındaki (tiz notağını varsayarsak) ortadaki tutacağı doldurmadınız.
Muzer

@Muzer Teşekkürler, düzeltildi.
es1024

Ayrıca şunu söylemeliyim ki, ne güzel bir meydan okuma. Şu anda bir giriş yazmak için kendime vaktim yok ama insanların ne elde ettiğini görmekle çok ilgileniyorum. (Not:
Zil sesini

@steveverrill Doğru, düzeltildi.
es1024

7
Bu harika! Sert, ama muhteşem.
kirbyfan64sos

Yanıtlar:


15

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

Haha! Batıdaki en hızlı silah?

Bu doğru olarak golf oynamaktan FAR, ama en azından çalışıyor. Bunu yayınladığın an, en kısa giriş, yani ... yay?

Bu kadar büyük bir şeyi asla golf yapmadığımı söyleyerek başlayayım ve nereden başlayacağımı bile bilmiyorum.

Bu giriş yapar değil henüz bonus puan içeriyor, ama hala gibi golf önce eklemek istiyorum.

Temel olarak, her bir "bloğu" oluşturan 2B biçimindeki karakterleri saklayan bir tür ASCII oluşturma sınıfı yazdım, böylece 2B ızgarasının üzerine herhangi bir sayıda farklı "sembol" çizilebilir. Not blokları için önce personel, sonra gerektiğinde çubukları uzatan herhangi bir personel, daha sonra not başlığı, ardından gövde ve kuyruk (uygunsa) ve kazara sonuncusu çekildi.

Trebble ve bas nota anahtarı için aşağıdaki iki giriş verildiğinde:

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

Aşağıdaki çıktı sonuçları:

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

İşte çalışan bir sürümBu, bazı sahte giriş kodlarına sahip kodun .

grandstaff.py

Hem trebble hem de bas nota anahtarı kadrosu içerir ve ikisi arasındaki barileri çizen tutamaçları içerir.

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

Tek bir kadro. Notları, çizgileri, notaları vb. Temsil eden bir "Blok" nesnesi dizisi içerir. Bu sınıf, notların boşluğunu ve uygun yerlerde çubukların yerleştirilmesini işler.

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

Bu sınıf, ASCII metninin "renderini" (veya belki kompozisyonunu) işler. İçinde trebble ve bas nota anahtarı, boş bir kadro, barline, kaza ve farklı sürelerde notlar oluşturmak için gerekli parçalar gibi kodlanmış semboller bulunur. Bunlar, son ASCII bloğunu üretmek için sıralı sırayla "piksel" karakterinin 2B ızgarasına "çizilir".

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

Bu sınıf, bir GrandStaff örneği oluşturarak, verilen dize girişlerini geçen ve onun dize değerini yazdırarak programı "çalıştırır".

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

print (GrandStaff(sys.argv[1],sys.argv[2]))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.