3 คะแนน โดย GN⁺ 2024-08-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Sonic Pi: ใช้ Ruby เป็นเครื่องมือแต่งเพลง

  • ภูมิหลัง

    • เดิมผู้เขียนเรียนเอกดนตรี
    • ระหว่างทำงานเป็นนักพัฒนาเว็บ ก็เริ่มหลงใหลในการทำงานเชิงเทคนิค
    • เคยพยายามทำเพลงอิเล็กทรอนิกส์เพราะเล่นเครื่องดนตรีหลายชนิดได้ยาก แต่ก็ไม่สำเร็จ
    • ไม่นานมานี้ได้กลับมาผสานดนตรีกับการเขียนโค้ดอีกครั้งผ่าน Sonic Pi
  • แนะนำ Sonic Pi

    • Sonic Pi ที่สร้างโดย Sam Aaron เป็นซอฟต์แวร์ซินธิไซเซอร์ที่ควบคุมด้วยโค้ด
    • ใช้ภาษาเฉพาะโดเมน (DSL) ที่ต่อยอดจาก Ruby เพื่อแมปแนวคิดทางดนตรีและเสียง
    • ตัวอย่างเช่น ใช้สัญลักษณ์อย่าง :c4 เพื่อแทนโน้ต และใช้ตัวสร้างคอร์ดอย่าง chord(:d3, :maj7)
  • เป้าหมายของโปรเจ็กต์

    • เป้าหมายคือแต่งเดโมหนึ่งชิ้นโดยใช้เพียง Sonic Pi เท่านั้น
    • แต่งเพลงด้วยโค้ดล้วน ๆ โดยไม่ใช้ MIDI หรือแซมเปิลภายนอก
  • ตัวอย่างโค้ดพื้นฐาน

    • ตั้งค่า BPM ด้วย use_bpm 70 และตั้งค่าซินธิไซเซอร์ด้วย use_synth :pulse
    • เล่นโน้ตและกำหนดช่วงเวลาด้วยโค้ดอย่าง play :c2, sleep 0.25
    • เล่นแพตเทิร์นด้วย play_pattern_timed [ :c3, :d3, :e3, :g3 ], 0.25
  • การปรับโค้ดให้กระชับ

    • นิยามฟังก์ชันเพื่อลดโค้ดที่ซ้ำกัน
    • สร้างแพตเทิร์นอาร์เพจจิโอด้วยฟังก์ชัน def arpeggiate(root, is_minor = false)
    • ใช้บล็อก in_thread do เพื่อรันโค้ดแบบขนาน
  • การรันแบบขนาน

    • ใช้บล็อก in_thread do เพื่อให้ "เครื่องดนตรี" สองชิ้นทำงานพร้อมกันได้
    • ตัวอย่างเช่น รันอาร์เพจจิโอในเธรดหนึ่ง และรันเมโลดี้ในอีกเธรดหนึ่ง
  • การทำเสียงประสานแบบคอรัส

    • ใช้ ring เพื่อรวมโน้ตหลายตัวไว้ในลิสต์เดียว
    • เล่นโน้ตและกำหนดระยะเวลาค้างเสียงด้วย play_pattern_timed [ring(:c5, :e5)], 4, sustain: 3.8
    • นิยามฟังก์ชัน def choral_rings(notes, sus) เพื่อทำให้แพตเทิร์นคอรัสเรียบง่ายขึ้น
  • ไลฟ์ลูป

    • ใช้ live_loop เพื่อสร้างลูปที่เล่นซ้ำไม่สิ้นสุด
    • นิยามลูปอย่าง live_loop :harp do แล้วเขียนโค้ดไว้ด้านใน
  • บทสรุป

    • การเขียนโปรแกรมไม่ได้เป็นเพียงวิทยาศาสตร์ แต่ยังเป็นศิลปะด้วย
    • การเขียนโค้ดคือการกระทำเชิงสร้างสรรค์ และเป็นวิธีสื่อสารกับผู้อื่น
    • Sonic Pi ทำให้สามารถผสานดนตรีกับการเขียนโค้ดเพื่อสร้างงานสร้างสรรค์ได้

สรุปโดย GN⁺

  • Sonic Pi เป็นเครื่องมือสำหรับแต่งเพลงด้วยโค้ด โดยใช้ DSL ที่ต่อยอดจาก Ruby
  • โปรเจ็กต์นี้มีเป้าหมายเพื่อแต่งเดโมหนึ่งชิ้นโดยใช้เพียง Sonic Pi
  • การเขียนโปรแกรมไม่ได้มีแค่ด้านวิทยาศาสตร์ แต่ยังมีด้านศิลปะ ซึ่ง Sonic Pi แสดงให้เห็นได้อย่างดี
  • เป็นตัวอย่างที่ดีของการผสานดนตรีเข้ากับการเขียนโค้ดเพื่อสร้างงานสร้างสรรค์
  • เครื่องมือที่มีความสามารถคล้ายกัน ได้แก่ TidalCycles และ SuperCollider

1 ความคิดเห็น

 
GN⁺ 2024-08-11
ความคิดเห็นจาก Hacker News
  • ถ้าสนใจ live coding ก็น่าลอง Glicol
  • TidalCycles ก็น่าแนะนำเช่นกัน ชื่นชมความสามารถของ Haskell และ Ruby ในการสร้าง DSL
  • การออกแบบภาษาของ Glicol เน้นไวยากรณ์ที่ได้แรงบันดาลใจจากซินธิไซเซอร์ ความเร็วในการแต่งเพลง และความสะดวกในการออกแบบเสียง
    • เป้าหมายคือการออกแบบ DSL ที่สะท้อนนิสัยการเขียนโปรแกรมที่มีอยู่ แต่ไม่ถูกผูกมัดด้วยภาษาที่มีอยู่เดิม
  • Ruby มีไวยากรณ์ที่แทบจะเหมือนภาษาอังกฤษ จึงมีประโยชน์มาก
  • เคยดูการแสดงสดของ Sam Aaron ผู้สร้าง Sonic Pi
    • น่าประทับใจกับการที่ดนตรีค่อย ๆ พัฒนาไปทุกครั้งที่มีการเปลี่ยนโค้ด
  • ในฐานะนักพัฒนา Ruby รู้สึกว่าน่าสนใจมาก เพราะน่าจะใช้สร้างดนตรีที่สร้างขึ้นด้วยอัลกอริทึมได้
    • ตัวอย่างเช่น น่าจะใช้เปลี่ยน event ที่ noisy ใน git repository ให้เป็นดนตรีเชิงอัลกอริทึมได้
  • ในฐานะนักดนตรี การอัดและลูป MIDI keyboard หรือเครื่องดนตรีอะคูสติกเป็น UX ที่ดีกว่า
    • แม้จะใช้ Ruby DSL ป้อนอะไรก็ได้ แต่เมื่อเทียบกับคีย์บอร์ดเปียโนแล้ว UX ยังไม่ดีนัก
    • คิดว่าคงไม่ใช้มันมาแทน Logic
  • สำหรับแนวทางอื่นของการทำดนตรีด้วยการเขียนโปรแกรม ขอแนะนำ scamp สำหรับ Python
    • ผู้เขียนลงวิดีโอไว้หลายคลิปบน YouTube
  • เมื่อหลายปีก่อนเคยดูวิดีโอ YouTube ที่ใช้ Sonic Pi จำลอง THX Deep Note
    • ตอนแรกไม่ได้บอกว่าจะทำอะไร แต่ค่อย ๆ ปรับเสียงทีละนิด สุดท้ายก็สร้าง Deep Note ขึ้นมาได้
    • น่าเสียดายที่หาวิดีโอนั้นไม่เจออีกแล้ว
  • ช่วงนี้กำลังนึกถึง Sonic Pi เลยไปดูวิดีโอบางอัน
    • เมื่อหลายปีก่อนเคยลองใช้มันอยู่ช่วงสั้น ๆ
  • คอมเมนต์ HTML ทำงานได้ไม่ถูกต้อง ตัวแก้ไขแปลงไฮเฟนสองตัวให้เป็น em dash ตัวเดียว
  • ขอส่งกำลังใจให้ live coder ของ Sonic Pi ที่ชื่อ alsoknownasrox
  • เดโมเจ๋งมาก
    • แต่เลย์เอาต์ของเว็บไซต์พังบน Safari