效果:
游戏方式: 给电脑插上耳机后叫喊叭 !
说明: 1) 使用此代码应首先安装: Audio Toolbox工具箱,博主使用的版本为: Audio Toolbox 版本 3.0 (R2021a) 2) 为保证游戏加载完所有素材后再开始,故设置了加载完成界面后停滞3秒再开始运行游戏 若一进入界面就挂了,应是资源加载太久,请关掉窗口后尝试重新运行
工具箱主要部分代码: 1) 基础设置 这里懒得改了直接照抄的语音命令识别的截断数据,大家可以依据自己需要进行更改:
[audio_t,fs] = audioread('stop_command.flac');
classificationRate = 20;
adr=audioDeviceReader('SampleRate',fs,'SamplesPerFrame',floor(fs/classificationRate));
audioBuffer=dsp.AsyncBuffer(fs);
声音信号绘图:
if ishandle(fig)
audio_t=adr();
write(audioBuffer,audio_t);
audio_y=read(audioBuffer,fs,fs-adr.SamplesPerFrame);
audio_x=(0:(length(audio_y)-1))./(length(audio_y)-1);
audioHdl.XData=audio_x;
audioHdl.YData=audio_y;
end
注意: 代码后必须要进行声音采集设备的释放及timer实类的删除,否则会出现如下提示bug: A given audio device may only be opened once. 即一个设备被开启两次 因此需要设置如下回调避免该情况:
set(gcf,'tag','co','CloseRequestFcn',@clo);
function clo(~,~)
stop(game)
delete(game)
release(adr)
delete(findobj('tag','co'));
clf,close,clc
end
完整代码:
function audioGame
%@author:slandarer
%使用工具箱情况:
%Audio Toolbox 版本 3.0 (R2021a)
% figure 创建
fig=figure('Units','normalized','Position',[0.2 0.2 0.6 0.5]);
fig.NumberTitle='off';
fig.MenuBar='none';
fig.Resize='off';
fig.Name='audio Game by slandarer';
% axes_1 创建(主axes)
ax_1=axes(fig);
ax_1.Position=[0 0 1 1];
ax_1.XTick=[];
ax_1.YTick=[];
ax_1.ZTick=[];
ax_1.XLim=[0 600];
ax_1.YLim=[0 200];
hold(ax_1,'on')
% axes_2 创建(声波显示axes创建)
ax_2=axes(fig);
ax_2.Position=[0.7 0.8 0.3 0.2];
ax_2.XTick=[];
ax_2.YTick=[];
ax_2.ZTick=[];
ax_2.XLim=[0 1];
ax_2.YLim=[-1 1];
ax_2.Box='on';
ax_2.LineWidth=2;
ax_2.Color=[250,250,247]./255;
hold(ax_2,'on')
% 绘图函数句柄
groundHdl=fill(ax_1,[0,600,600,0],[0,0,65,65],[0,64,115]./255);
holeHdl_1=fill(ax_1,[0,50,50,0]+500,[0,0,65,65],[1 1 1],'EdgeColor',[1 1 1]);
holeHdl_2=fill(ax_1,[0,50,50,0]+800,[0,0,65,65],[1 1 1],'EdgeColor',[1 1 1]);
holeHdl_3=fill(ax_1,[0,50,50,0]+1100,[0,0,65,65],[1 1 1],'EdgeColor',[1 1 1]);
audioHdl=plot(ax_2,[0,1],[0,0],'Color',[0,64,115]./255);
roleHdl_a=scatter(ax_1,100,95,300,'filled','CData',[0,64,115]./255);
roleHdl_b=fill(ax_1,[-5 0 5]+100,[90,65,90],[0,64,115]./255);
% 基础属性
role.y=0;
role.v=0;
role.a=-2;
% 窗口主要回调=============================================================
[audio_t,fs] = audioread('stop_command.flac');
classificationRate = 20;
adr=audioDeviceReader('SampleRate',fs,'SamplesPerFrame',floor(fs/classificationRate));
audioBuffer=dsp.AsyncBuffer(fs);
pause(3)
fps=20;
game=timer('ExecutionMode','FixedRate','Period',1/fps,'TimerFcn',@audioMainGame);
start(game)
set(gcf,'tag','co','CloseRequestFcn',@clo);
function clo(~,~)
stop(game)
delete(game)
release(adr)
delete(findobj('tag','co'));
clf,close,clc
end
function audioMainGame(~,~)
holeHdl_1.XData=holeHdl_1.XData-5;
holeHdl_2.XData=holeHdl_2.XData-5;
holeHdl_3.XData=holeHdl_3.XData-5;
if holeHdl_1.XData(1)
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?