omg music

FLASH源码 2025-08-12

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格式的零件,也可以创建空白。

可以将OMGSongOMGSongPart类视为数据的“外骨骼”。例如,以下数据:

 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的形式存在。数据的partssections阵列已转变为对象/词典。这是为了易于按名称访问零件和部分,这在通过Websocket和其他层传递数据时很有用。

可以通过这些包装器对象( OMGSongOMGSongPart )单独访问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()
下载源码

通过命令行克隆项目:

git clone https://github.com/mikehelland/omg-music.git