MATLAB制作简易版本不要停,八分音符酱 (大概算音游)

2023-10-10 02:20

本文主要是介绍MATLAB制作简易版本不要停,八分音符酱 (大概算音游),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果:
在这里插入图片描述
在这里插入图片描述

游戏方式:
给电脑插上耳机后叫喊叭 !

说明:
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
endfunction 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;endif holeHdl_2.XData(1)<-50,holeHdl_2.XData=holeHdl_2.XData+900;endif holeHdl_3.XData(1)<-50,holeHdl_3.XData=holeHdl_3.XData+900;endif 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<1role.v=20;endrole.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;elseif role.y<=-1stop(game)for i=1:10roleHdl_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)endelseroleHdl_a.YData=95+role.y;roleHdl_b.YData=[90,65,90]+role.y;endendendendend

这篇关于MATLAB制作简易版本不要停,八分音符酱 (大概算音游)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/177228

相关文章

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

查看MySQL数据库版本的四种方法

《查看MySQL数据库版本的四种方法》查看MySQL数据库的版本信息可以通过多种方法实现,包括使用命令行工具、SQL查询语句和图形化管理工具等,以下是详细的步骤和示例代码,需要的朋友可以参考下... 目录方法一:使用命令行工具1. 使用 mysql 命令示例:方法二:使用 mysqladmin 命令示例:方

Java版本不兼容问题详细解决方案步骤

《Java版本不兼容问题详细解决方案步骤》:本文主要介绍Java版本不兼容问题解决的相关资料,详细分析了问题原因,并提供了解决方案,包括统一JDK版本、修改项目配置和清理旧版本残留等步骤,需要的朋... 目录错误原因分析解决方案步骤第一步:统一 JDK 版本第二步:修改项目配置第三步:清理旧版本残留兼容性对

Linux搭建单机MySQL8.0.26版本的操作方法

《Linux搭建单机MySQL8.0.26版本的操作方法》:本文主要介绍Linux搭建单机MySQL8.0.26版本的操作方法,本文通过图文并茂的形式给大家讲解的非常详细,感兴趣的朋友一起看看吧... 目录概述环境信息数据库服务安装步骤下载前置依赖服务下载方式一:进入官网下载,并上传到宿主机中,适合离线环境

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

《JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)》本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有... 目录第一步 下载安装JDK第二步 配置环境变量第三步 切换JDK版本并验证可能遇到的问题前提:公司常