时间:2022-06-13 10:13:56 | 栏目:C代码 | 点击:次
给电脑插上耳机后叫喊叭 !
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)<-50,holeHdl_1.XData=holeHdl_1.XData+900;end if holeHdl_2.XData(1)<-50,holeHdl_2.XData=holeHdl_2.XData+900;end if holeHdl_3.XData(1)<-50,holeHdl_3.XData=holeHdl_3.XData+900;end 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; if any(audio_y>0.2)&&role.y>-1&&role.y<1 role.v=20; end role.v=role.v+role.a; role.v(role.v<-5)=-5; role.y=role.y+role.v; flag1=holeHdl_1.XData(1)<=95&holeHdl_1.XData(2)>=105; flag2=holeHdl_2.XData(1)<=95&holeHdl_2.XData(2)>=105; flag3=holeHdl_3.XData(1)<=95&holeHdl_3.XData(2)>=105; if (~flag1)&&(~flag2)&&(~flag3) role.y(role.y<0)=0; roleHdl_a.YData=95+role.y; roleHdl_b.YData=[90,65,90]+role.y; else if role.y<=-1 stop(game) for i=1:10 roleHdl_a.YData=(95+role.y)-i*(65+role.y)/10; roleHdl_b.YData=[90,65,90]+role.y-i*(65+role.y)/10; pause(0.1) end else roleHdl_a.YData=95+role.y; roleHdl_b.YData=[90,65,90]+role.y; end end end end end