使用Java进行编曲

一、编曲部分

1.1一丢丢乐理知识

简单普及下乐理哈,这样便于读谱
钢琴谱一行分两个部分
上面一行用右手弹(主奏);
下面一行用左手弹奏(伴奏)。
image.png

1.2 关于节奏

(1)、主奏与伴奏中支持输入的35个音符:

倍低音:   “1--” ~ “7--”,
低 音 :   “1-” ~ “7-”
中 音 :   “1” ~ “7”
高 音 :   “1+” ~ “7+”
倍高音:   “1++” ~ “7++”

(2)、分别在主奏(.note)与伴奏(.accompaniments)中输入需要自动弹奏的音符

① 每个音符之间用空格隔开(任意多个空格,推荐每个音符包括空格共占用4个占位符,以便主奏和伴奏音符对齐)
② 输入字符"0",则会使音长额外延长一倍,可以理解为停顿;
③ 输入除了上面35个音符以及“0”以外的任意字符不会对弹奏起任何作用;
④ 如果需要换行填写,则需在上一行的末尾以及下一行的开头都加上空格;

(3)、音长里输入每两个音符之间的间隔时长,单位是毫秒(ms)

建议输入整片谱子的最短的间隔,其余更长的的间隔可以利用延时加倍解决

1.3实例练习

下面是上文中片段2里的一段旋律:
image.png
(1)确定最小时间间隔

5+5 67 1+2+ 3+4+ //主奏
5--0 2-0 7-0 00 //伴奏

(2)成品
将每个字符间加上空格

5+ 5 6 7 1+ 2+ 3+ 4+ //主奏
5-- 0 2- 0 7- 0 0 0 //伴奏

二、编码部分

1.创建一个maven项目。

2.pom.xml引入相关依赖

<!--工具库--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.3</version></dependency><!--播放mp3相关的包--><dependency><groupId>com.googlecode.soundlibs</groupId><artifactId>mp3spi</artifactId><version>1.9.5.4</version></dependency>

3.编写实现控制台输出的类

package com.zxm.play;
public class Animation extends Thread {/*** 音符*/private String[] notes;/*** 间隔时间(单位:毫秒)*/private int times;public Animation(int times) {this.times = times;}//设置音符public Animation loadNotes(String notes) {this.notes = notes.split(" ");return this;}//进程方法@Overridepublic void run() {try {int times = this.times;new Audio("audio/test.mp3").start();sleep(1000);int no = 1;
//            System.out.print(no+": ");for (int i = 0; i < this.notes.length; i++) {if (notes[i].length() < 1) {continue;}//将【-、+】这两个字符替换成空String n = this.notes[i].replace("+", "").replace("-", "");if (n.equals("\n") || n.equals("\r")) {System.out.print("\n");no++;
//                    System.out.print(no+": ");continue;}switch (n) {case "0":System.out.print("_");break;case "1":System.out.print("▁");break;case "2":System.out.print("▂");break;case "3":System.out.print("▃");break;case "4":System.out.print("▄");break;case "5":System.out.print("▅");break;case "6":System.out.print("▆");break;case "7":System.out.print("▇");break;}System.out.print(" ");sleep(times);}} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

4.编写mp3播放相关的类

package com.zxm.play;import java.io.InputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import cn.hutool.core.io.resource.ResourceUtil;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;public class Audio {private static InputStream is;private Player player;ExecutorService service = Executors.newCachedThreadPool();public Audio(String path) {is = ResourceUtil.getStream(path);try {player = new Player(is);} catch (JavaLayerException e) {e.printStackTrace();}}public void start() {service.submit(() -> {try {player.play();} catch (JavaLayerException e) {}});}
}

5.编写处理数字谱的类

package com.zxm.play;public class AudioPlay extends Thread {/*** 音符*/private String[] notes;/*** 间隔时间(单位:毫秒)*/private int times;/*** 有参构造器*/public AudioPlay(int times) {this.times = times;}/*** 加载乐谱*/public AudioPlay loadNotes(String notes) {this.notes = notes.split(" ");return this;}/*** 演奏乐谱*/@Overridepublic void run() {try {int times = this.times;new Audio("audio/test.mp3").start();sleep(1000);//准备时间for (int i = 0; i < notes.length; i++) {if (notes[i].length() < 1) {continue;}switch (notes[i]) {case "1--":new Audio("audio/ll1.mp3").start();sleep(times / 2);break;case "2--":new Audio("audio/ll2.mp3").start();sleep(times / 2);break;case "3--":new Audio("audio/ll3.mp3").start();sleep(times / 2);break;case "4--":new Audio("audio/ll4.mp3").start();sleep(times / 2);break;case "5--":new Audio("audio/ll5.mp3").start();sleep(times / 2);break;case "6--":new Audio("audio/ll6.mp3").start();sleep(times / 2);break;case "7--":new Audio("audio/ll7.mp3").start();sleep(times / 2);break;case "1-":new Audio("audio/l1.mp3").start();sleep(times / 2);break;case "2-":new Audio("audio/l2.mp3").start();sleep(times / 2);break;case "3-":new Audio("audio/l3.mp3").start();sleep(times / 2);break;case "4-":new Audio("audio/l4.mp3").start();sleep(times / 2);break;case "5-":new Audio("audio/l5.mp3").start();sleep(times / 2);break;case "6-":new Audio("audio/l6.mp3").start();sleep(times / 2);break;case "7-":new Audio("audio/l7.mp3").start();sleep(times / 2);break;case "1":new Audio("audio/m1.mp3").start();sleep(times / 2);break;case "2":new Audio("audio/m2.mp3").start();sleep(times / 2);break;case "3":new Audio("audio/m3.mp3").start();sleep(times / 2);break;case "4":new Audio("audio/m4.mp3").start();sleep(times / 2);break;case "5":new Audio("audio/m5.mp3").start();sleep(times / 2);break;case "6":new Audio("audio/m6.mp3").start();sleep(times / 2);break;case "7":new Audio("audio/m7.mp3").start();sleep(times / 2);break;case "1+":new Audio("audio/h1.mp3").start();sleep(times / 2);break;case "2+":new Audio("audio/h2.mp3").start();sleep(times / 2);break;case "3+":new Audio("audio/h3.mp3").start();sleep(times / 2);break;case "4+":new Audio("audio/h4.mp3").start();sleep(times / 2);break;case "5+":new Audio("audio/h5.mp3").start();sleep(times / 2);break;case "6+":new Audio("audio/h6.mp3").start();sleep(times / 2);break;case "7+":new Audio("audio/h7.mp3").start();sleep(times / 2);break;case "1++":new Audio("audio/hh1.mp3").start();sleep(times / 2);break;case "2++":new Audio("audio/hh2.mp3").start();sleep(times / 2);break;case "3++":new Audio("audio/hh3.mp3").start();sleep(times / 2);break;case "4++":new Audio("audio/hh4.mp3").start();sleep(times / 2);break;case "5++":new Audio("audio/hh5.mp3").start();sleep(times / 2);break;case "6++":new Audio("audio/hh6.mp3").start();sleep(times / 2);break;case "7++":new Audio("audio/hh7.mp3").start();sleep(times / 2);break;case "0":sleep(times / 2);break;default:continue;}sleep(times / 2);times = this.times;}} catch (Exception e) {throw new RuntimeException(e);}}}

6.编写乐曲demo

package com.zxm.musicList;import com.zxm.play.Animation;
import com.zxm.play.AudioPlay;/*** @author :silencezheng*琴谱url:http://www.ktvc8.com/mobile/833116_1.html* 《遇见》————孙燕姿*/
public class YuJian {public static void main(String[] args) {//伴奏(太难了,看不懂,需要的话可以自己扒谱补全)String sub =  " 0  0  0  0  1- 5  0  0  7- 5  0  0  6- 3  6  0  0  0  0  4- 1  4  0  3- 1  3 0 \n" +" 2- 6-  2  0  5-- 2-  5-  1- 5-  1 5-  7-- 5-  7- 5-  6-- 3-  6- 3-  5-- 3-  5-3- \n" +" ";//主奏String main = " 0 0 0 5+ 3+ 3+ 0 5+ 2+ 2+ 0 5+ 1+ 1+ 0 0 1+ 3 5 1+ 1+ 0 5+ 1+ 1+ 0 1+ 5+ \n" +" 5+ 0 0 4+ 5+ 3 0 4 3 0 5 0 6 0 7 0 7 0 1+ 0 2+ 0 3+ 0 \n" +" 3+ 0 0 1+ 1+ 0 5 0 0 5 3 3 0 5 2 2 0 3 2 \n" + //听见冬天的离开" 2 1+ 0 1 1 7- 6- 7- 1 7- 7- 1 2 3 3 0 0 0 0 5 3 \n" + //我在某年某月 醒过来" 3 0 5 2 2 0 3 2 2 1+ 0 1 1 7- 6- 7- 1 7- 7- 1 2 1 \n" + //我想 我等 我期待 未来却不能因此安排" 4 3 2 1 5- 5 3 3 0 5 2 2 0 3 2 2 1+ 0 0 1 1 7- \n" + //阴天 傍晚 车窗外" 6- 7- 1 7- 7- 1 2 3 3 0 0 5 3 3 0 5 2+ 2+ 1+ 0 7 \n" + //未来有一个人在等待 向左向右向前看" 1+ 0 0 0 1 7- 6- 7- 1 7- 7- 1 2 1  \n" + // 爱要拐几个弯才来" 1 0 0 0 5+ 6+ 7+ 1++ 0 7+ 1++ 7+ 6+ 5+ 4+ 5+ 0 7 \n" + //我遇见谁 会有怎样的对白" 5+ 1+ 0 2 3  4 0 3 4 5 1 2 3 \n" + //我等的人 他在多远的未来" 3 3+ 0 3 5 6 7 1+ 0 7 1+ 2+ 1+ 2+ 3+ 3+ 5+ \n" + //我听见风来自地铁和人海" 0 0 1 2 3 4 0 3 4 3 2 1 7- 1 0 0 \n" + //我排着队 拿着爱的号码牌" 0 5+ 3+ 5 3+ 2++ 5+ 3+ 5 3+ 2++ 5+ 3+ 6 3+ 2++ 5+ 3+ 6 7 1+ 6+ 2+ 0 0 \n" +" 3 1+ 2++ 3++ 2++ 1++ 2 1+ 7- 5- 7- 7- 0 0 6- 5- 6- 7- 2 2 4 \n" +" 3 0 0 5 3 3 0 5 2 2 0 3 2 2 1+ 0 0 1 1 1 7- \n" + //阴天 傍晚 车窗外 未来有一个人在等待" 6- 7- 1 7- 7- 1 2 3 3 0 0 5 3 3 0 5 2+ 2+ 1+ 0 7 \n" + //向左向右向前看" 1+ 0 0 0 1 7- 6- 7- 1 7- 7- 1 2 1 \n" + //爱要拐几个弯才来" 1 0 0 5 6 7 1+ 0 7 1+ 7 6 5 6 6 5+ 5 1 0 2 3 4 0 3 4 5 1 2 3 \n" +//我遇见谁 会有怎样的对白 我等的人 他在多远的未来" 3 3+ 0 3 5 6 7 1+ 0 7 1+ 2+ 1+ 2+ 3+ 3+ 5+ \n" +//我听见风来自地铁和人海" 0 0 1 2 3 4 0 3 4 3 2 1 7- 1 0 0 \n" + //我排着队 拿着爱的号码牌" 1 0 0 5 6 7 1+ 0 7 1+ 7 6 5 6 6 5+ 5 1 0 2 3 4 0 3 4 5 1 2 3 \n" + //我往前飞 飞过一片时间海 我们也曾在爱情里受伤害" 3 3+ 0 3 5 6 7 1+ 0 7 1+ 2+ 1+ 2+ 3+ 3+ 5+ \n" +//我看着路 梦的入口有点窄" 0 0 1 2 3 4 0 3 4 3 2 1 7- 1 0 0 \n" + //我遇见你是最美丽的意外" 5 6 7 1+ 0 7 1+ 7 6 5 4 5 \n" + //总有一天 我的谜底会揭开"0 0 0 4 3 1 6- 5- 4- 3- 0 0 0 \n";// 播放new AudioPlay(320).loadNotes(main).start();//new AudioPlay(320).loadNotes(sub).start();//控制台打印new Animation(320).loadNotes(main).start();}
}

原文链接:https://blog.silencezheng.cn/articles/91

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28504.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小米系列手机(包括红米,黑鲨)开启调试模式

1. 点击我的设备 进入设置主页面&#xff0c;点击我的设备&#xff0c;点击全部参数。 2. 点击MIUI版本 连续点击MIUI版本直到出现提示&#xff0c;开发者权限已开启。 3. 点击更多设置 返回设置&#xff0c;点击更多设置。 4. 查看信息 在更多设置中就能看到开发者选项。 …

小米手机超越苹果,成欧洲第二;马斯克特斯拉内部邮件:痛恨开会,少讲黑话;Spring 6.0 发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

MiPush四种推送对象

文档中心 推送对象目前支持四种&#xff1a;RegID、别名、userAccount、标签。 RegID&#xff1a;针对单一设备推送消息。应用调用MiPushClient类的静态方法registerPush注册小米推送服务&#xff0c;注册的结果将通过PushMessageReceiver继承类的onCommandResult方法和onRec…

小米正式宣布:这种手机以后买不到了…

开头先问大家一个问题&#xff0c;你的手机屏幕尺寸是多少&#xff1f; 还记得当初乔老爷子发布 iPhone 时&#xff0c;称 3.5 英寸是人手握持的最佳尺寸。 不过&#xff0c;当时苹果显然没有考虑到奥尼尔这样体格魁梧的人的使用感受... 3.5 英寸&#xff0c;4.0 英寸&#xf…

MIUI金凡回应用户反馈小米手机发热情况

本文转载自IT之家 IT之家 6 月 17 日消息 小米产品总监、MIUI 体验总负责人金凡近期称&#xff0c;已正式成立了“MIUI 先锋小组”&#xff0c;集中解决大家反馈的各类体验问题&#xff0c;做好首席客服小组。接下来会以报告的形式将工作进度发在小米社区中&#xff0c;请大家…

原来这样可以优雅地解决小米手机后台弹窗权限问题

/ 今日科技快讯 / 7月23日&#xff0c;据外媒报道&#xff0c;微软宣布将向总部位于美国旧金山的人工智能研究公司OpenAI投资10亿美元&#xff0c;为其云计算平台开发AI技术。 / 作者简介 / 本篇文章转载自nodzhang的博客&#xff0c;分享了他对于小米手机后台弹出界面…

时薪15美元的ChatGPT外包工人,干的都是苦力活

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 自 ChatGPT 去年 11 月发布以来&#xff0c;让不少打工人陷入担心失业的恐慌中&#xff0c;也解决了部分人的“就业问题”。 34 岁的 Alexej Savreux &#xff0c;就是其中之一。 作为 …

AutoGPT:全自动的人工智能助手

让 GPT-4 为你实现一切&#xff01; 随着人工智能技术的飞速发展&#xff0c;GPT-4 作为强大的人工智能语言模型成为了众多应用场景的核心。今天&#xff0c;我们将为你揭秘一款具有革命性意义的 GPT-4 应用——AutoGPT&#xff01;一款让你轻松操控 GPT-4&#xff0c;实现各种…

文心一言、GPT3.5及GPT4的应用测评对比

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年2月份热门报告合集 最新亲测国内可用ChatGPT使用教程&#xff08;3分钟搞定&#xff09; ChatGPT团队背景研究报告 ChatGPT的发展历程、原理、技术架构及未来方向 Cha…

看New Bing回答世纪难题:女友和妈妈掉水里先救谁

1.女友和妈妈掉水里先救谁 今天好奇想看看New Bing怎么回答这种世纪难题 结果New Bing非常聪明&#xff0c;反手建议我不要直接回答这个问题&#xff0c;而是换个角度哄女朋友&#xff0c;带着点不甘心&#xff0c;我继续追问它 New Bing还是耍起了滑头&#xff0c;我开始怀疑…

“一天宕机三次”,为什么高并发这么难?

受访者 | 陈皓 作者 | 屠敏 出品 | 《新程序员》编辑部 高并发&#xff0c;并不是一个新鲜的话题&#xff0c;全互联网公司为之“费尽心思”多年&#xff0c;仍然无法完全逃脱卡顿、崩溃乃至宕机的宿命。 这不近日&#xff0c;一款名为“羊了个羊”的小程序游戏突然爆火&am…

美图终于等来AIGC的春天

作者&#xff5c;陈 妍 编辑&#xff5c;大 风 人类历史上&#xff0c;经历过三次科技颠覆时刻。 第一次是上世纪90年代&#xff0c;PC互联网的兴起&#xff0c;开始把全世界连接到一起。1995年&#xff0c;以雅虎为代表的企业&#xff0c;开创免费门户网站的互联网行业商业…

UML建模都有那些图(架构师必刷)

分析&回答 统一建模语言&#xff08;Unified Modeling Language&#xff0c;UML&#xff09;又称标准建模语言。 UML从考虑系统的不同角度出发&#xff0c;定义了用例图、类图、对象图、包图、状态图、活动图、序列图、通信图、构件图、部署图等10种图。下图中红字部分为…

SWAT 建模与案例应用

SWAT 建模与案例应用 一、模型简介 SWAT模型是美国农业部&#xff08;USDA&#xff09;的农业研究中心开发的分布式水文模型。 主要目的是为了预测在大流域复杂多变的土壤类型、土地利用方式和管理措施条件下&#xff0c;土地管理对水分、泥沙和化学物质的长期影响。 近年来…

UML建模工具Astah Pro教程

文章目录 前言一、下载安装Astah二、破解Astah总结 前言 UML建模工具Astah Pro 破解教程&#xff0c;拒绝盗版白嫖行为&#xff0c;只是本人囊中羞涩&#xff0c;想购买正版&#xff0c;但是心有余而力不足。所以此文章只做为技术学习交流&#xff0c;不用于任何商业用途。如果…

Unity+ChatGpt的联动 AICommand

果然爱是会消失的&#xff0c;对吗 chatGpt没出现之前起码还看人家的文章&#xff0c;现在都是随便你。 本着师夷长技以制夷的思路&#xff0c;既然打不过&#xff0c;那么我就加入 github地址&#xff1a;https://github.com/keijiro/AICommand 文档用chatGpt翻译如下&#…

AI 对话模型被网友玩坏了!这次还可以运行 Docker 容器...

最近一款新的聊天 AI 被网友们玩疯了。 它可以直接生成代码、可以给你的代码 debug 以及提出优化... 可以模仿莎士比亚风格写作... 还可以解答各种各样的问题&#xff0c;而且显然不只 10 岁小孩子的智商&#xff0c;感觉它已经把互联网上所有的公开资料都吸收并消化了。 这就是…

chatgpt赋能Python-python_png转pdf

Python PNG转PDF - 一种简便的图像转换方式 在图像处理中&#xff0c;有时我们需要将PNG格式的图像转换成PDF格式&#xff0c;以便于在电子文档中使用或者进行打印。虽然市面上有很多可用的图像转换工具&#xff0c;但是许多人都喜欢使用Python进行图像处理&#xff0c;因为Py…

HTC VIVE Focus Wave VR SDK 新手入门开发配置全指南 Development Tutorial

文章目录 配置Android开发环境下载 & 安装Java 8 SDK配置Android SDK 安装Unity安装Unity Hub安装Unity 2018.4.4f1配置Unity工程转换为安卓平台修改Player Settings工程设置 配置Unity路径导出设置 VIVE Input Utility介绍安装配置使用VIU模拟器 *本文是在开发人员岳阳分享…

实战分享1:如何使用华为VR Glass 6dof 基于 OpenXR@ unity 开发VR游戏/应用

目录 1 环境准备 2 使用OpenXR XR Interaction Toolkit 2.1 工程准备 2.1.1 安装openxr相关插件 2.1.2 配置工程 2.1.3 Debugger -XR Interaction Debugger 2.2 场景搭建 2.2.1 头部显示和位姿追踪测试 2.2.2 加入双手柄交互&#xff08;6dof&#xff09; 2.2.3 结果…