omg music
omg music是一种包裹Web浏览器的AudioContext的“音乐上下文”。
以omg music形式创建和共享的音乐包含诸如关键和时间签名之类的信息,这些信息使节拍和旋律的修改和突变变得简单。
它设计为“开放音乐”的进步,其中音乐以“源代码”格式共享,以促进混音。
该应用为OMG平台提供核心音乐功能
OMG歌曲文件格式
歌曲及其部分是JSON文件。
文件格式的概述如下:
let song = {
parts: [{name: \"Piano\", ...}],
sections: [
{
name: \"Verse\",
parts: [{name: \"Piano\", ...}]
}
],
beatParams: {...},
keyParams: {...},
name: \"My Song\"
}
这首歌被“水平”分成部分(例如钢琴,鼓,吉他),将“垂直”分成部分(例如介绍,诗歌,合唱)。
song.parts阵列是标题,其中包含有关如何从部分发出声音的信息。这可能包含声音集中包含的MP3或WAV文件的列表。或A零件可能会从Web Audio API内置振荡器或Webaudiofont中产生声音。
song.sections中的每个部分也有一个parts阵列。这包含有关何时播放每种声音,产生旋律或节拍的信息。
song.sections中的parts 。节有notes阵列或tracks阵列。
注释与轨道
notes数组包含一个描述要播放的注释和多长时间的对象列表。像这样:
notes = [
{note: 0, scaledNote: 60, beats: 2.0},
{rest: true, beats: 1.0},
{note: 1, scaledNote: 62, beats: 1.0}
]
scaledNote是根据歌曲的钥匙和零件乐器的八度确定的MIDI音符。在这种情况下,中间C(Midi Note 60)进行了两个节拍,然后进行一次节拍休息,然后播放了D的D(MIDI Note 62)进行一次节拍。
tracks阵列可以包含多个曲目(想想低音鼓,编鼓,高帽子)。每个轨道都是一个数组,该数组包含当前部分中每个subbeat的元素。如果值n是0到1之间的数字,则该曲目的音频示例在卷中播放。播放整个音频样本。
当您需要确定播放音频样本多长时间(例如旋律或低音线)时,请使用notes 。
课程
主要类是OMusicContext 。这可以load()歌曲或OMG格式的零件,也可以创建空白。
可以将OMGSong和OMGSongPart类视为数据的“外骨骼”。例如,以下数据:
let songData = {
parts: [{name: \"Piano\", ...}],
sections: [
{
name: \"Verse\",
parts: [{name: \"Piano\", ...}]
}
],
beatParams: {...},
keyParams: {...},
name: \"My Song\"
}
加载时:
omgSong = {
data: songData,
parts: {
\"Piano: {data: partHeaderData}
}
Sections: {
\"Verse\": {
data: sectionData,
parts: {
\"Piano\": {data: partDetailData}
}
}
}
}
原始的songData仍然以omgSong.data的形式存在。数据的parts和sections阵列已转变为对象/词典。这是为了易于按名称访问零件和部分,这在通过Websocket和其他层传递数据时很有用。
可以通过这些包装器对象( OMGSong和OMGSongPart )单独访问songData的所有元素。包装器允许玩家,上下文以及用户界面附加不需要保存的临时内容,因此无法串制。例如,每个部分的增益表在包裹其零件数据的OMGSongPart上。
这些音频节点需要与零件关联,但不能被串制,并且需要为每个会话创建。因此,他们进入包装纸。
例子
这是一些使用omg music应用:
- OpenMedia.gallery社交网站
- dawesome(github)
- Techno Gauntlet
- OMG模因制造商
- 歌曲处理器
使用客户端:Game Dev示例
如何:https://www.youtube.com/watch?v=txppfbkpxp0
(注意,视频已经过时了)
当游戏加载时:
import OMusicContext from \"https://op*enme*d*ia.gallery/apps/music/js/omusic.js\"
var music = new OMusicContext()
var {song, player} = await music.load(\"http://openm***usic.gallery/data/1333\")
游戏开始时:
game.music.play()
在难度增加时增加BPM和密钥:
music.beatParams.bpm += 20
music.keyParams.rootNote++
music.rescaleSong()
游戏结束时:
music.stop()
