Điểm ASCII


27

Đi sâu vào sâu trong thư mục tạm thời của bạn, bạn tìm thấy một số tác phẩm cho piano. Thật không may, các tác phẩm này chỉ được viết với tên ghi chú và thời lượng và bạn chỉ có quyền truy cập vào một thiết bị đầu cuối văn bản. Do đó, nhiệm vụ của bạn là viết một chương trình để hiển thị các tác phẩm dưới dạng nghệ thuật ASCII.

Đầu vào

Chương trình của bạn nên chấp nhận hai chuỗi làm đầu vào. Chuỗi đầu tiên sẽ đại diện cho các ghi chú của nhân viên hàng đầu (với khóa của âm bổng), trong khi chuỗi thứ hai sẽ đại diện cho các ghi chú của nhân viên dưới cùng.

Các ghi chú sẽ được thông qua trong ký hiệu cao độ khoa học . Ghi chú của nhân viên hàng đầu sẽ luôn luôn ở giữa C4C6bao gồm. Ghi chú của nhân viên dưới cùng sẽ luôn ở giữa C2C4bao gồm.

Mỗi nốt sẽ đi kèm với một thời gian, mà sẽ là một trong: 1, 2, 4, 8. Chúng đại diện cho toàn bộ một ghi chú (semibreve), một nửa nốt (tối thiểu), một nốt quý (crotchet) và một nốt thứ tám (quaver) tương ứng.

Ghi chú của bất kỳ thời lượng khác sẽ không bao giờ xuất hiện trong đầu vào.

Cách ghi chú và thời lượng được phân tách và cách mỗi ghi chú được tách ra khỏi các ghi chú khác trong đầu vào tùy theo ý của bạn. Sau đây là một đầu vào mẫu cho nhân viên hàng đầu:

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

Ở đây, các ghi chú được phân tách bằng một khoảng trắng và thời lượng được tách ra khỏi ghi chú bằng dấu gạch chéo về phía trước. Các dấu phân cách này không cố định và bạn có thể chọn thay đổi chúng hoặc bỏ qua chúng hoàn toàn.

Bạn có thể cho rằng có ít nhất một lưu ý trong mỗi nhân viên. Không có phần còn lại trong đầu vào.

Đầu ra

Chương trình của bạn là xuất điểm số dưới dạng nghệ thuật ASCII, tuân theo các mô tả sau.

Các dấu vân tay phải là thứ đầu tiên ở bên trái đầu ra của bạn (khoảng cách giữa hai cột không nên thay đổi):

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





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

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

Thân của ghi chú (đường thẳng đứng bên cạnh vòng tròn) sẽ hướng lên trên nếu ghi chú nằm dưới đường giữa của nhân viên. Nó nên chỉ xuống dưới nếu ghi chú ở trên đường giữa của một nhân viên. Nếu ghi chú nằm trên đường giữa, thì thân cây có thể chỉ theo một trong hai hướng. (Ngoại lệ duy nhất này là phần thưởng và xảy ra khi kết nối các ghi chú thứ tám, được mô tả sau). Thân cây phải bắt đầu trên đường kẻ trên / dưới vòng tròn và 6cao hơn đường kẻ.

Tất cả các loại ghi chú ngoại trừ toàn bộ ghi chú có cuống. Cờ của ghi chú thứ tám được thể hiện bằng hai dấu gạch chéo về phía trước trên các dòng khác nhau (xem ghi chú ví dụ bên dưới).

Một đầu ghi chú điền (cho ghi chú quý và thứ tám) được đại diện bởi (@). Một đầu ghi chú trống (cho một nửa và toàn bộ ghi chú) được đại diện bởi ( ).

Các tai nạn (vật sắc nhọn, căn hộ, tự nhiên) phải được đặt như thể hiện trong các ghi chú mẫu, với chính xác một ký tự nằm giữa bên phải của tai nạn và bên trái của đầu ghi chú.

Các dòng sổ cái nên được sử dụng khi cần thiết và nên có 7độ dài các ký tự, tập trung quanh đầu ghi chú.

Mỗi ghi chú nên có 12ký tự rộng.

Ví dụ ghi chú:

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

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

Sau ghi chú 12 ký tự, để 2 * 12 - 12 = 12trống các ký tự (có thể hoặc -tùy thuộc vào dòng) nếu ghi chú là ghi chú quý. Nếu ghi chú là một nửa ghi chú, để 4 * 12 - 12 = 36trống các ký tự. Nếu ghi chú là toàn bộ ghi chú, hãy để 8 * 12 - 12 = 84trống các ký tự. Không thêm ký tự cho ghi chú thứ tám.

Ở cuối mỗi biện pháp (96 ký tự sau dòng khóa hoặc thanh vạch), xuất ra một vạch vạch. Điều này được thực hiện bằng cách đi xuống mọi ký tự giữa các dòng trên cùng và dưới cùng (bao gồm), và thay thế bằng |-bằng +. (Xem ví dụ đầu ra ở cuối câu hỏi).

Ở phần cuối của bản nhạc, xuất kết thúc bản nhạc bằng cách xuất 3 dòng thanh liên tiếp, nhưng có khoảng cách giữa phần thứ nhất và phần thứ hai. Đó là:

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

Lưu ý rằng vật sắc nhọn, căn hộ và tự nhiên kéo dài cho đến khi kết thúc biện pháp. Dấu hiệu tự nhiên chỉ nên được sử dụng để loại bỏ một vật sắc nhọn hoặc phẳng được sử dụng trước đó trong cùng một biện pháp.

Với mục đích của nhiệm vụ này, các vật sắc nhọn, căn hộ và tự nhiên chỉ ảnh hưởng đến một ghi chú trong một quãng tám và trong một lần khóa (một nét sắc nét trên A5 không làm cho A4 bị sắc nét và một căn hộ trên C4 trong đội ngũ nhân viên hàng đầu không gây ra C4 trong nhân viên dưới cùng để được vỗ).

Thông tin cho phần thưởng chỉ

Phần thưởng liên quan đến việc kết nối đúng các ghi chú thứ tám.

Khi có hai nốt thứ tám liên tiếp, được căn chỉnh theo nhịp ghi chú quý (nói cách khác, số ký tự trước nốt thứ tám đầu tiên là bội số của 24), hai nốt thứ tám sẽ được kết nối.

Hãy lưu ý A là ghi chú xa nhất từ ​​giữa các nhân viên. Nếu cả hai chú đều giống nhau khoảng cách từ giữa, hoặc là lưu ý có thể lưu ý Một . Hãy để người khác chú ý be note B .

Sự chỉ đạo của cả hai bắt nguồn nên sự chỉ đạo của gốc của note Một .

Thân của một trong các ghi chú phải là 6dòng cao (như trường hợp của thân cây nói chung), và thân của ghi chú khác nên được kéo dài đến cuối thân của ghi chú khác.

Các thân cây nên được kết nối với _.

Ví dụ kết nối ghi chú thứ tám:

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

Ví dụ đầu vào và đầu ra

Đầu vào :

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

Đầu ra :

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

Để chứng minh, trong biện pháp thứ ba, các F#ghi chú thứ tám được kết nối, trong khi các G#ghi chú thứ tám thì không. Chương trình của bạn nên kết nối các ghi chú thứ tám bất cứ khi nào có thể áp dụng (đối với phần thưởng) hoặc để tất cả chúng bị ngắt kết nối.

Thông tin khác

  • Bất kỳ số lượng khoảng trắng / dòng dấu là chấp nhận được.
  • Không nên có thêm khoảng trắng trước dấu vân tay, cũng không có khoảng trắng giữa các ghi chú. Bất kỳ số lượng dòng trống có thể được phát ra trước / sau đầu ra.
  • Phần thưởng cho việc kết nối các ghi chú thứ tám là 0,75 * số byte của mã nguồn .
  • Đây là , vì vậy mã ngắn nhất sẽ thắng.

Bạn đã không điền thông tin qua trung gian C (giả sử khóa treble) trong một trong các ví dụ của bạn.
Muzer

@Muzer Cảm ơn, đã sửa.
es1024

Ngoài ra, tôi phải nói rằng, thật là một thử thách tuyệt vời. Hiện tại tôi không có thời gian để viết một mục nhưng tôi rất thích xem mọi người nghĩ gì. (PS: Có tệ không khi tôi nhận ra giai điệu ngay lập tức?))
Muzer 24/07/2015

@steveverrill Bạn đã đúng, đã sửa.
es1024

7
Điều này thật tuyệt! Khó, nhưng tuyệt vời.
kirbyfan64sos

Câu trả lời:


15

Con trăn - 8,85 ... KB ( 9369 9066 B)

HaHA! Súng nhanh nhất ở ... Tây?

Đây là FAR từ việc được chơi golf đúng cách, nhưng ít nhất nó có chức năng. Tại thời điểm đăng bài này, đây là mục ngắn nhất, vì vậy ... yay?

Hãy để tôi bắt đầu bằng cách nói rằng tôi chưa bao giờ chơi golf bất cứ thứ gì lớn như vậy và thậm chí tôi không biết BẮT ĐẦU ở đâu.

Mục nhập này chưa có điểm thưởng, nhưng tôi vẫn muốn thêm điểm đó trước khi chơi gôn.

Về cơ bản, tôi đã viết một loại lớp kết xuất ASCII lưu trữ các ký tự tạo thành từng "khối" ở định dạng 2D để có thể vẽ bất kỳ số lượng "biểu tượng" khác nhau nào trên lưới 2D. Đối với các khối ghi chú, nhân viên được rút ra trước, sau đó bất kỳ nhân viên nào mở rộng các thanh khi cần thiết, sau đó là đầu ghi chú, tiếp theo là thân và đuôi (nếu có) và kéo dài tình cờ.

Khi được cung cấp hai đầu vào sau đây cho các âm trebble và bass:

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

Các kết quả đầu ra sau đây:

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

Đây là phiên bản làm việc của mã với một số mã đầu vào giả vì IDE web python cụ thể này không cho phép nhập mô phỏng hoặc các tệp riêng biệt.

grandstaff.py

Chứa cả nhân viên trebble và bass, và xử lý vẽ các vạch kẻ giữa hai người.

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

Một nhân viên duy nhất. Chứa một mảng các đối tượng "Chặn" đại diện cho các ghi chú, vạch kẻ, dấu vân tay, v.v ... Lớp này xử lý khoảng cách của các ghi chú và chèn các vạch kẻ ở những vị trí thích hợp.

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

chặn chặn

Lớp này xử lý "kết xuất" (hoặc có lẽ là thành phần) của văn bản ASCII. Bên trong là các biểu tượng được mã hóa cứng như các âm trebble và bass, một nhân viên trống, hàng rào, tai nạn và các phần cần thiết để xây dựng các ghi chú về thời lượng khác nhau. Chúng được "vẽ" lên lưới 2D của các ký tự "pixel" theo thứ tự để tạo ra khối ASCII cuối cùng.

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

chính

Lớp này chỉ đơn giản là "chạy" chương trình bằng cách tạo một thể hiện của GrandStaff, truyền cho nó các đầu vào chuỗi đã cho và in giá trị chuỗi của nó.

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

print (GrandStaff(sys.argv[1],sys.argv[2]))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.