自适应吉他弦位查找算法实现
项目描述
Python实现的吉他弦位查找器
此存储库实现了以下研究文章中提出的算法(用巴西葡萄牙语撰写),可在以下链接找到:http://www.lta.poli.usp.br/lta/publicacoes/artigos/2008
Bellini, D.J.S.; Tavella, A.C.B.; 《基于自适应自动机的乐谱转换为指法表》. 在:第二届自适应技术研讨会 - WTA 2008。EPUSP,第39-42页,2008。
该算法可以视为通过“自适应图灵机”模型(João José Neto提出的自适应自动机的自定义替代方案)实现的深度优先搜索,具有同步的输入/输出“磁带”,可以前后移动。其中一条磁带有数据输入(作为每个弦的指位列表的音乐乐谱/乐谱,每个音符一个列表)而另一条磁带有输出(应该从输入中演奏音符的弦索引)。
安装
可以直接从PyPI安装
pip install fretfinder
示例
可以使用以下终端命令运行论文中的Greensleaves摘录示例(也可以使用python -m fretfinder
)
fretfinder -rt Bass4 -M14 'A3 C4 D4 E4 F4 E4 D4'
或者,从Python
>>> from fretfinder import Tablature, Guitar, Staff
>>> tab = Tablature(
... staff=Staff("A3 C4 D4 E4 F4 E4 D4"),
... guitar=Guitar("Bass4", max_fret=14),
... reverse=True,
... )
>>> tab.strings # Result of fretfinder.find_strings(...)
[[2], [1], [1], [0], [0], [0], [1]]
>>> print(tab.ascii_tab())
G3|----------9-10-9----||
D3|----10-12--------12-||
A2|-12-----------------||
E2|--------------------||
使用与旋律相同的语法配置吉他调音。对于更复杂的乐谱,使用"R
"表示休止符,使用括号来分组同时音符。更详细的信息,请使用
python -m fretfinder --help
本文与实现之间的差异
本仓库中的大部分内容都试图强调在引用的研究文章中提出的算法方式,但此实现与原始规范之间仍有一些差异,如下所示
-
大多数配置默认值与论文相同,但有一点不同:明确使用
--disallow-open
以获得原始算法行为。 -
以下名称被内部修改了
MinX
和MaxX
被重命名为min_x
和max_x
,这不是一个大问题,只是为了遵循PEP8约定;X(i)
函数被重命名为is_valid_range
方法;Ux
和Bx
自适应动作被实现为update_x
和backup_x
,这些也是论文中的描述性名称;fretStack
被重命名为fret_history
,它大部分时间真的像一个栈,但新的名称更能描述它实际存储的内容,并且更容易访问其内容,而无需弹出和推送其内容来更新min_x
和max_x
。
-
Ux
(update_x
)自适应动作在原始文章中并未明确被视为参数化函数,与“字符串”状态和X(i)
(is_valid_range
)函数不同。在某种程度上,这并不是真正的差异,而是一个实现细节,因为行为与文章中描述的相同。该参数是必需的,以便获取“自动机”将进入的下一个字符串状态的相关品丝号,这可以解释为每个可能的靶字符串都有一个不同的Ux
(参数化实现),或者一个“知道”目标状态的单一Ux
(文章描述)。可以在需要评估X(i)
时存储品丝号,这就是文章假设已经完成的地方,因为这是避免计算相同的品丝号两次的一种优化。在这里,由于严格的“软件工程”约束,品丝号被计算了两次:状态处理程序和X(i)
既不是自适应动作也不是状态转换,并且此实现中的自适应动作不知道下一个目标状态,因此Ux
变成了参数化的"Ux(i)
"。 -
创建
--reverse
选项(reverse
关键字参数)是为了让评估从最后一个字符串开始到第一个字符串结束,以解决当有多个字符串状态是可能的下一个状态时的不确定性。文章建议字符串顺序应该是从第一个字符串(音调最高的一个)到最后一个字符串(音调最低的一个),这是此实现的默认行为。另一方面,文章中的例子是通过将算法以相反的方向应用于最后一个品丝为14的输出(例如,用于演奏原声吉他)得到的,这就是为什么包括此选项的原因。 -
原始论文告诉我们,存储动作与带子转换到左右是相关的。在此实现中也是如此,但代码并没有强制在带子转换和输出带子存储动作之间建立任何联系。
-
论文中提出的算法没有“空弦”。在这里,它被实现为
--allow-open/--disallow-open
选项(Python中的allow_open
关键字参数),这使得音符绕过有效品丝范围。这些空弦音符也被过滤出品丝历史窗口,但它们计入窗口大小。 -
--distinct-only
选项(distinct_only
参数)与论文无关,它是以避免颤音拨弦问题的一种方法,这是默认窗口大小为7的原因。
项目详情
fretfinder-1.0.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e0738898e9ed183a1585762994d97cb8a6a27829bc865dd328e180b54558783c |
|
MD5 | 046c2b8e1e0c2e0d98311f0b31272abf |
|
BLAKE2b-256 | 864806b0e8fc6adcac21e0c349a894324ece4529eb1f01b46f46b3e173908461 |