![840ccbc5e93981ab08123928b3dfa033.png](https://i-blog.csdnimg.cn/blog_migrate/353534fd6b566aff2d6046373bef236c.jpeg)
蝙蝠侠这部电影中,最让人着迷的不是男主蝙蝠侠,因为他太严肃了(Why so serious?),不好玩;我反而很喜欢小丑莱杰这个角色,够sick,经常口出狂言,却又发人深省。
![1f48cecf8a846322215f4d90c2edecf8.png](https://i-blog.csdnimg.cn/blog_migrate/dd87b58d8477e39e778a341fce88e684.jpeg)
既然莱杰这样发言了,那么为了爱与和平,我们这些(音)乐(白)痴就要开始曲线救国了!
众所周知,闲下来的人类总会迸发出无穷的创造力去让生活变得丰富有趣。
好比咖喱与米饭的完美碰撞,
咖啡与牛奶的两厢情悦,
烤鸭与甜面酱的难分难离,
以及Matlab对音乐的科学透析!
那么今天,我们就一起来看看Matlab如何和Music迸发出爱——的火花!
![7ecc65eae6b14294b695cdb36ea9685a.png](https://i-blog.csdnimg.cn/blog_migrate/9e487f2b4afc4b66978eec5a64944cf6.jpeg)
我们将采取渐进式的编程路径,实现三个Matlab版本的mp3音乐播放器:
(1)简单版:
简单得只有按钮。
(2)复杂版:
在按钮的基础上,增加了音乐的波形显示功能,时间进度滑条和音量控制滑条。
(3)模拟千千静音的高逼格版本,包括三个窗口:
播放窗口 + 文件管理窗口 + 歌词窗口。
咳咳,好了,让我们一起开始这段红娘之旅!
------------------------- 1. 简单版 -----------------------
我们先来实现第一个简单版本的Matlab音乐播放器。
这个版本我们就不考虑多个音乐文件播放的问题,选择一个音乐文件(就决定是你了!Canon!卡农,它的名字叫做'CanonInD.mp3'),把它放到当前的文件夹中即可。这个文件夹是我专门为利用Matlab GUI写mp3播放器的项目新建的,具体位置在:
D:MatlabPrograms_AdvancedProject_mp3player
![39285a2581137dcf11cde0961f2540bd.png](https://i-blog.csdnimg.cn/blog_migrate/e9c5f37cb8fa3feb887b78a2a33f3fec.jpeg)
从资源管理器中,把项目文件夹所在的路径,拷贝到Matlab的工作目录中。
![8048eb82fddaeaa4ef53c4d511bbd084.png](https://i-blog.csdnimg.cn/blog_migrate/b1ae5412cf9e339eff0d9fdd41e3b0b9.jpeg)
接着通过点击Matlab界面左上角的 "新建脚本"按钮来创建一个脚本文件
![314d752ff7e7006e7f5f42249b423ea4.png](https://i-blog.csdnimg.cn/blog_migrate/d0f8d485336da8a0cae0fb2099e3d298.png)
剧透一下,就是下面的palyCinD.m(你可以任意取你喜欢的名字),注意使用Function-end作为开头与结尾。你只要输入function y = playCinD(~),这个时候你点击保存,这个函数引导语的函数名就会自动写入到弹出的保存对话框中的文件名编辑框里边。
![86492395aa027ec8baf80a84396c85c5.png](https://i-blog.csdnimg.cn/blog_migrate/7c10cc189e3e43a4870eca036e79a281.jpeg)
这个时候你点保存,文件名就自动从untitiled.m变成了playCinD.m 。
function y = playCinD(~)
y = 1;
end
创建好脚本了,第一步做什么呢?
当然是,让相亲的双方相互遇见啦!
第一步,读取音乐文件。
% prepare the mp3 filename
mp3FileName = 'CanonInD.mp3';
% read the mp3 file
[mp3Y,mp3Fs] = audioread(mp3FileName);
% create a mp3p object, which can be manipulated
mp3p = audioplayer(mp3Y,mp3Fs);
第1句语言,告诉Matlab它de对象的名字;
第2句语言,使用audioread语言将它对象的采样(mp3Y)与频率(mp3Fs)读取进来。
第3句语言,设立一个接头暗号,用来播放Matlab读取到的音乐数据(采样和频率)。这个相当于把读取进来的mp3数据和频率信息,纳入到一个完整的对象。
那么相亲的背景材料都已经准备好了,让我们给他们创造一个约会的好地方吧!
第二步,建立一个控制窗口,并设立两个控制按钮。
% create a figure and set its properties
hFigure = figure(1);
set(hFigure, 'position',[100 50 400 400]);
% create two Pushbuttons, Stop and Play
hPushbutton_Stop = uicontrol('Style','Pushbutton', 'String','Stop', 'Position',[50 100 100 30]);
hPushbutton_Play = uicontrol('Style','Pushbutton', 'String','Play', 'Position',[200 100 100 30]);
第1句语言,建立一个名叫1的窗口;
第2句语言,设定好这个窗口的位置坐标。(你可以把控会场的位置和大小哦!)
第3、4句语言,设计好两个控件按钮,用‘Style’表明属性是‘Pushbutton’,用‘String’写上控件是干什么用的,再设置位置。
这时候两个控件还没有写对用的功能程序,所以现在是摆设哦,点击没有任何反应。
![2d23fc12df4f67d99b1bdb009894ca90.png](https://i-blog.csdnimg.cn/blog_migrate/f6dc45828a4d3c9727c4396fc9dc6636.jpeg)
嗯嗯不错,对象有了,地方有了,现在红娘们可以开始约会控场了。
我们的目标是,当用户想要开始播放音乐的时候,小M就可以播放音乐,用户想要暂停音乐的时候,小M 就可以停止音乐,用户想要从头开始听音乐时,小M 又乖乖地让对象回到原点。
红娘的功能就是media用户的操作(控件端)和执行对应的功能(函数端)。
那我们该怎么办呢?
别急,我们还需要有一个跟随变量,以了解当前所处的状态。
你看,我们上述目标就很明确地表述了三种约会状态:开始约会、停止约会、重新约会。那么我们给这三个状态进行一个分类就好啦~
这时候就要我们的指标数字,一个伟大的助攻出场!
![2304275bbdc92bbaf082d90c81470b28.png](https://i-blog.csdnimg.cn/blog_migrate/7522004a368d971a13103b1706071537.jpeg)
第三步一开始,设立指标数字mState,这个参数就是为了在执行的时候判断执行的状态:stop vs. play vs. pause。
% mState: 0 == stop vs. 1 == play vs. 2 == pause
mState = 0;
我们假设一个叫做mState的指标,它有三个值,分别是0,1,2。当mState=0的时候,表示原始的音乐状态,什么都没有,mState=1的时候,就是播放的状态,mState=2的时候就是暂停的状态!
在约会开始之前,小M 和乐曲都没有交流过呢,所以乐曲处于安静状态,我们先给mState赋值为0 。
这样一来,思虑就很清晰了呢!
第四步,让我们来给“play”控件和“stop”控件加上功能吧!这个就是著名的绑定机制!红娘就是要media表层的按钮控件,和底层的功能函数。
% Binding mechanism
set(hPushbutton_Stop, 'Callback',@hPushbutton_StopFcn);
set(hPushbutton_Play, 'Callback',@hPushbutton_PlayFcn);
为两个控件追加函数功能,括号里分别是“名字,属性,@调用函数名称”
先来设计一下“hPushbutton_Stop”的函数“hPushbutton_StopFcn”。
% function --> hPushbutton_StopFcn
function hPushbutton_StopFcn(hObjecgt, hEvent, handles)
if mState == 1
stop(mp3p);
mState = 0;
set(hPushbutton_Play, 'String','Play');
else
if mState == 2
stop(mp3p);
mState = 0;
set(hPushbutton_Play, 'String','Play');
else
fprintf('passn');
end
end
end
if作为判断语句在这里成为了逻辑的向导。
这里的逻辑需要大家理解一下,初始的时候mState==0,如果此刻点击按钮,对应就会什么都不需要做 fprintf('passn'));如果这个时候是处于mState == 1,说明处于播放状态,此刻点击按钮,将会停止播放音乐;如果这时候处于mState == 2,说明处于暂停状态,此刻点击会停止播放音乐。
再来设计一下“hPushbutton_Play”的函数“hPushbutton_PlayFcn”。
% function --> hPushbutton_PlayFcn
function hPushbutton_PlayFcn(hObjecgt, hEvent, handles)
if mState == 1
pause(mp3p);
mState = 2;
set(hPushbutton_Play, 'String','Play');
else
if mState == 2
resume(mp3p);
mState = 1;
set(hPushbutton_Play, 'String','Pause');
else
play(mp3p);
mState = 1;
set(hPushbutton_Play, 'String','Pause');
end
end
end
如果这个时候是播放的状态mState == 1,点击播放按钮,就pause暂停;如果这个时候是暂停状态mState == 2,点击播放按钮,就是resume继续;如果是停止状态mState == 0,点击播放按钮就play播放。
这样,播放器最基本的状态就做好啦!
![1a2973c6459d212deaee381746f499ed.png](https://i-blog.csdnimg.cn/blog_migrate/b036f28bf88171bb445c2fd4d28f28b7.png)
恭喜你获得系统奖励【Matlab简单版音乐播放器】。
![52a9e44c7b2833e13044d102662f4ee7.png](https://i-blog.csdnimg.cn/blog_migrate/66bbc561663e519ecb61e9ce322e7491.jpeg)
上集回顾:
同学们,大家还记得我们Matlab播放篇的第一步红娘工作吗?上集说道,我们使用audioread与audioplayer两大利器,让Matlab和乐曲顺利进行了第一次约会。同时,凭借我们的智慧,我们获得了一个可以Hold住全场的极简播放器。接下来,我们要开始制作复杂版的mp3音乐播放器,将跳动的旋律可视化出来。
但是,作为这一届优秀的红娘,我们的目标肯定不止于此,何况——爱的风暴已经出现,怎么能够停滞不前呢?穿越时空,竭尽全力,我会来到你身边……(咳咳,收!)只收获一个糙汉版的播放器,我们当然是不能满足的,那么我们今天就给这个糙汉播放器好·好·打扮打扮吧!
![8f03d8fdfe16b6147dc4583cac5263e9.png](https://i-blog.csdnimg.cn/blog_migrate/f0e4192bf0c18912e189cc6dca589cbf.jpeg)
------------------------- 2. 复杂版 -----------------------
复杂版相对于简单版来说,主要是增加了波形显示功能。从界面上看,多了一个显示波形的窗口(坐标轴hAxes_Wave);将原来两个按钮,stop和play/pause,修改成了三个:stop + play + pause;还会增加一个滑动条显示当前所处的时间。
![5b8a14e9ebd63667fa01be4cd7a17f3e.png](https://i-blog.csdnimg.cn/blog_migrate/7f0f618467968524c2885bd2c52316a4.jpeg)
从功能上