Jul 23, 2014

Wolfgang Amadeus Mozart - Symphony No. 25 in G minor, K. 183



มีคำกล่าวว่า Mozart ไม่ค่อยแต่งเพลงในกุญแจไมเนอร์ ซึ่งก็จริงอยู่เพราะจาก Symphony ราว 40 บท มีเพียง 2 บทเท่านั้นที่อยู่ในกุญแจไมเนอร์

แต่นั่นไม่ได้หมายความว่า Mozart แต่ง Symphony ในกุญแจไมเนอร์ไม่เก่ง

เพราะหมายเลข 25 นี้เอง ที่เป็นสิ่งพิสูจน์ข้อความข้างต้นครับ

I. Allegro Con Brio (8:00 นาที)

บทเพลงเริ่มต้นท่อนแรกขึ้นมาอย่างหดหู่สิ้นหวัง ด้วยโมทีฟที่เป็นเอกลักษณ์จดจำง่าย ฟังแล้วเหมือนจะขาดใจตายยังไงยังงั้น แม้จะมีช่วงแทรกสั้นๆ ให้ดูเหมือนจะมองเห็นความหวังอยู่ไกลๆ แต่โดยรวมทั้งท่อนแล้วมันมีแต่ความพ่ายแพ้ต่อโชคชะตาจริงๆ

ในภาพยนต์เรื่อง Amadeus ซึ่งเป็นชีวประวัติของ Mozart ฉากแรกที่เปิดตัวมาด้วยภาพผู้คนจำนวนมากล้มตาย ก็ได้ท่อนนี้มาประกอบนี่แหละครับ เข้ากั๊นเข้ากัน ฟังแล้วเหมือนรอความตายยังไงหยั่งงั้นเลย

II. Andante (3:30 นาที)

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

ท่อนนี้เริ่มอย่างช้าๆ เนิบนาบ ดั่งเช่นเมื่อล้มตัวลงนอนคิดถึงคืนวันหอมหวานที่ไม่หวนกลับมา แต่พอท้ายท่อนนี้ก็ส่อแววไปถึงการตั้งคำถาม ด้วยการแปรทำนองออกเป็นความเศร้าที่แฝงอยู่ เปรียบเช่นว่าการมองหวนนึกถึงแต่อดีตนี้จะดีจริงหรือ

III. Menuetto & Trio (3:30 นาที)

ท่อนนี้จัดว่าเป็นการเต้นรำก็ได้ครับ ออกจะเป็นการเต้นรำที่เริ่มมาอย่างไม่สบอารมณ์ซักหน่อย ซึ่งท่อนนี้เป็นแบบ trio หรือก็คือแบ่งเพลงออกเป็น 3 ส่วน ซึ่งส่วนแรกที่เล่าแบบเซ็งๆ นี้จะกลับมาย้อนเล่าสรุปอีกทีเป็นการปิดท้าย ส่วนตรงกลางอาจนับว่าเป็นช่วงที่เริ่มมีความสุขขึ้นมาบ้างก็ได้ ทำให้ท่อนนี้ออกจะมีหลายอารมณ์ปนกันครับ

IV. Allegro (6:00 นาที)

ท่อนสุดท้ายที่เป็นการสรุปใจความทั้งหมดของเพลงที่เล่ามา จังหวะการเล่นกลับมารวดเร็วและใช้กุญแจเสียง minor ซึ่งเป็นกุญแจเสียงตั้งต้นของเพลง แต่เราก็อาจได้ยินทำนองที่ออกไปทางปิติยินดีมากขึ้น เรียกว่าสุขๆ เศร้าๆ ปนๆ กันไป เปรียบดังยอมรับได้ว่าชีวิตก็เท่านี้แหละ มีเกิดก็มีดับ ในเมื่อมันเป็นเรื่องธรรมชาติที่หนีไม่พ้นอยู่ดี แล้วจะเศร้าให้มันมากมายไปทำไม มองซะว่ามันเป็นความสุขเสียอีก ที่สุดท้ายก็ได้พักผ่อนยาวให้หายจากความเหนื่อยล้านี้เสียที

ก็เป็นเพลงแบบเศร้าๆ มืดๆ จาก Mozart ที่เจ๋งดีครับ ฟังแล้วจินตนาการเป็นอย่างอื่นไม่ค่อยออก นอกจากเห็นภาพความตายที่รอคอยอยู่เบื้องหน้าจริงๆ

Jul 15, 2014

The Swing

ดู Frozen เมื่อปีก่อนก็ตะหงิดๆ อยู่ในใจว่า ตอนที่อันนากระโดดดึ๋งๆ ในเพลง For the First Time in Forever แล้วทำท่าเลียนแบบรูปวาดบนผนัง มันมีรูปนึงที่คุ้นตาเอาซะมากๆ

คือองค์ประกอบ การจัดวาง รายละเอียดต่างๆ มันให้ความรู้สึกว่า เอ่อ ภาพนี้น่าจะเป็นภาพวาดจริงๆ ในยุคคลาสสิกนะ ไม่ใช่ภาพที่วาดขึ้นมาตอนนี้ในแบบโมเดิร์น แต่พยายามจัดวางองค์ประกอบเลียนแบบยุคคลาสสิกให้ดูเหมือนเป็นของเก่า

แต่หนังสนุก เพลงเพราะ ก็ลืมไปเลยว่าเคยสงสัยข้อนี้

จนกระทั่งวันก่อนเดินเข้าร้านหนังสือฆ่าเวลาเล่น แล้วไปเปิด 1001 Paintings You Must See Before You Die (edition ไหนไม่รู้ แต่น่าจะล่าสุด) พลิกกระดาษมั่วๆ ไปไม่กี่หน้าก็เจอภาพนี้เข้าพอดี


Les Hasards Heureux de l'Escarpolette โดย Jean-Honoré Fragonard วาดในปี 1767

อันนี้เทียบกับเวอร์ชั่นดิสนีย์


ภาพวาดที่อันนาทำท่าเลียนแบบ (บน) และภาพแบบธรรมดา (ล่าง) ภาพจาก Animate Film Review

ก็เป็นอันว่า ปริศนาในขีวิตไขกระจ่างไปอีกหนึ่งข้อ :P

Jul 12, 2014

Self Printing Program

หลายวันก่อนเปิดเจอโพสนี้ของคุณ @theppitak ซึ่งเป็นเรื่องของการเขียนโปรแกรมที่ต้องการผลลัพท์เป็นโปรแกรมที่กลับมาพิมพ์โปรแกรมตัวเอง

พูดง่ายๆ ว่าถ้าสมมติว่าโปรแกรมนั้นชื่อ self.c การสั่งคำสั่ง diff ครั้งสุดท้ายในโค้ดต่อไปนี้ต้องให้ค่าคืนมาเป็นว่า 2 ไฟล์มีเนื้อหาเหมือนกัน
$ gcc self.c
$ ./a.out > other.c
$ diff self.c other.c
เนื่องจากคุ้นว่าจะเคยเห็นคำถามแนวนี้ใน Ruby มาก่อนแล้ว ตอนแรกก็ไม่ได้คิดว่าจะลองทำหรอก แต่เท่าที่สังเกตแล้วจุดที่น่าจะเป็นปัญหาน่าจะมาจากเรื่อง escape string ซึ่งใน Python มันคงไม่ยุ่งยากเท่าไหร่ เพราะมี raw string และฟังก์ชั่น repr ไว้คอยจัดการปัญหา escape string อยู่แล้ว

แต่คิดไปคิดมา เอ่อ แล้วถ้าเป็นใน C (ที่ต้นทางเค้าสงสัย) นี่มันจะทำยังไงหว่า? เลยลงมือเขียนเล่นๆ จนได้ออกมาดังนี้
void main() {
  int i = 0, j = 0;
  char* x = "void main() {\n\tint i = 0, j = 0;\n\tchar* x = \"%s\";\n\twhile (x[i]) {\n\t\tif (x[i++] == '%%' && x[i++] == 's') {\n\t\t\twhile (x[j]) {\n\t\t\t\tswitch (x[j++]) {\n\t\t\t\t\tcase '\\n': putchar('\\\\'); putchar('n'); break;\n\t\t\t\t\tcase '\\t': putchar('\\\\'); putchar('t'); break;\n\t\t\t\t\tcase '\\\"': putchar('\\\\'); putchar('\"'); break;\n\t\t\t\t\tcase '\\\\': putchar('\\\\'); putchar('\\\\'); break;\n\t\t\t\t\tdefault: putchar(x[j-1]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tputchar(x[i-1]);\n\t\t}\n\t}\n}\n";
  while (x[i]) {
    if (x[i++] == '%' && x[i++] == 's') {
      while (x[j]) {
        switch (x[j++]) {
          case '\n': putchar('\\'); putchar('n'); break;
          case '\t': putchar('\\'); putchar('t'); break;
          case '\"': putchar('\\'); putchar('"'); break;
          case '\\': putchar('\\'); putchar('\\'); break;
          default: putchar(x[j-1]);
        }
      }
    } else {
      putchar(x[i-1]);
    }
  }
}
ไม่ได้จับ C มาหลายปี หมดพลังไปเยอะกว่าคิดออก 555+

Jul 8, 2014

ชีวิต (เกือบ) ไม่ติดเน็ต

พอดีเดือนก่อนปิดเทอมกลับบ้านนานครับ เลยยกเลิกเน็ตหอไป พอกลับมาแล้วยังไม่ครบรอบ เลยไม่ได้กลับมาต่อเน็ตไวไฟ ใช้แต่บนมือถืออย่างเดียว

ก็เป็นประสบการณ์ที่แปลกดีนะ วันแรกๆ รู้สึกจดจ่อกับงานได้ดีขึ้นเยอะมาก ไม่มีสิ่งกวนใจเลย

แต่พอทำไปทำมาแล้วเจอปัญหาใหญ่ครับ เพราะต้องพึ่ง Google, StackOverflow บ่อยๆ ครั้นจะหาในมือถือจอเล็กๆ แล้วพิมพ์ code ซ้ำในคอมก็ลำบากไปหน่อย กลายเป็นว่าวันหลังๆ นี่งานเดินช้ากว่าช่วงที่มีเน็ตไวไฟซะอีก

เดี๋ยวว่าจะกลับไปติดเน็ตคืนละครับ แล้วค่อยหาวิธีคุมสิ่งกวนใจด้วยวิธีอื่นแทน งานนี้ถือว่า trade-off ไม่คุ้มซะเท่าไหร่ :s