Upgrade to Pro — share decks privately, control downloads, hide ads and more …

プログラマのための音楽入門

CHEEBOW
August 23, 2024

 プログラマのための音楽入門

iOSDC Japan 2024

2024/08/23 18:00〜
Track A
ルーキーズLT(5分)

プログラミングとかけまして音楽と解きます、その心は?
どちらもコード(code | chord)が重要です

プログラマと音楽は相性が良いのです。
私自身も、平日はプログラマ、週末はアイドルなどへの楽曲提供をする作曲家です。

音楽はセンスがないとできないというわけではありません。
コードネームから構成音を求めるプログラムを作ることができます。
コード進行やリズムにはパターンがあり、デザインパターンやライブラリのように利用することができます。
音楽にも理論があります。

本トークでは

コードネームから構成音を求めるプログラムを作ってみる
コード進行やリズムのパターンを利用する
音楽理論は楽しい
についてお話しします

プログラマならではの視点で、音楽を楽しんでみませんか?

ソースコードはこちらから、どうぞ
https://gist.github.com/cheebow/ddff7928803c0f233e7b580f663e13d8

CHEEBOW

August 23, 2024
Tweet

More Decks by CHEEBOW

Other Decks in Programming

Transcript

  1. ເ຾ͶΉ(ͰΜͺ૊.inc)ɺσΟΞεςʔδΞΠυϧ෦ɺѪԵঁˑDOLLɺCOSMIC STAGEɺ DollˑElementsɺJewel Kissɺ⁊୔͋Γ͋ɺ̩ʂ̥ɺؙࢁՆླɺas f ɺࠤ໺༑ཬࢠ(ѪԵঁ ˒DOLL)ɺHoney SquashɺϋοΫΨʔϧζɺനࣛ͸Δͷɺ᷒ྦΊΔɺLuce Twinkle Winkˑɺ

    ϚϘϩγՄ࿁GeNEɺཹक൪Ψʔϧζɺϋϐυϧ ~ Happy Idol Project ~ ɺࠤݪඦԻɺ AngeˑReveɺPIP: Platonics Idol PlatformɺPICK UP GIRLSʯɺCarnivalˑStarsɺ RYUKYU IDOLɺ͐͡ΔͷʂɺSˑUTHERN CROSSɺLovinˍSɺSnowRabbit feat. ླ໦Ώ ͖ɺLasRabbiɺਆ॓ɺCAMOUFLAGEɺ͓΍ΏͼϓϦϯηεɺᗅΊ͖ˑΞϯϑΥϨϯτɺ little more.ɺϕʔεϘʔϧΨʔϧζɺ෱Ӭ޾ւɺఱ੖Εʂݪ॓ɺ࣌୅Ճ଎૷ஔ@'mEɺ ChuˑOh!DollyɺKAMO͕ωΪΛ͠ΐͬͯ͘Δο!!!ɺ΋͔ΖΜͪΌΜ(RYUKYU IDOL)ɺࡈ ౻Εͳɺmi-naɺ༘رະ݁ɺͨͩͷঁͷࢠɻɺJewelˑRougeɺ៉੕ˑϑΟΦϨφʔυɺGirls Live ProjectɺΞΫΞϊʔτɺύϐϓϖϙ͸೉͍͠ɺsommeil sommeilɺΔͳͬͪˑ΄͠ɺ७ ਮΧϑΣɾϥοςɺ੢࡙΄͠ɺେੴཧ೫ɺϓϦΞϞɺ٦͸Δ͔ɺRuka BananaɺQSCS eggɺ Ώ͍͟Β͢ɺ1ֶظͷલ൅ɺ#͓͏ͪΞΠυϧɺViViBeeɺPalette Projectɺ୩ຑ༝ཬɺGood knight**ɺLove,Need Meὑ ‼︎ ɺۋ৫Ί͙Έɺ#ϖϯλϓϦζϜɺϫϯεΞνϟϯεɺAALAɺ Twinkle ProjectˑɺSnowˑFelizɺ#heishaɺ࿀Իܖ໿ɺ͖Έͱͷϫϯμʔϥϯυɺະμɺ܅ Ϯਪηζɻɺnemumi(sommeil sommeil)ɺύεςϧϗϩάϥϜɺγΣϦίϑϨɺ৓࡚౧՚ɺ ελʔνεͷϥϒϨλʔɺSquall Lineɺݪ॓຾຾ɺif only ...ɺ૬୔ಏ
  2. ຐ๏গঁˑະຬɺશྗϙδςΟϒɺ੨य़ϦΞϦςΟɺGO!! MY WISH!!ɺյͯ͠ɺ७৘ɺΞΠυϧˑະຬɺLovely DaysɺΩϛ ͸ετʔϜɺࠂനମૢɺREADY STEADY GO!!ɺΪϡοͱSTAR!!ɺϚδ࿀ˑύϯνɺΤσϯͷԂͰɺYOU GOTTA DANCE!!ɺ GO!!

    MY WISH!!(KUJIRA REMIX)ɺ೒Λݟ͔ͨɺEternal Summerɺ൵͍͠my true loveɺWheel of FortuneɺιϨΠϢͷ ຐ๏ɺKiss x KissɺϩʔΞ΢τɺϚʔϝΠυɺ͓͑ͯ͠ʂ࿀ͷϓϩτίϧɺVanillaɺͨΊଉίοτϯΩϟϯσΟʔɺLuce Twinkle Winkˑ overtureɺႢಹϋϨʔγϣϯɺ͖Β͍ɺ͖Β͍ɺ͍͖ͩ͢ɻɺཹक൪ΨʔϧζˑኯɺPaˑPaˑPaˑPartyɺ ੺ಓখொυΩοɺWake me up!!ɺGrow Up!!ɺ͖ͬͱ͙ͬͱαϚʔσΠζɺΩϛ͸ϊΠόϥɺগঁͨͪͷඍ೤ɺShooting x 3ɺMagical WonderlandɺWinding RoadɺYou Go Girl!!ɺ๻ΒʹਅՆ͕͘ΔɺϓϦʔζɾϓϦʔζɺ͋͟΍͔ͳੈքɺ΍ Β͔͍͸͊ͱɺUP TO YOU!!ɺDanger Danger!!ɺLast RabbitɺΦʔϓχϯάSEɺυΪϚΪ Trick or Treat?ɺΦʔϓχϯά SEɺ৘೤ͷBlizzardɺݬӨ˒ΪϟϥΫςΟΧɺྲྀ੕ˑϩϚϯςΟΧɺGimme a Spark!ɺϐϦΦυΛ๊͖͠Ίͯɺίίϩ×Ϋ ϩεήʔϜɺ͔ͬ͠Γͯ͠ΑɺΧϦΩϡϨʔλʔɺಧ͚ɺ܅ʹɺOur MusicɺѪυϧɺPreciousˑSummerɺര྾ʂ࣬૸ʂ࿀ ηϤԵঁɺਅՆͷύϦϥɺॠؒɺϑϩϨηϯτɺΞΧωΠϩɺϠμοʂɺΞΠΦϥΠτɺ௒ઈՄ࿁ʂຐ๏গঁ΋͔ΖΜͪΌΜ ͸ઃఆ্14ࡀɺLuce Twinkle Winkˑ overture 2ɺγϦΞϧɾϥόʔɺઈ๬ϩϯϦωεɺͳͷ͸ͳΠϯτωʔγϣϯɺͪΌ͓ɺ Նͷׂ࣌ؒɺBreakthrough!!ɺ࿀ܬɺStep by StepʂɺOvertureɺPuroˑUn fi oreɺ༿ࡩͷ໦࿙Ε೔ʹɺGoodbye Rainɺ ଧ্ͪ͛ՖՐɺڭ͑ͯTristarɺߦ͋ͯ͘ͷͳ͍νϣίϨʔτɺ#य़͘Δɺ௅ൃSel fi shɺγϟχϜχɺDon't you?ɺྲྀ੕Ττϥ ϯθɺγʔαΠυϥΠφʔɺӕ͖ͭΞϯεϦ΢ϜɺϨΠςϯϨʔυɺYou are my answer!!ɺΦʔϓχϯάۂɺύεςϧͷ์ ՝ޙɺ͓͞ΉͷATMɺॳ࿀ˑHow to My Loveɺʮ͜Ε͔ΒʯɺϓϩᇋϥϨϠʔɺSTARTɺ܅ͱӍͷΞΫΞϦ΢Ϝɺ͍ͬ͡ͺ ΓDECISION. -ܾஅ-ɺఱମ஍ਤɺ͞ΑͳΒ࿡ՖɺͲΓʔΈΜˑΊ͍ͲΓʔΈΜɺ͔͍͔͍ͨͨɺଔۀ͙Β͡Ύ͑ʔ͠ΐΜɺΦʔ ϓχϯάSEɺΩϥΩϥΩϥϦˑɺະདྷͷ͖ͭͮɺ͖ͬͱɺΞΠͩͶɺϢϝΠζϜɺΞΠγϯάɾΫοΩʔɺΦʔϓχϯάSEɺ ݪ৭ϘϧςʔδɺSEɺBlue Rose, Blueɺ͘͞ΒΧʔϖοτɺ͖ΈͷͱͳΓɺGroovin' CrazyɺελʔϚΠϯɺ઴ۙઢϝϩσΟ ΞεɺSEɺરޫϦϑϨΫγϣϯɺϦɾϦɾϦɾϦϝϯόʔɺ͋ͳ͕ͨҭͯͨՖɺγϟϘϯۄʹͳΕʂɺSEɺಌጦͷΧϊʔϓεɺ ͍ͪ͝ϛϯτͷՆɺΞϫΧϯύχʔɺ࿀ԻˑϩϚϯαʔɺͱͬͽΜ͠ΌΜͷCHUˑɺWhat's up? ਓੜɺͶΉΈͷ৿ɺ೒ͷͬ͠ ΆΛ͔ͭΉ·Ͱɺྠ㕩ͷεʔύʔϊϰΝɺγϟϥϥɺSEɺڭՊॻΛ໨Ӆ͠ʹͯ͠ɺSEɺHappy Merry-Go-RoundɺλΠϜϚ γϯ͸͍Βͳ͍ɺӕͱϦΞϦςΟɺSEɺIDOLὑΤϞˠγϣϯ
  3. C

  4. C = υ D = Ϩ E = ϛ F

    = ϑΝ G = ι A = ϥ B = γ υϨϛϑΝͷӳޠ໊
  5. C D E F G A B C# Db D#

    Eb F# Gb G# Ab A# Bb C D E F G A B C# Db D# Eb F# Gb G# Ab A# Bb C
  6. C D E F G A B C# Db D#

    Eb F# Gb G# Ab A# Bb C D E F G A B C# Db D# Eb F# Gb G# Ab A# Bb C 1 2 3 4
  7. C D E F G A B C# Db D#

    Eb F# Gb G# Ab A# Bb C D E F G A B C# Db D# Eb F# Gb G# Ab A# Bb C 1 2 3 4 1 2 3
  8. C D E F G A B C# Db D#

    Eb F# G# Ab A# Bb C D E F G A B C# D# Eb F# Gb G# Ab A# Bb F#m7
  9. C D E F G A B C# Db D#

    Eb F# G# Ab A# Bb C D E F G A B C# D# Eb F# Gb G# Ab A# Bb F#m7 1 2 3
  10. C D E F G A B C# Db D#

    Eb F# G# Ab A# Bb C D E F G A B C# D# Eb F# Gb G# Ab A# Bb F#m7 4 1 2 3 1 2 3
  11. C D E F G A B C# Db D#

    Eb F# G# Ab A# Bb C D E F G A B C# D# Eb F# Gb G# Ab A# Bb F#m7 1 2 3 4 1 2 3 1 2 3
  12. C D E F G A B C# Db D#

    Eb G# Ab A# Bb C D E F G A B D# Eb F# Gb G# Ab A# Bb Am7 1 2 3 4 1 2 3 1 2 3 F# Gb C# Db
  13. F#m7 F# A C# 3 4 E 3 A C

    E 3 4 G 3 Am7
  14. 4 - 3 3 - 4 4 - 3 -

    3 4 - 3 - 4 3 - 4 - 3 5 - 2 3 - 3 - 3 4 - 4 3 - 3 - 4 X Xm X7 XM7 Xm7 Xsus4 Xdim Xaug Xm7b5 ίʔυ໊ͱԻͷੵΈํ
  15. import Foundation let noteToSemitone: [String: Int] = [ "C": 0,

    "C#": 1, "Db": 1, "D": 2, "D#": 3, "Eb": 3, "E": 4, "Fb": 4, "E#": 5, "F": 5, "F#": 6, "Gb": 6, "G": 7, "G#": 8, "Ab": 8, "A": 9, "A#": 10, "Bb": 10, "B": 11, "Cb": 11, "B#": 0 ] let semitoneToNote: [Int: (sharp: String, flat: String)] = [ 0: ("C", "C"), 1: ("C#", "Db"), 2: ("D", "D"), 3: ("D#", "Eb"), 4: ("E", "Fb"), 5: ("F", "F"), 6: ("F#", "Gb"), 7: ("G", "G"), 8: ("G#", "Ab"), 9: ("A", "A"), 10: ("A#", "Bb"), 11: ("B", "Cb") ] func chordNotes(chord: String) -> [String] { let root = String(chord.prefix(while: { ["C", "D", "E", "F", "G", "A", "B"].contains($0) || $0 == "#" || $0 == "b" })) let suffix = String(chord.dropFirst(root.count)) guard let rootSemitone = noteToSemitone[root] else { return [] } var intervals = switch suffix { case "m" : [0, 3, 7] case "7" : [0, 4, 7, 10] case "m7" : [0, 3, 7, 10] case "M7" : [0, 4, 7, 11] case "add9" : [0, 4, 7, 14] case "madd9": [0, 3, 7, 14] case "dim" : [0, 3, 6] case "aug" : [0, 4, 8] case "m7b5" : [0, 3, 6, 10] default : [0, 4, 7] } let notes = intervals.map { let semitone = ($0 + rootSemitone) % 12 return root.contains("#") ? semitoneToNote[semitone]!.sharp : semitoneToNote[semitone]!.flat } return notes }
  16. // chord:”G#m7” -> “G#” let root = String(chord.prefix(while: { ["C",

    "D", "E", "F", "G", “A", "B"].contains($0) || $0 == "#" || $0 == "b" })) // chord:”G#m7” -> “m7” let suffix = String(chord.dropFirst(root.count)) ίʔυ໊͔ΒɺϧʔτԻͱίʔυͷछྨΛऔಘͯ͠
  17. guard let rootSemitone = noteToSemitone[root] else { return [] }

    var intervals = switch suffix { case "m" : [0, 3, 7] // ……… default : [0, 4, 7] } let notes = intervals.map { let semitone = ($0 + rootSemitone) % 12 return root.contains("#") ? semitoneToNote[semitone]!.sharp : semitoneToNote[semitone]!.flat } ϧʔτ͔Βͷڑ཭Ͱίʔυͷߏ੒ԻΛ୳͠·͢
  18. var intervals = switch suffix { case "m" : [0,

    3, 7] case "7" : [0, 4, 7, 10] case "m7" : [0, 3, 7, 10] case “M7" : [0, 4, 7, 11] case "add9" : [0, 4, 7, 14] case "madd9": [0, 3, 7, 14] case "dim" : [0, 3, 6] case "aug" : [0, 4, 8] case "m7b5" : [0, 3, 6, 10] default : [0, 4, 7] }
  19. Ԧಓਐߦ • Subtitle / Of fi cial඘உdiss • ॕ෱ /

    YOASOBI • ՄѪ͘͝ΊΜ feat.ͪΎʔͨΜ / Honeyworks • ͪΎɺଟ༷ੑɻ / ano • ܅͸ϩοΫΛௌ͔ͳ͍ / ͍͋ΈΐΜ
  20. Χϊϯਐߦ • ΫϦεϚεɾΠϒ / ࢁԼୡ࿠ • ෛ͚ͳ͍Ͱ / ZARD •

    ͘͞ΒΜ΅ / େ௩Ѫ • Θ͕··δϡϦΤοτ / BOOWY • গ೥࣌୅ / Ҫ্ཅਫ • Ѫ͸উͭ / KAN
  21. ؙαਐߦ • ؙϊ಺ασΟεςΟοΫ / ௣໊ྛޝ • ໷ʹۦ͚Δ / YOASOBI •

    άοόΠએݴ / Chinozo • ѪΛ఻͍͑ͨͩͱ͔ / ͍͋ΈΐΜ • ඵ਑ΛטΉ / ͣͬͱਅ໷தͰ͍͍ͷʹɻ
  22. খࣨਐߦ • Get Wild / TM NETWORK • ϑϥΠϯάήοτ /

    AKB48 • ന೔ / King Gnu • ๻Β͸ࠓͷͳ͔Ͱ / μ's • ઍຊࡩ / ࠇ͏͞P