JIGZEG.INFO

为博客添加MIDI播放功能

发布


此页面上传和播放本地的MIDI文件。

最近花时间研究了MIDI这种文件格式,感觉发现了“新大陆”:和常见的音频文件(如.mp3/.flac等)不同,midi文件主要是记录事件(如各个音符的按压事件和控制器相关指令)而不是压缩后的音频数据,这也是为什么midi文件体积可以很小(数十KB)但是歌曲的播放时长却可以达到普通几MB的三、四分钟MP3文件的水平。MIDI文件最终播放时呈现的效果和加载的音色库相关,使用不同细腻度的音色库来播放MIDI文件,最终得到的歌曲听感会有差异。

目前主流的操作系统都可以直接播放MIDI文件,如果要在浏览器内播放MIDI,需要依赖Web Audio API,解析MIDI文件并加载音色库,合成音频再播放。

播放器设计

博客目前已经支持发布MIDI音乐的文章了,文章的路径ID如果是[m]开头的,即表示是带音乐的发文。

播放器的核心实现逻辑和代码参考了开源的在线MIDI编辑器signal-app:https://signal.vercel.app/edit,GitHub上仓库地址:https://github.com/ryohey/signal,这个编辑器实现基于TypeScript + React + Canvas。

博客的MIDI播放器在signal-app原来代码的基础上,精简掉大部分关于MIDI编辑的内容,把它作为一个纯粹的音频文件播放器来进行开发,最终的打包gzip体积仅增加了几十KB。目前播放器支持如下功能(后续播放器的功能会有所调整):

  • 自适应布局,跟随博客切换主题
  • 后退5秒
  • 单曲循环
  • 跳转开头
  • 播放/继续播放/暂停/停止
  • 静音/取消静音
  • 节拍器功能
  • 滑动进度条定位
  • Track 静音
  • 键盘模式(88/76/61/49键)切换
  • 音符瀑布流可视化
  • 固定播放自定义选择的小节
  • 其他功能敬请探索...

博客播放器新的功能在开发中,当然也有一些BUG等待被发现和解决。以及,播放器在移动端上的性能问题,播放时会有一点卡顿,不过在我的开发机器Chrome上测试播放还是很流畅。

播放器初次加载时,因为要下载音色库文件,会比较缓慢,下载完毕后会将前置资源放至indexedDB进行缓存,之后就无需再次等待下载音色库了,点击即可直接播放MIDI。

最后

在博客内第一首发布的MIDI音乐是由德国乐队Fool's Garden带来的Lemon Tree,欢迎聆听。MIDI文件下载自:https://bitmidi.com/lemon-tree-mid

为什么把它作为博客第一首要分享的音乐?一是因为博客是基于Deno Fresh来开发搭建的,而这个Web框架的Logo就是一个柠檬!我觉得十分有意义;而每每听到这首熟悉的旋律,总能让自己回忆起高一开学前夏令营的时光:高中的英语老师在第一堂课上给我们放的就是这首英文歌。


此文被收纳在#MIDI#类目下,被贴上了#博客#标签

给博客加入游戏控制器操作功能

发布


大概在3年前得到了人生中第一个Xbox游戏手柄,随后它就一路陪伴了自己多年来的游戏时光。最近,自己花了几天时间研究了浏览器W3C关于 Gamepad (游戏控制器)的API规范文档,希望博客能够实现像游戏一样支持手柄操作,达到手柄基本替代键盘鼠标操作来浏览页面的效果。目前为止,已经对手头设备上安装的浏览器博客页面的手柄操作的兼容情况做了测试,暂时没发现什么问题。

如果想要测试你的浏览器是否支持Gamepad的API,可以到博客“关于”页面,在页面底部点击“此客户端”选项查看。

如果点击没有反应、或者没有显示 控制器:支持 等字样的话,说明你所使用的浏览器已经太过时,是时候该升级WebView内核或者更新你的浏览器了!(远在十多年前——2012年Gamepad API在Chrome21被支持 [1])。

热键设计

# 操作 控制器热键
1 上滑 左摇杆向上翘起
2 下滑 左摇杆向下翘起
3 模拟按下Tab键 十字键右/左按下
4 模拟点击目前聚焦的元素 右扳机键按下
5 打开导航 右肩键按下
6 回到页面顶部 左肩键+十字键左按下
7 滑到页面底部 左肩键+十字键右按下
8 上滑一页 十字键上按下
9 下滑一页 十字键下按下
10 打开控制器测试工具窗口 右菜单按钮按下
11 收起热键提示 左菜单按钮按下

这些按键组合在所有页面基本都适用,部分页面和功能弹窗的热键布局可能会有差异,目前的热键布局未来可能有所调整。当前场景热键提示可以通过按下左菜单键查看。

控制器测试

设备在连接手柄后,打开博客的任意界面,按下右菜单键,即可打开控制器测试弹窗,测试控制器的按钮:

鼠标滚动切换手柄,在Chrome上navigator.getGamepads()会返回一个长度为4的数组,故最多支持4个控制器的连接和测试。测试窗口下,支持测试手柄的震动功能(扳机震动/手柄震动),如果手柄带有振动模块,但是点击“测试震动”无反应,很有可能是浏览器不支持,升级浏览器到最新版本即可。

功能设计

博客适配手柄操作是以替代键盘功能键方向去设计的:

  • 例如在浏览界面时可以将十字键的右方向键当作键盘的“Tab键”来使用,切换聚焦的元素,然后按下右扳机键相当于键盘按下“回车”或者“空格”触发元素的点击事件;
  • 左摇杆上下抬起,相当于按下键盘的上下方向键,滚动页面,根据摇杆翘起程度,分级加速滚动;
  • 十字键上下方向键,相当于键盘的PageUp/PageDown按钮,上滑/下滑一页;
  • 左扳机键+十字键左右方向键,相当于按下Home/End键,回到当前页面顶部/底部;
  • 按下右肩键可以快捷呼出菜单,选择切换跳转博客板块子页

目前还不能在文本框键入文字,未来将考虑加入虚拟键盘输入文字功能。

继续阅读…


此文被收纳在#星碎札#类目下,被贴上了#Gamepad##博客#标签
← 早期文第 1 页 / 共 1 页近期文 →