ปรับขนาดจากคีย์และโหมด


10

พวกคุณส่วนใหญ่คงรู้จัก C scale ที่สำคัญ:

C D E F G A B C

สเกลที่สำคัญคือลักษณะโดยช่วงเวลาระหว่างบันทึกที่อยู่ติดกันซึ่งวัดในเซมิโคลนคือ:

2 2 1 2 2 2 1

จาก intervales เหล่านี้เราสามารถสร้างสเกลหลักใด ๆ ที่เริ่มต้นในบันทึกใด ๆ ( คีย์ของสเกล) หมายเหตุ 12 ประการในระบบปรับแต่งอารมณ์ 12 โทนเท่ากันคือ:

C C♯ D D♯ E F F♯ G G♯ A A♯ B

อย่างเท่าเทียมกัน (ทดแทนบางรายการเทียบเท่า enharmonic ):

C D♭ D E♭ E F G♭ G Ab A B♭ B

ด้วย semitone ระหว่างโน้ตคู่ที่อยู่ติดกันแต่ละคู่

แต่ละสเกลจะต้องมีโน้ตทั้งเจ็ดตามลำดับโดยเริ่มจากปุ่ม มิฉะนั้นคุณอาจมีโน้ตสองอันในรูปสี่เหลี่ยมห้าแฉกเดียวกันซึ่งจะทำให้เกิดความสับสน ดังนั้นใน G # สำคัญ / โยนกคุณมี F # # แทน G; นักดนตรีจะดูว่าโน้ตในรูปดาวห้าแฉกนั้นพวกเขาได้เรียนรู้อุบัติเหตุไปแล้วในแต่ละสเกล แน่นอนในG # สำคัญ F # # จะแสดงในบรรทัด F # # โดยไม่เกิดอุบัติเหตุอุบัติเหตุอยู่ในลายเซ็นคีย์ - แต่เนื่องจากลายเซ็นคีย์นั้นจะต้องใช้ 2 sharps สำหรับ F จึงมักจะได้รับการแจ้งเตือนว่าเป็นเมเจอร์ Ab

การขยับ2 2 1 2 2 2 1ช่วงเวลาเรามาถึงเจ็ดโหมดที่แตกต่างกันของระดับเสียงคู่:

  • โยนก : 2 2 1 2 2 2 1- สอดคล้องกับขนาดใหญ่
  • โดเรียน :2 1 2 2 2 1 2
  • Phrygian :1 2 2 2 1 2 2
  • ลิเดียน :2 2 2 1 2 2 1
  • มโซลิเดียน :2 2 1 2 2 1 2
  • Aeolian : 2 1 2 2 1 2 2- สอดคล้องกับสเกลเล็กน้อยตามธรรมชาติและสเกลเล็กน้อยที่ไพเราะเมื่อมากไปหาน้อย (เมื่อขึ้นไปสเกลเล็กน้อยที่ไพเราะได้ยกระดับที่ 6 และ 7 นอกจากนี้ยังมีสเกลเล็กน้อยที่สอดคล้องกันโดยเพิ่มขึ้น 7 องศาเมื่อเทียบกับธรรมชาติ ผู้เยาว์).
  • Locrian :1 2 2 1 2 2 2

ดังนั้นความท้าทายคือการเขียนโปรแกรมที่ใช้เป็นอินพุต (ผ่านstdin ) คีย์และโหมดและเอาต์พุต (ผ่านstdout ) สเกลที่สอดคล้องกัน กรณีทดสอบบางอย่าง ( stdin ( key mode) => stdout ( scale)):

Input:              Output:
C mixolydian   =>   C D E F G A Bb
F mixolydian   =>   F G A Bb C D Eb
G mixolydian   =>   G A B C D E F
G# ionian      =>   G# A# B# C# D# E# F##
Bb aeolian     =>   Bb C Db Eb F Gb Ab

การอ้างอิงเพิ่มเติม:
มีกี่คีย์ (หลักและรอง) มีกี่อัน? ทำไม?


4
ตัวอย่างคุณลักษณะของสัญกรณ์ที่ไม่ได้อธิบายไว้ข้างต้น - แฟลตและชาร์ปสองเท่า เป็นที่ยอมรับได้หรือไม่เมื่อเทียบกับการส่งออกโดยใช้เพียงบันทึกย่อและวิชาเอกที่เรียบง่าย? (สำหรับสิ่งที่คุ้มค่าการตั้งค่าของฉันจะเป็นว่าคุณพูดว่า "ไม่" และขยายข้อกำหนดเล็กน้อย - ดูเหมือนว่าคำถามนี้อาจมีความลึกที่ซ่อนอยู่เล็กน้อย)
Peter Taylor

@PeterTaylor: ใช่ ฉันหวังว่าการแก้ไขจะเพียงพอ ฉันคาดว่าเอาต์พุตจะเป็นไปตามที่แสดงพร้อมกับชื่อโน้ตเจ็ดรายการและอุบัติเหตุที่เกี่ยวข้อง นี่เป็นโปรแกรมที่ค่อนข้างใหญ่
ninjalj

คำตอบ:


7

GolfScript, 96 ตัวอักษร

" "/~5<{+}*7%"v]nwm[{"=2*2base(;\(" #"@?]{.1>))["b""""#"..+]=+\[~@(@+@(7%65+\1$7%4%0>-]}7*;]" "*

วิธีการแก้ปัญหา Golfscript ซึ่งสามารถทดสอบออนไลน์

หมายเหตุ: ในตัวอย่างจะต้องใช้ตัวพิมพ์ใหญ่และตัวพิมพ์ใหญ่ในขณะที่โหมดจะต้องเป็นตัวพิมพ์เล็ก

ตัวอย่าง:

>C lydian
C D E F# G A B

>C mixolydian
C D E F G A Bb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.