`
hdxiong
  • 浏览: 375277 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

让Java轻松乐动起来,使用JFugue制作自己的音乐

    博客分类:
  • Java
阅读更多
学过或用过 Basic 的朋友大约还会记得,在 Basic 里要演奏(当时还是从 PC 喇叭里发出的,现在也能走声卡了)一段 哆来咪发唆拉西哆 可以写成:
PLAY "C D E F G A B O6C"

直接用 JDK 可没有这么简单,虽然 JDK 1.3 开始就引入了 Java Sound API 处理 MIDI(Musical Instrument Digital Interface),可是它的接口很难使用,另外,Sun 也专为视、音频的捕获、回放、格式转换提供了 Java Media Framework API (JMF),但不能用来创作。有一个开源的组件 JFugue(http://www.jfugue.org/),它能让你尽显音乐方面的天赋,给你一个高级易用的接口来操作 Java Sound,制作自己的 MIDI 音乐。


一:JFugue Hello World

JFugue 使用字符串来描述音乐表现,然后将其转换成 MIDI 指令并通过 Java Sound 接口对其进行处理。JFugue 可以播放音乐本身,或是保存为一个 MIDI 文件。使用它的 API 非常的容易,比如完成上面 Basic 代码的功能,只要写成
Player player = new Player(); 
player.play("C D E F G A B C6W");

其中的 "C D E F G A B C6W" 就是一个 MIDI 指令集,字符串描述不区分大小写,对音乐有所了解的朋友一眼就能看明白。每一项是一个音符,音符由三部分组成,分别是:

1. 音符名 -- 即唱名,如 CDEFGAB
2. 音高 -- 默认为 5(表示第五个八度-中央 C 所在的八度),如 C7 就是简谱的 ⅰ。您能够用#和b字符分别表示升半音和降半音。
3. 音长 -- 默认为 Q(quartar),表示四分之一符,还有 W(whole),全音符,H(half),半音符。其他如:1/8("i")、1/16("s")、1/32("t")、1/64("x")和1/128音值("n")。您能够通过在音值字符后面加上一个点(".")来表示一个点音值。

除了用音符字母来指定音符名之外,还可直接使用“音符值(note value)”,同时表达音符名和音高。MIDI 有128个音符,编号是从0到127,以半音为间距。第60号音符是Middle-C。要指定音符值,就要在一个方括号里加上数值,比如 [60]。例如前面的 哆来咪发唆拉西哆 可以写成:
player.play("T120 I[24] [60] D [64] F I[Piccolo] G A B C6W");

所以前面的 C 其实是 C5Q 的缩写,音符名为 C,音高 5 表示第五个八度,音长为 Q,表示四分之一符。


二:音色与节拍

此外,MIDI 可以指定音色(即乐器) 和节拍,JFugue 也当仁不让的支持,例如我们依次用吉他和短笛以每分钟 120 拍演奏上面的序列:
player.play("T120 I[Guitar] C D E F I[Piccolo] G A B C6W");

上面的 T 是 Tempo 拍子的缩写,I 是 Instrument 乐器的缩写。General Midi(GM) 音色表里有 128 种乐器(名称和编号)可选,参见:★GM 音色表★常用MIDI控制器一览表★专业术语字典★常用术语。I[] 中括号里可以用乐器名,也可以用编号,如 I[Guitar] 可用 i[24] 替换。只是对于中国民族乐器,如二胡、琵琶的支持还得研究一下。


三:和弦支持

用字符串来描述音乐的另一个优良特性是能够制作和弦。例如用下面的代码方便时创建一个和弦编组(使用了 Pattern 的写法):
Pattern progression = new Pattern(); 
progression.add("T160 I[Guitar] c5majw g5majw a5minw f5majw g5majw c5majw"); 
Player jukebox = new Player(); 
jukebox.play(progression);

关于和弦的命名可参考:常用和弦的分类和命名,针对 JFugue 的准确命名还得看 JFugue 提供的文档。说明一下,c5majw 中的 c5 表示根音为中央 C,maj 表示大三和弦,w 为全音符。上面执行后发出来的是和弦齐奏的声音,还要研究一下和弦如何进行分解。

可用 Player 来保存成一个 Midi 文件:
jukebox.save(progression,"c:/music/chord.mid");

四:请您欣赏

最后来欣赏一段用 JFugue 演奏的节奏感很强的鼓点的音乐(beat16.mid),这段音乐的代码如下:
Rhythm rhythm = new Rhythm(); 
//Bang out your drum beat  
rhythm.setLayer(1, "O..oO...O..oOO.."); 
rhythm.setLayer(2, "..*...*...*...*."); 
rhythm.setLayer(3, "^^^^^^^^^^^^^^^^"); 
rhythm.setLayer(4, "...............!"); 
 
//Associate percussion notes with your beat  
rhythm.addSubstitution('O', "[BASS_DRUM]i"); 
rhythm.addSubstitution('o', "Rs [BASS_DRUM]s"); 
rhythm.addSubstitution('*', "[ACOUSTIC_SNARE]i"); 
rhythm.addSubstitution('^', "[PEDAL_HI_HAT]s Rs"); 
rhythm.addSubstitution('!', "[CRASH_CYMBAL_1]s Rs"); 
rhythm.addSubstitution('.', "Ri");   
 
//Play the rhythm!  
Pattern pattern = rhythm.getPattern(); 
pattern.repeat(4); 
Player player = new Player(); 
player.play(pattern);

接下来就是研究一下的是如何把多音乐进行合成,得到更发烧一级的效果。更详细的 JFugue 使用请浏览它的官网 http://www.jfugue.org/index.html。

参考:1. 用Java JFugue进行快速音乐编程  英文原文:Rapid music programming with Java JFugue
        2. Code To Joy: myTunes: Groovy and JFugue
        3. Interview: JFugue Goes Hip Hop
        4. Swing application that uses JFugue API for MIDI files
        5. JFugue User's Guide
分享到:
评论

相关推荐

    使用jfugue来演奏mid音乐

    JFugue是一个Java库,专门用于音乐编程。它允许开发者使用文本字符串来表示音乐,然后将这些字符串解析成 MIDI(Musical Instrument Digital Interface)信号,进而让计算机播放音乐。这个库非常适合那些想要通过...

    jfugue的使用

    jfugue是一种Java库,主要用于在Java环境中编辑和操作MIDI文件以及保存为MIDI格式。jfugue的核心功能是Music String(音乐...通过学习和掌握jfugue的使用方法,Java开发者可以轻松实现对MIDI文件的操作和音乐的生成。

    jfugue_programming.pdf

    从描述中提到的“JAMMING WITH JAVA™ TECHNOLOGY: MAKING MUSIC WITH JFUGUE AND JFRETS”,我们可以推断出文档中包含了如何使用JFugue和另一个相关的库JFrets来制作音乐。文档内容可能会覆盖JFugue的以下方面: 1...

    JAMMING WITH JAVA™ TECHNOLOGY: MAKING MUSIC WITH JFUGUE AND JFRETS

    JFugue是一个开源的Java API,它为编程音乐提供了一个简单而直接的途径,使得开发者可以在Java应用程序中直接创造音乐,而无需直接处理复杂的MIDI消息。它背后的原理是在后台自动生成MIDI消息,但允许用户以一种自然...

    java源码包---java 源码 大量 实例

    Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象...

    JMF版Java音乐播放器

    在本项目中,"JMF版Java音乐播放器" 是一个基于Java Media Framework开发的音乐播放应用,旨在提供类似酷我音乐盒的用户体验。** ### JMF 知识点: 1. **JMF(Java Media Framework)**:是由Sun Microsystems开发...

    java俄罗斯方块源代码(网络对战+道具使用+背景音乐播放+音效播放)

    完全原创的一个java俄罗斯方块游戏,实现了网络对战、道具使用、背景音乐播放、音效播放等功能。但网络对战和道具使用部分尚有些小问题,仍需要测试,因为没时间做了,发上来供大家下载,如果哪位有兴趣,想一起研究...

    TheCompleteGuideToJFugue-v1.pdf

    JFugue是一个开源的Java库,允许程序员通过编写代码来生成和操作音乐。这个库简化了音乐编程的过程,使得开发者能够更容易地创建音乐作品,而无需深入复杂的MIDI编程。JFugue库的最新版本是5.0,但文档中提到的教程...

    JAVA版MP3音乐播放器+源代码(初学者)

    这款JAVA版的MP3音乐播放器项目,不仅涵盖了Java编程的基本概念,还深入到多媒体处理领域,对于想在Java编程和多媒体应用开发方面提升自己的初学者来说,是一个绝佳的实践项目。通过实际动手,你可以将理论知识转化...

    java获取网络音乐文件时长

    在Java编程中,获取网络音乐文件的时长是一项常见的任务,尤其在开发音乐播放器或者处理音频流的应用中。下面将详细介绍三种不同的方法来实现这一功能。 ### 方法一:使用`BufferedInputStream`和`AudioInputStream...

    java音乐播放器+源代码

    Java音乐播放器是一款基于Java编程语言开发的多媒体应用程序,它能够读取、解码和播放各种音频文件。这款播放器的特别之处在于它的开源性质,意味着开发者或对编程感兴趣的用户可以查看并修改其源代码,以学习或者...

    Java2Pas Java代码转pas代码

    Java2Pas是一个实用工具,主要用于将Java编程语言编写的源代码转换为Pascal语言的等效代码。这个工具对于那些需要在两种语言之间迁移代码或者理解不同编程语言语法的开发者来说非常有价值。Java和Pascal虽然都是面向...

    免费下载:自己整理的java学习资料

    自己整理的一些资料,不需要积分,希望对大家有帮助。 里面包有如下的一些java资料 Ant使用指南.pdf cvs.pdf Eclipse入门-- Eclipse的使用简介及插件开发.PDF eclipse插件开发.doc Eclipse插件开发系列.pdf ...

    java源码包2

    Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics...

    jfugue4a:JFugue库对Android的适配-开源

    JFugue是一个Java库,允许程序员通过编写代码来创建音乐。它使用音乐符号语言,使得音乐创作变得更加灵活和可编程。对于Android版本的适配,开发者可能已经对原生的JFugue库进行了修改,使其能够兼容Android系统架构...

    JAVA_API1.6文档(中文)

    javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口。 javax.swing.colorchooser 包含供 ...

    Java 面经手册·小傅哥.pdf

    当你仔细阅读书籍时,会发现Java中有大量的数学知识,包括:扰动函数、负载因子、拉链寻址、开放寻址、斐波那契(Fibonacci)散列法还有黄金分割点的使用等等。 适合人群 1. 具备一定编程基础,工作1-3年的研发...

    java 制作的企业网站源码

    java源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码...

    java对音频文件的频谱分析

    在Java编程环境中,进行音频文件的频谱分析是一项复杂但重要的任务,特别是在音频处理和音乐信息检索领域。本文将深入探讨如何使用给定的压缩包文件来实现这一目标。 首先,频谱分析是将时域信号转换为频域表示的...

    java中可使用的datatable

    使用修改如下(example文件夹下的java代码如下修改): //使用datatable DataTable dtb = new DataTable(); data.common.JdbcAdapter dAdapter = new JdbcAdapter(); dAdapter.fillDataTable(dtb, rs); //...

Global site tag (gtag.js) - Google Analytics