「音楽でC言語がわかる!『きらきら星』で学ぶ楽しいプログラミング入門」MEMO_DETAIL

「音楽でC言語がわかる!『きらきら星』で学ぶ楽しいプログラミング入門」の画像

  1. C言語と音楽が出会った日──なぜ私は「きらきら星」を選んだのか?
  2. 算数とコードの壁を越えて──メタファによる理解の深まり
  3. C言語で奏でる「きらきら星」のコード
  4. C言語を音楽的に学ぶメリットと実感──他言語との比較から見えたこと
  5. 「好き」を入り口にする力

C言語と音楽が出会った日──なぜ私は「きらきら星」を選んだのか?

五線譜とC言語のコードが並んだイメージ

私は長年Web制作の現場に身を置いてきました。そして一方で、趣味としてフロッピーディスクの時代から音楽制作にも携わってきました。

そんな私が最近、手を出したのがC言語。最初は「古いけど基礎が学べる」といった理由でしたが、学習を進めるうちに想像以上の壁にぶつかりました。それは言語そのものというより、「算数」に近い部分で思考が止まることがしばしばあったのです。

そんなとき、ふと「音楽に置き換えたらどうだろう?」というアイデアが浮かびました。そして私は、自分が知っていて、簡単で、C言語初心者でも扱える曲として「きらきら星」を選びました。

算数とコードの壁を越えて──メタファによる理解の深まり

数字と音符が交差するアートイメージ

プログラムを書くという行為は、アルゴリズムやロジックといった「構造的な思考」が求められます。特にC言語は、変数の型、ポインタ、ループなどが明確に求められ、初心者にとっては敷居が高いと感じるかもしれません。

私はその敷居を「音楽的に」捉えることで乗り越えました。ループ処理はリズムや繰り返しのセクション。配列は音階。「休符の長さ」と置き換える。こうした変換によって、脳内でコードが楽譜に変換されるような感覚を得られたのです。

これは決して珍しい手法ではありません。私はかつてWeb講師をしていた時期、音楽経験者に対し「コード=楽器の構え方」や「変数=エフェクターのつまみ」といった説明をして、非常にスムーズに理解してもらえた経験があります。

C言語で奏でる「きらきら星」のコード

ここでは、「きらきら星」をC言語で演奏するサンプルコードを簡単に紹介します。


#include 
#include  // Beep() と Sleep() のために必要

// 音符の周波数 (Hz)
#define C4 262 // ド
#define D4 294 // レ
#define E4 330 // ミ
#define F4 349 // ファ
#define G4 392 // ソ
#define A4 440 // ラ
#define B4 494 // シ(使用しないけど一様)

// 音符の長さの基本単位 (ミリ秒 ms)
#define QUARTER_NOTE 240      // 四分音符
#define HALF_NOTE 480         // 二分音符
#define REST_BETWEEN_NOTES 60 // 音の間の短い休符(十六分休符)

// 音符を演奏する関数
void play_note(int frequency, int duration)
{
    Beep(frequency, duration);
    Sleep(REST_BETWEEN_NOTES); // 音の間に短い(十六分休符)入れる
}

// きらきら星の各音符の周波数(フレーズ == a - b - c x 2回 - a - b)
const int twinkle_frequencies[] = {
    C4, C4, G4, G4, A4, A4, G4, // a = ドドソソララソ
    F4, F4, E4, E4, D4, D4, C4, // b = ファファミミレレド
    G4, G4, F4, F4, E4, E4, D4, // c = ソソファファミミレ
    G4, G4, F4, F4, E4, E4, D4, // c = ソソファファミミレ (繰り返し用)
    C4, C4, G4, G4, A4, A4, G4, // a = ドドソソララソ (戻り)
    F4, F4, E4, E4, D4, D4, C4  // b = ファファミミレレド (戻り)
};
// 上記に対応する各音符の長さ。基本四分音符(各フレーズ最後は二分音符)
const int twinkle_durations[] = {
    QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE,
    QUARTER_NOTE, QUARTER_NOTE, HALF_NOTE, // aの終わり
    QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE,
    QUARTER_NOTE, QUARTER_NOTE, HALF_NOTE, // bの終わり
    QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE,
    QUARTER_NOTE, QUARTER_NOTE, HALF_NOTE, // cの終わり
    QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE,
    QUARTER_NOTE, QUARTER_NOTE, HALF_NOTE, // cの終わり(繰り返し)
    QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE,
    QUARTER_NOTE, QUARTER_NOTE, HALF_NOTE, // aの終わり(戻り)
    QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE, QUARTER_NOTE,
    QUARTER_NOTE, QUARTER_NOTE, HALF_NOTE // bの終わり(戻り)
};

// メロディ配列の要素数(音符の数)を計算
#define NUM_NOTES (sizeof(twinkle_frequencies) / sizeof(twinkle_frequencies[0]))

// メロディと持続時間の配列を受け取り演奏する関数
void play_melody_with_durations(const int frequencies[], const int durations[], int num_notes)
{
    for (int i = 0; i  num_notes; i++)
    {
        play_note(frequencies[i], durations[i]);
    }
}

int main()
{
    printf("きらきら星を演奏します\n");

    play_melody_with_durations(twinkle_frequencies, twinkle_durations, NUM_NOTES);

    printf("演奏終了\n");
    return 0;
}  
コードとピアノが融合したビジュアル

ここで注目してほしいのは、音の周波数と長さを別々の配列で管理していること。まさに「楽譜の音」と「リズムパターン」が分離されているわけです。この考え方自体が、コードを「音楽」として扱う足がかりになります。
また数学の時には無い無数の組み方が頭の中に駆け巡ります。

C言語を音楽的に学ぶメリットと実感──他言語との比較から見えたこと

C言語とHTMLやJavaScriptが並ぶ比較図

私はこれまでPHPやJavaScriptで多くの機能を実装してきました。それらは柔軟で自由度が高く、UIと直結することで成果物が明確に可視化されます。

対してC言語は、ハードに近く、制御が細かい。しかしその分「結果をイメージしづらい」側面があり、音を鳴らすなど具体的なアウトプットを通してこそ学びやすくなると実感しました。

特に音楽的アプローチは、算数や論理が苦手な人にとって有効な「補助線」になり得ます。頭の中で「これは楽譜のBメロだな」「ここはループで反復させよう」と変換することで、理解がスムーズに進むのです。JavaScriptもweb audio apiで覚えました。

「好き」を入り口にする力

ギターを弾きながらPCに向かう講師のイメージ

プログラミングは「なにを作るか」が明確であるほど学習がはかどります。そして、その動機は「好きなもの」であるほど強くなります。

私は音楽を通じてプログラムの理解が一気に深まりました。これは「苦手なものでも、自分の得意と組み合わせることで突破口が見える」ことを意味しています。

「私は何が好き?」から始まるのです。

もしあなたが今、C言語や数学、論理に苦手意識を持っているとしたら、自分の「好きなもの」を重ねてみてください。プログラミングは無機質に見えて、意外と感性の世界でもあるのです。

この記事が、誰かにとっての“きらきら星”のような道しるべになれば嬉しいです。検索する人が居たらですが!!

戻る