iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Modern Web

從新開始學習p5.js畫出一片天系列 第 12

D12_Audio聲音操作(聲音檔)

  • 分享至 

  • xImage
  •  

Audio聲音操作(聲音檔)

今天來整理在p5.js的sound物件及DOM的audio元件的操作方式
首先使用p5.js的方式建立 audio 元件, 產生的物件類別是 MediaElement

let can;
let audio;
function setup() {
	can = createCanvas(400, 400); 
	can.id("can1");
	can.class("c1");
	can.position(0, 0);
	background(0);

	audio = createAudio('assets/canon.mp3');
    audio.autoplay(true);

	console.log(audio);
}

產生的元件標籤為

<audio crossorigin="anonymous" autoplay="true"><source src="assets/canon.mp3"></audio>

在p5.js中,會產生類別為 p5.MediaElement的一共有3個,分別為
createVideo,createAudio 及createCapture
關於 MediaElement 的操作項目,可以參考 https://p5js.org/reference/#/p5.MediaElement 的說明,
比較常用的有以下幾項
elt 是取得DOM的元件標籤
src 是檔案的路徑

play() 播放
stop() 停止
pause() 暫停
loop() 循環播放
noLoop() 切換單次播放
autoplay() 設定自動播放

volume() 音量,數值為 0.0 ~ 1.0
speed() 播放速度,數值為 0.5,1,2,-1(反向播放)
time() 播放時間點,數值單位為秒
duration() 播放總時間

onended() 當播放結束時
connect(audioNode) 連結audio輸出的音訊節點 audioNodeo
disconnect() 中斷audio輸出的音訊節點

showControls() 顯示控制項
hideControls() 隱藏控制項

addCue() 增加Cue時間點事件
removeCue() 移除Cue時間點事件
clearCues() 清除Cue時間點事件

當音樂播放到5秒時,音樂暫停

audio.addCue(5, () =>{
    console.log("audio pause");
    audio.pause();
});

顯示控制項,自動播放的audio元件標籤

<audio crossorigin="anonymous" id="au1" autoplay="true" controls="" style="text-align: inherit;"><source src="assets/canon.mp3"></audio>

如果要設定音樂播放時間點,也就是跳轉到設定的時間點播放,
可以使用 time(10) 功能,
先執行 audio.time(10); 接著執行 audio.play();

audio.time(10);
audio.play();

audio.addCue(5, () =>{
    console.log("audio pause");
    audio.pause();
});

以上的程式碼,雖然是直接跳到10秒的時間點播放,但是因為在5秒時有設定cue點,
程式在play()播放時,會從0秒開始移動到10秒播放,這時0秒 ~ 10秒之間沒有播放,
但是會經過5秒時間點的cue點,還是會觸發第5秒的cue點事件,而使得音樂暫停。

background(0);
text(audio.time(), 100, 100);
text(audio.duration(), 100, 150);

在顯示 audio.time(),audio.duration() 時,數值是秒,
有時會需要將「秒」轉換為「時:分:秒」的顯示方式

let tm = audio.duration();
let s = int(tm) % 60;
let m = int(int(tm) / 60) % 60;
let h = int(int(int(tm) / 60) / 60);

同時,在設定播放時間點時,也需要將「時:分:秒」轉換為「秒」的數值
let tm = h * 60 * 60 + m * 60 + s;

完整程式碼

let can;
let audio;
function setup() {

	can = createCanvas(400, 400);
	can.id("can1");
	can.class("c1");
	can.position(10, 10);
	background(0);

	audio = createAudio('assets/canon.mp3');
	audio.id("au1");
	audio.autoplay(true);
	audio.showControls();
	audio.position(15, 15);

	console.log(audio);
	console.log(audio.elt);

	audio.time(0);
	audio.play();

	audio.addCue(5, () =>{
		console.log("Cue 5");
	});

	audio.onended((e) => {
		console.log(e);
		console.log("end");
		audio.time(0);
		audio.play();
	});

	audio.volume(1.0);
	fill(255);
	textSize(32);
}

function draw() {
	background(0);
	
	text(int(audio.duration()), 50, 150);
	text(int(audio.time()), 50, 200);
	
	let tm1 = hms(audio.duration());
	text(tm1[0] + ":" + tm1[1] + ":" + tm1[2], 150, 150);

	let tm2 = hms(audio.time());
	text(tm2[0] + ":" + tm2[1] + ":" + tm2[2], 150, 200);

	let tm3 = sec(tm1[0], tm1[1], tm1[2]);
	text(tm3, 150, 250);

	let tm4 = sec(tm2[0], tm2[1], tm2[2]);
	text(tm4, 150, 300);

}

function hms(tm) {
	let s = int(tm) % 60;
	let m = int(int(tm) / 60) % 60;
	let h = int(int(int(tm) / 60) / 60);
	return [h, m, s];
}

function sec(h, m, s) {
	let tm = h * 60 * 60 + m * 60 + s;
	return tm;
}

執行結果
執行結果

最後是聲音音量的淡入淡出

let vol = 1.0;
function draw() {
	if(st==1){
		vol += (0.0-vol)*0.05;
		audio.volume(vol);
	} else {
		vol += (1.0-vol)*0.01;
		audio.volume(vol);
	}
}

let st = 0;
function mousePressed(){
	st = (st+1)%2;
}

在DOM的audio元件中,提供更多的操作功能。(Methods, Properties, Events)
可參考 HTML Audio/Video DOM Reference 的內容
https://www.w3schools.com/tags/ref_av_dom.asp

進階的功能,有時間會再另一篇整理說明,
像是音訊資料,合成器等。

參考資料
createAudio()
https://p5js.org/reference/#/p5/createAudio
p5.MediaElement
https://p5js.org/reference/#/p5.MediaElement
HTML Audio/Video DOM Reference
https://www.w3schools.com/tags/ref_av_dom.asp


上一篇
D11_文字與字型操作
下一篇
D13_Audio聲音操作(麥克風)
系列文
從新開始學習p5.js畫出一片天40
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言