プログラミングで音楽をつくる

「音楽をつくる」というととても幅広いので、ここでは手法を絞って、なおかつ、アレンジできる要素がたくさんあるものを考えました。プログラミングが初めての人を対象にしたワークショップのためのアイデアです。

人間が最初に楽器として鳴らした音は、おそらく石や木をたたく音でしょう。その短い音を繰り返して鳴らしたり、合いの手を入れるように違う音を鳴らすと、リズムをつくることができます。たとえば「トン・タ・トン・タ」「トン・タタ・トン・タ」と、音を鳴らす順番を変えたり、たまに「トンタ!」と同時に鳴らしたりしながら繰り返し演奏すれば、2つの音だけでも無数の組み合わせで、リズムをつくることができます。

下のエリアをクリックすると音が鳴りはじめます。もう一度クリックでストップします。
「トン・タ・トン・タ」と「トン・タタ・トン・タ」の2つのリズムが聞こえると思います。

https://editor.p5js.org/ShozoKUZE/sketches/SMWjbE3qB



//一定時間おきに、
//四角と円を交互にランダムに図形を描く
//音を鳴らす

//変数
let timestamp = 0;
let count = 0;
let toggleStart = 0;

let mySound = [];

function preload(){
  //音のファイルはSonicPiの音源をWAV変換し使っています
  //https://sonic-pi.net/
  mySound[0] = loadSound("sound/elec_ping.wav");
  mySound[1] = loadSound("sound/elec_flip.wav");
}


//セットアップ
function setup() {
  //画面サイズ
  createCanvas(windowWidth, windowHeight);
 
}

//ループ
function draw() {
  //クリックしてないとき
  if(toggleStart==0){
    textAlign(CENTER,CENTER);
    fill(255,255,255);
    text("C L I C K",width/2,height/2);
    background(100, 120, 120, 10);
    count=0;
    return;
  }
  
  
  //250ミリ秒おきに
  if (millis() - timestamp > 250) {
    timestamp = millis();
    

    //countを8で割ったあまりが0のとき
    if(count % 8 == 0){
      drawRect();  //四角
      mySound[1].play();  
    }
    
    //countを16で割ったあまりが1のとき
    if(count % 16 == 1){
      drawRect();  //四角
      mySound[0].play();  
    }
    
    //countを8で割ったあまりが2のとき
    if(count % 8 == 2){ 
      drawEllipse();  //円
      mySound[0].play();
    }
    
    //countを8で割ったあまりが3のとき
    if(count % 8 == 4){ 
      drawRect();  //四角
      mySound[1].play();
    }
    
    //countを8で割ったあまりが6のとき
    if(count % 8 == 6){ 
      drawEllipse();  //円
      mySound[0].play();
    }
    
    //countを1ずつ増加
    count ++;
    
  }
}

//クリックでスタート・ストップ
function mousePressed(){
  if(toggleStart==0){
    toggleStart = 1;
  }else{
    toggleStart = 0;
  }
}


//四角を描く
function drawRect(){
  //線をナシ
  noStroke();
  //塗り色
  fill(100, 50, random(100, 255), 50);
  //四角の基準点を中心に
  rectMode(CENTER);
  //四角を描く 
  rect(random(0, width), random(0, height), random(0, 500), random(0, 500));     
}

//円を描く
function drawEllipse(){
  //線をナシ
  noStroke();
  //塗り色
  fill(200, random(200, 250), random(200, 250), 50);
  //円を描く 
  ellipse(random(0, width), random(0, height), random(0, 500));     
}