吉他初学者学习网站搭建系列(7)——如何在线制作乐谱(扒歌)

news2025/3/31 6:04:27

文章目录

  • 背景
  • 实现
    • 查和弦&渲染和弦
    • 编辑谱子
    • 保存谱子
  • 成果

背景

相信很多音乐爱好者们在听到一首好听的歌或者曲子时,都有动手扒谱的冲动,但是,你电脑里并没有安装一些专业的扒谱软件,这个时候,你更倾向于有一个网站满足你的需求:免费在线制作乐谱

有几个功能点是必要的:

  1. 能够查和弦
  2. 谱子可以很简单地编辑
  3. 谱子可以展示和弦
  4. 谱子可以保存

为了满足上述的功能,我利用周末时间开发了一个在线扒歌的模块:地址如下:https://hougiser.gitee.io/music-score/#/song

实现

查和弦&渲染和弦

查和弦功能在吉他初学者学习网站搭建系列(4)——如何查询和弦图文章中已经详细介绍了,这里直接调用了该组件。
在这里插入图片描述

编辑谱子

通过调研,我找到了一个满足基本需求的开源包:chordsheetjs
这个包允许你以多种文本格式导出乐谱:

const chordSheet = `
       Am         C/G        F          C
Let it be, let it be, let it be, let it be
C                G              F  C/E Dm C
Whisper words of wisdom, let it be`.substring(1);

const parser = new ChordSheetJS.ChordsOverWordsParser();
const song = parser.parse(chordSheet);

所以思路就很简单了,你只需要让用户更简单地编辑这个文本即可。

由于不同格式的写法不一样,本文考虑到示例中的写法,如果是中文(2字节)歌词的情况下,和弦位置和歌词无法对应上,因此,采用了 ChordProParser,以陶喆的《蝴蝶》为例,最终编辑文本如下:

{title: 蝴蝶}
[扒谱 玉儿或芋头]
[原调 降b capo 3 选调 G]

{start_of_verse: 主歌}
[G]當這世界已經[D]準備將我遺棄
像一個[Em7]傷兵被留在孤獨荒野[C]里[D]
[G]開始懷疑我存[D]在有沒有意義
在別人[Em7]眼裡我似乎變成了隱[C]形

[B]難道失敗就永[Em7]遠翻不了身
誰來[C]輓救墮落的靈[D]魂
{end_of_verse}

{start_of_chorus: 副歌}
每次一見[G]到你 心裡好[D]平靜
就像一隻[Em7]蝴蝶飛過廢[Dm7]墟
我又能活[C]下去 我又找回[Em7]勇氣
你的愛像[Am7]氧氣幫忙我呼[D]吸
我又能[G]呼吸
{end_of_chorus}

chordPro常用的指令(directives)如下:
{title: 标题}
{subtitle: 副标题}
{start_of_verse: 主歌}...{end_of_verse}
{start_of_chorus: 副歌}...{end_of_chorus}
{start_of_bridge: 桥段}...{end_of_bridge}
{start_of_tab: 吉他进行}...{end_of_tab}
{comment: 评论}

详细格式说明见:官方文档
需要注意的是,一些chordPro的功能,并没有在chordSheetJS中实现。

为了方便用户输入,提供了一些复制功能:
在这里插入图片描述
最后,进行渲染即可:

render() {
      const parser = new ChordProParser();
      const song = parser.parse(this.chordSheet);
      const formatterDiv = new HtmlDivFormatter();
      const dom = document.getElementById('the-song')
      dom.innerHTML = formatterDiv.format(song)
}

渲染效果如下:
在这里插入图片描述

保存谱子

目标是将dom节点转为图片,很成熟的技术了,这里直接采用dom-to-image,代码如下:

download() {
      const node = document.getElementById('chordPage');
      domtoimage.toJpeg(node, {
        quality: 1
      }).then((dataUrl) => {
        var link = document.createElement('a');
        link.download = '吉他谱.jpeg';
        link.href = dataUrl;
        link.click();
      })
}

为了实现一定的宣传效果,我还给dom节点加了水印,通过css即可实现。

成果

这里展示我使用这个工具导出的《蝴蝶》谱子:
在这里插入图片描述
效果还不错吧,嘿嘿😆

目前该网站已经集成了非常多使用的功能,欢迎扫码使用:
在这里插入图片描述
请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cesium实现区域贴图及加载多个gif动图

1、cesium加载多个gif动图 Cesium的Billboard支持单帧纹理贴图,如果能够将gif动图进行解析,获得时间序列对应的每帧图片,然后按照时间序列动态更新Billboard的纹理,即可实现动图纹理效果。为此也找到了相对于好一点的第三方库libg…

[环境配置]win10关闭病毒和威胁防护防止乱删软件

搜索栏输入病毒和威胁即可看到 如果没有搜到您可以从菜单栏进到到Windows设置 选择更新和安全 点击后进到windows安全中心,随后进到到病毒和威胁防护 关闭所有选项

Elasticsearch:无需搜索 “Christmas” 即可找到有关圣诞节的书籍

随着假期的临近,我期待着变得舒适,拿起一本新书,享受轻松的时光。 但是使用搜索栏在线发现图书并不像看起来那么容易......大多数零售搜索引擎仅依赖于关键字搜索,当我们确切地知道我们正在寻找什么书名时,这很好&…

thinkphp6.0的workerman在PHP8.0下报错

一、我先升级了thinkphp6.0到最新版本: composer update topthink/framework二、结果提示我composer版本过低,需要升级到2,于是我又升级了composer composer self-update 三、我又升级了workerman: composer require topthink/think-work…

数字调制学习总结

调制:将基带的信号的频谱搬移到指定的信道通带内的过程。 解调:把指定信号通带内的信号还原为基带的过程。 1、2ASK调制 原理如下图所示,基带信号为单极不归零码,与载波信号相乘,得到调制信号。 调制电路可以用开关…

嵌入式中一文搞定C语言数据结构--跳表

大家好,今天分享一篇C语言数据结构相关的文章--跳表。 1. 什么是跳表 跳表是 链表 索引 的一种数据结构 ,是以空间换取时间的方式,关于跳表参考: https://baike.baidu.com/item/跳表/22819833?fraladdin 2. 跳表概念 跳表在原有链表的基…

SPFA算法总结

知识概览 SPFA算法是Bellman_Ford算法的优化。时间复杂度一般是O(m),最坏时间复杂度是O(nm)(遇到网格图、菊花图),其中n是点数,m是边数。SPFA算法其实是单源最短路限制最小的算法,只要图中没有负环&#xf…

【MYSQL】MYSQL 的学习教程(八)之 12 种慢 SQL 查询原因

日常开发中,我们经常会遇到数据库慢查询。那么导致数据慢查询都有哪些常见的原因呢?今天就跟大家聊聊导致 MySQL 慢查询的 12 个常见原因,以及对应的解决方法: SQL 没加索引SQL 索引失效limit 深分页问题单表数据量太大join 或者…

一起玩儿物联网人工智能小车(ESP32)——13. 用ESP32的GPIO控制智能小车运动起来(一)

摘要:本文更深入的讲述了GPIO的相关知识,并完成了导线连接工作,为下一步的软件开发做好了准备。 通用输入输出端口(GPIO:General Purpose Input/Output Port),在前面已经有了初步的介绍&#xf…

C++ 比 C语言增加的新特性 3 之 命名空间namespace

1. 命名空间 1.1 命名空间 又称为“名字空间”,在内存(全局)中取一块区域并对其进行命名 实际例子: 同一个班级,两个同姓的人,例如:张三和张三,其中一个张三座位是在讲台右边&am…

公开100GB数据,日产汽车遭勒索组织“撕票”

Bleeping Computer 网站消息,Akira 勒索软件团伙声称成功入侵了日本汽车制造商日产汽车澳大利亚分公司的内部网络系统。 12 月 22 日,Akira 勒索软件团伙在其泄漏博客上添加了一个新的“受害者”,并表示其成员从日产汽车制造商的内部网络系统…

docker的一些思考

1.docker是啥? 2.镜像执行流程 3.一些疑惑和解答 1. 2.

软件测试面试--说一个印象最深的bug?

其实,面试官并不关心你描述的这个bug是否真的有价值,或有多曲折离奇?他只是: 1.了解你平时工作中的测试能力 所以,这就要求的你平时工作中遇到bug时试着自己去定位,定位bug的过程远比你的单纯的执行测试用…

【隐私保护】使用Python从文本中删除个人信息:第一部分

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

销售如何挖掘客户?有哪些方法?

在当今竞争激烈的市场环境中,客户资源的挖掘已经成为企业生存和发展的关键。销售人员需要掌握一定的技巧和方法,以有效地发掘潜在客户,提高销售业绩。以下分享一些挖掘客户的常用方法,帮助销售人员更好地开展业务。 一、了解客户需…

matlab附加功能管理器安装蓝牙工具箱

由于最近需要做蓝牙仿真方面的东西,需要用到matlab的蓝牙工具箱,根据官网例子输入: commSupportPackageCheck(BLUETOOTH);检测是否包含该工具箱,结果出现: 点击Add-On-Explorer出现: 网上搜索发现这是因为…

麦肯锡产品经理问题解决流程终极指南

您是否想知道世界上最成功的产品经理如何始终如一地提供不仅满足而且超出预期的解决方案?秘密可能就在于世界上最负盛名的咨询公司之一麦肯锡公司所磨练的方法论。本文深入探讨了麦肯锡的问题解决流程,该流程专为希望提升水平的产品经理量身定制。 01. 麦…

周末两个比赛3个小题

周末安洵和nctf,因为不是学生也没报名拿附件作了一把。 安洵/pwn/side_channel , initiate 安洵的题很好,唯一的问题是把几乎所有的,有没有必要的都放了远程,而且服务器很差,好多题不是不会而是连不上。 这个题估计…

vivado 多周期路径与时钟相移

多周期路径与时钟相移 有时,必须在具有相同时钟域的两个时钟域之间定义定时约束时钟周期,但两个时钟之间的相移。在这些情况下,理解正时引擎使用的默认设置和保持关系。如果没有仔细调整两个时钟之间的相移可能导致两个时钟间的逻辑约束过大…

13.TCP/IP协议

1.TCP/IP协议是什么 TCP/IP协议不仅仅指的是TCP和IP两个协议,二十指由FTP、SMTP、TCP、UDP、IP等等协议构成的协议簇。 TCP/IP协议是一系列规则的统称,他们定义了消息在网络间进行传输的规则。是供已连接互联网的设备进行通信的通信规则 2.TCP/IP协议的…