ASCII 점수


27

temp 폴더의 깊이를 파고 들면 피아노를위한 작곡이 있습니다. 불행히도, 이러한 작곡은 음표 이름과 지속 시간으로 만 작성되었으며 텍스트 터미널에만 액세스 할 수 있습니다. 따라서 당신의 임무는 작곡을 ASCII 아트로 표시하는 프로그램을 작성하는 것입니다.

입력

프로그램은 두 개의 문자열을 입력으로 받아 들여야합니다. 첫 번째 줄은 최고 직원의 음표 (고음 음자리표 포함)를 나타내고 두 번째 줄은 하단 직원의 음표를 나타냅니다.

노트는 과학적인 피치 표기법 으로 전달 됩니다 . 최고 직원의 메모는 항상 사이 C4C6포함됩니다. 하단 직원의 메모는 항상 사이 C2C4포함됩니다.

각 주 중 하나가 될 것입니다 기간, 함께 올 것이다 : 1, 2, 4, 8. 이들은 각각 음표 (반 음표), 반 음표 (최소), 1/4 음표 (크로 셰) 및 8 분 음표 (사분면)를 나타냅니다.

다른 지속 시간의 메모는 입력에 나타나지 않습니다.

음표와 지속 시간이 분리되는 방법 및 입력에서 각 음표가 다른 음표와 분리되는 방법은 사용자의 재량에 달려 있습니다. 다음은 최고 직원을위한 샘플 입력입니다.

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

여기에서 음표는 공백으로 분리되고 지속 시간은 슬래시로 음표와 분리됩니다. 이 삼각근은 고정되어 있지 않으므로 변경하거나 완전히 생략 할 수 있습니다.

각 직원마다 하나 이상의 메모가 있다고 가정 할 수 있습니다. 입력에 휴식이 없습니다.

산출

프로그램은 다음 설명에 따라 점수를 ASCII 아트로 출력합니다.

음자리표는 출력 왼쪽의 첫 번째 항목이어야합니다 (두 스태프 사이의 거리는 변경하지 않아야 함).

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





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

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

메모가 직원의 중간 선 아래에있는 경우 메모의 줄기 (원 옆에있는 세로선)가 위쪽을 가리켜 야합니다. 메모가 직원의 중간 선 위에 있으면 아래쪽을 향해야합니다. 메모가 가운데 선에 있으면 줄기가 어느 방향을 가리킬 수 있습니다. (이것에 대한 유일한 예외는 보너스에 대한 것이며, 나중에 설명 할 여덟 번째 음표를 연결할 때 발생합니다). 줄기는 원 위 / 아래의 선에서 시작해야하며 6키가 큰 선 이어야 합니다.

전체 노트를 제외한 모든 유형의 노트에는 줄기가 있습니다. 여덟 번째 음표의 플래그는 서로 다른 줄에 두 개의 슬래시로 표시됩니다 (아래 예제 메모 참조).

채워진 메모 헤드 (4 분의 1 및 8 분 음표)는로 표시됩니다 (@). 빈 메모 헤드 (반음 및 전체 음표)는로 표시됩니다 ( ).

실수 (예리한 부분, 평평한 부분, 자연스러운 부분)는 예제 노트에 표시된대로 실수의 오른쪽과 노트 헤드의 왼쪽 사이에 정확히 하나의 문자를 배치해야합니다.

원장 줄은 필요한 경우 사용되어야하며 7메모 헤드를 중심으로 한 문자 길이 여야합니다 .

각 노트는 12문자 너비 여야합니다 .

예제 노트 :

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

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

12 문자 참고 한 후, 떠날 2 * 12 - 12 = 12문자를 공백 (하나 또는 -라인에 따라) 메모가 분 음표 인 경우. 메모가 반음이면 4 * 12 - 12 = 36문자를 비워 두십시오. 메모가 전체 메모 인 경우 8 * 12 - 12 = 84문자를 비워 두십시오. 여덟 번째 음표에 문자를 추가하지 마십시오.

각 소절의 끝 (음자리표 또는 막대 줄 뒤에 96 자)이 막대 줄을 출력합니다. 이것은 맨과 가장 아래 라인 (포함) 사이의 모든 문자를 추락, 및 교체에 의해 이루어집니다 |-함께 +. (질문 하단의 출력 예 참조).

작품의 끝에서 3 개의 줄을 연속으로 출력하여 첫 번째와 두 번째 사이에 공백을 두어 음악 끝을 출력합니다. 그건:

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

샤프, 플랫 및 내추럴은 측정이 끝날 때까지 지속됩니다. 자연 표시는 동일한 측정에서 이전에 사용한 샤프 또는 플랫을 취소하는 데만 사용해야합니다.

이 작업을 위해 샤프, 플랫 및 내추럴은 한 옥타브 및 한 음자리표의 음표에만 영향을 미칩니다 (A5의 샤프는 A4가 샤프되지 않으며 상단 직원의 C4의 플랫은 원인이되지 않습니다. 바닥 직원의 C4).

보너스 정보

보너스는 8 분 음표를 올바르게 연결하는 것입니다.

4 분 음표 비트에 맞춰 연속 된 8 분 음표가 2 개 있으면 (즉, 첫 번째 8 분 음표 앞의 문자 수는 24의 배수 임), 2 분의 8 분 음표가 연결됩니다.

직원 A 에서 가장 먼 메모 A를 참고하십시오. 두 음표가 중간에서 동일한 거리 인 경우 두 음표는 모두 음표 A 가 될 수 있습니다 . 다른 쪽지를 B 쪽이라고하자 .

의 방향 모두 노트의 줄기의 방향이어야한다 줄기 .

음표 중 하나의 줄기는 6줄이 길어야하며 (일반적으로 줄기의 경우와 동일), 다른 쪽지의 줄기는 다른 쪽의 줄기 끝까지 확장되어야합니다.

줄기는와 연결되어야합니다 _.

연결된 8 분 음표 예 :

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

입력 및 출력 예

입력 :

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

출력 :

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

시연을 위해 세 번째 측정에서는 F#8 분 음표가 연결되어 있지만 8 분 음표는 연결되어 G#있지 않습니다. 프로그램은 해당 될 때마다 (여분의 경우) 여덟 번째 음표를 연결하거나 모두 분리 된 상태로 두어야합니다.

기타 정보

  • 임의의 양의 후행 공백 / 줄이 허용됩니다.
  • 음자리표 앞에 공백이 없어야하고 음표 사이에 공백이 없어야합니다. 출력 전 / 후에 임의 개수의 빈 줄이 방출 될 수 있습니다.
  • 여덟 번째 노트를 연결하면 보너스 는 소스 코드의 0.75 * 바이트 수입니다 .
  • 이것은 이므로 가장 짧은 코드가 승리합니다.

예 중 하나에서 중간 C의 떨림 (고음 음자리표 가정)을 채우지 않았습니다.
Muzer

@Muzer 감사합니다.
es1024

또한, 정말 놀라운 도전입니다. 나는 지금 출품작을 쓸 시간이 없지만 사람들이 무엇을 생각해 내는지 매우 관심이 있습니다. (PS : 내가 곡을 즉시 인식하는 것이 나쁘냐?)
Muzer

@steveverrill 당신은 정확하고 고정되었습니다.
es1024

7
대단해! 힘들지만 굉장합니다.
kirbyfan64sos

답변:


15

파이썬-8.85 ... KB ( 9369 9066 B)

하하! 서쪽에서 가장 빠른 총?

이것은 제대로 골프를 타는 것은 FAR이지만 최소한 작동합니다. 이 글을 게시 할 때 가장 짧은 항목이므로 ... 예?

이 큰 골프는 한 번도 해본 적이 없으며 어디서부터 시작해야할지 모르겠다는 말부터 시작하겠습니다.

이 항목에는 아직 보너스 포인트가 포함되어 있지 않지만 골프 전에 추가하고 싶습니다.

필자는 기본적으로 각 "블록"을 구성하는 문자를 2D 형식으로 저장하는 일종의 ASCII 렌더링 클래스를 작성하여 2D 그리드에 여러 가지 "기호"를 그릴 수있었습니다. 노트 블록의 경우 먼저 스태프를 그린 다음 스태프와 테일 (해당되는 경우)을 따라 필요에 따라 바를 확장 한 다음 스태프와 테일을 연장하고 우발적입니다.

고음 및 저음 음자리표에 대해 다음 두 가지 입력이 제공됩니다.

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

다음과 같은 결과가 나옵니다.

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

이 특정 파이썬 웹 IDE는 시뮬레이션 된 입력 또는 별도의 파일을 허용하지 않기 때문에 가짜 입력 코드 가있는 작동 중인 코드 버전 이 있습니다.

grandstaff.py

고음 및 저음 음자리표 직원을 포함하고 두 사람 사이에 막 대선을 그립니다.

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

한 명의 직원. 음표, 막 대선, 음자리표 등을 나타내는 "블록"객체 배열을 포함합니다.이 클래스는 음표의 간격과 적절한 위치에 막 대선 삽입을 처리합니다.

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

이 클래스는 ASCII 텍스트의 "렌더링"(또는 아마도 구성)을 처리합니다. 내부에는 고음 및 저음 음자리표, 빈 스태프, 금지, 실수 및 다양한 지속 시간의 메모를 작성하는 데 필요한 조각과 같은 하드 코딩 된 기호가 있습니다. 이들은 최종 ASCII 블록을 생성하기 위해 순차적으로 순차적으로 문자 "픽셀"의 2D 그리드에 "그려집니다".

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

이 클래스는 단순히 GrandStaff의 인스턴스를 생성하고 주어진 문자열 입력을 전달하고 문자열 값을 인쇄하여 프로그램을 "실행"합니다.

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

print (GrandStaff(sys.argv[1],sys.argv[2]))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.