GithubHelp home page GithubHelp logo

obstudio / thuliummusic-wl Goto Github PK

View Code? Open in Web Editor NEW
14.0 7.0 3.0 13.39 MB

Wolfram Language version of Thulium Music

Mathematica 96.34% JavaScript 3.66%
mathematica music-player synthesizer electronic-music wolfram-language music midi thulium-music

thuliummusic-wl's Introduction

Thulium Music Player (Wolfram Language Version)

Thulium Music Player is a simple program aimed to play textualized music on any platforms or devices.
铥铥播放器是一个旨在在任何平台和设备上播放文本化音乐的程序。

This repository is a Wolfram Language Version for Mathematica users.
这个仓库是该播放器的 Wolfram 语言版本,为 Mathematica 用户使用。

Watch our propaganda film on Bilibili.
在 Bilibili 上观看我们的宣传片

Installation / 安装

The following steps require Internet connection. 下面的步骤将需要网络链接。

To run Thulium Music Player, you need to install Mathematica and Node.js first.
为了运行铥铥播放器,你需要首先安装 MathematicaNode.js

After installation, you need to switch to the library directory, open the terminal and run the following commands:
安装完成后,你需要切到library目录下,打开终端并输入下列指令:

  • For Windows:
npm init
cd %USERPROFILE%
npm i zeromq -g
ren node_modules .node_modules
  • For MacOS and Linux:
npm init
cd ~
npm i zeromq -g
mv node_modules .node_modules

Then you are ready to run Thulium Music Player. Open Thulium.nb with Mathematica, and follow the hint to enjoy the music.
这样就完成了所有的安装步骤。现在你可以点开Thulium.nb文件,按照软件中的提示来欣赏音乐了。

When the program is first run, it may takes some time to initialize. 当程序首次运行时,可能要花费一定的初始化时间。

Exception handling / 异常处理

If the program reports an error and does not run properly, you may try the following steps.
当程序在运行时报告了错误信息并无法运行,你可以尝试采取下面的步骤。

  1. Check your Mathematica version. Make sure it is updated.
    请检查你当前的 Mathematica 版本,确保它足够新以便能够执行程序中的所有命令。

Thulium Music Player uses some new functions in Mathematica 11.2, such as ExternalEvaluate and AudioStream. 铥铥播放器中使用了一些 Mathematica 11.2 中引进的新函数,包括 ExternalEvaluateAudioStream

  1. Make sure Node.js and related packages has been installed. You can run a simple Mathematica program to check:
    请确保 Node.js 以及相关的库已经被妥善地安装好了。你可以运行下面的 Mathematica 程序来测试是否已经全部安装完成。
session = StartExternalSession["NodeJS"]
ExternalEvaluate[session, "require('acorn')"]
  1. Submit an issue with the question you have.
    你也可以给我们提交一个 issue,在其中说明你遇到的问题。

Change log / 更新日志

  • 2.3 (2018.5.5)
  • 2.2 (2018.4.21)
  • 2.1 (2018.4.1)

thuliummusic-wl's People

Contributors

jjyyxx avatar kouchya avatar nn708 avatar seanwallis730 avatar shigma avatar yxlllc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Forkers

ddffwyblxy

thuliummusic-wl's Issues

一些 Parser 优化

  1. __oriDur在生成后已经没有必要了, 可以考虑其功能用StartTime代替
  2. 解决用户自定义数组不能正确extend()的问题
  3. 提供名为JoinTrack的 API 以帮助用户实现音轨的连接

部分歌曲存在加载错误的问题

  1. 七色光之歌等歌曲报错,可能是 RepeatEnd 错误
  2. 死体旅行等歌曲未报错但倚音渲染错误
  3. 风居住的街道出现未知错误 Token

Template Subtracks

目前的音轨头被允许在乐器后面任意地跟上函数 (当然仅仅是函数), 作为一个音轨的预处理部分. 那么如果要使用多个乐器共用的音轨中设置部分乐器的和弦环境, 又如何处理呢? "模板音轨"提供了一种解决方案.

模板音轨与正常的音轨语法完全相同, 但其中可能包含某种特定的宏音轨 (虽然不应该这么叫, 但是姑且这么说吧), 以保留字的形式呈现, 比如@0或者@_或者@this这样的 (还没定下来, 我就先以第一个为例了~)

正如你所见的那样, 模板音轨其实可以作为一个纯函数. 当它被调用时, 如果含有对应的参数, 则将该参数赋给当前的@0后执行. (具体的实现究竟是纯函数, 还是实体函数, 我个人认为都是可以的.)

那么在一个音轨的音轨头中, 如果我们允许函数和模板音轨, 并将函数组合理解成模板音轨处理, 那么就能够解决开始的问题了, 比如:
<Piano (100%) Oct(1)> => <Piano {(100%) Oct(1) @0}>
(这是程序的自然解读方式, 因而保证了兼容性.)

这样一来, 模板音轨{(100%) Oct(1) @0}才是这个音轨的本体, 当执行时将音轨的内容作为@0本身来处理, 于是我们就允许对于音轨整体进行更丰富的操作了.

下面是一个例子 (使用了@this):

<:env:> (80%) Dur(1) 1>51'51'5

< Guitar {(72%) Rest(24) @env: Oct(-1) @this},
  Strings {(60%) Oct(-2) Con(-1,0.8) @this @this},
  SlapBass {(64%) Oct(-3) Stac(1/2, 0) @this @this}
> 6--^|%--^|%--|7--|1'--^|%--|4--|5--|

这样就将三个相似但完全不同的音轨统一地表示了.

Buffer加载时进度条错误

新内核上传后,发现了加载Buffer时进度条显示错误的情况。具体表现为:

  • 当进度条加载到第二首歌曲时会迅速地跳回第一首,然后一直停留在第一首的状态
  • 尽管如此,程序依旧处于加载过程中,一段时间后加载完成,进度条消失

如果有类似情况的同学发现了可能的原因,欢迎提供线索。

东方绀珠传 QYS转TM

  • 一面道中忘不了,那曾依藉的绿意
  • 兔已着陆
  • 湖上倒映着洁净的月光
  • 九月的南瓜
  • 飞翔于宇宙的不可思议巫女
  • 永远的春梦
  • 冻结的永远之都
  • 逆转的命运之轮
  • 遥遥38万公里的航程
  • 星条旗的小丑
  • 故乡之星倒映之海
  • Pure Furies~心之所在
  • 前所未见的噩梦世界
  • Pandemonic Planet

全部完成后请@Kouchya 检查是否正确。

  • 检查通过

东方绀珠传曲子一大堆待优化。。。

鉴于太多太杂,我就单独开个issue好了,原来的issue随它在冷风中飘

  • 忘不了:伴奏音量低,后面一大堆乱七八糟的错误,我觉得我不想干,但我不得不干,我好想assign某人一起♂干
  • 兔已着陆:伴奏音量低
  • 湖面月光:伴奏音量低
  • 九月南瓜:伴奏音量极其低。后面小提琴声部怎么整体高了半音???另外@jjyyxx又把滑音做崩了真是世风日下道德沦丧
  • 宇宙巫女:伴奏音量低
  • 春梦:伴奏音量极低,开头音量低
  • 冰都:伴奏音量低(除此以外好听好听好听好听好听好听好听早知道多写点了以后要多写点嗯)
  • 命运之轮:居然遇到一个上来伴奏音量不低的叛徒!不过正片开始后伴奏还是小了点。另外结尾换个乐器吧orz
  • 东方红38万公里:伴奏音量低,妖精精神污染度高。最后一段有个音高了八度??还有莫名空拍????
  • 星条旗:伴奏音量居然还可以!叛徒!!不过副歌伴奏部分吵了点。另外妖精精神污染核能
  • 倒映星海:海潮声好大。。。旋律都盖住了喂(#`O′) 伴奏音量极低。后面转调不成功???
  • 心之所在:伴奏音量低
  • 噩梦世界:有个别缺音现象,结尾伴奏过响。另外间奏ww 不如鬼畜跳舞!
  • 地爆天星大地狱星:偶尔伴奏过低,偶尔过响。抖腿 抖腿 抖腿 抖腿 以及迷之漏音??单震音或%的问题???写这些的时候暂时懒得查

一些播放器的 bug

  • 无法加载 paclet 导致无法初始化
  • UpdateImage 模块错误导致无法正常加载图片
  • 播放器图片无法正常显示 tooltip

东方地灵殿 扒谱计划

相关歌曲列表:

  • 昏暗的风穴
  • 被封印的妖怪
  • 阻绝人迹之桥
  • 绿眼的嫉妒
  • 漫游旧地狱街道
  • 大江山的花之酒宴
  • Heartfelt Fancy
  • 少女觉
  • 废狱摇篮曲
  • 死体旅行
  • 业火地幔
  • 灵知的太阳信仰
  • Last Remote
  • 哈德曼的妖怪少女

TMD v2.0 全部语法

  • 标题(不同字号和对齐方式)
  • 节标题(不同字号和缩进)
  • 分割线(粗细,虚线和点划线)
  • 无序列表
  • 有序列表
  • 行内无序列表
  • 表格(对齐方式,加粗)
  • 用法说明
  • 注释
  • 代码块
  • 预加载
  • 提示框
  • 文本渲染
  • 超链接
  • 图片

A More Systematic Argument System

随着语言的发展, 我认为我们的变量类型也是时候发生一些更新了. 更新前瞻: #39

新加入的成分充其量就是表达式和函数, 宏音轨类型. 如果上述对于表达式的描述有疑问, 或者是怀疑程序可行性, 以及可能存在的歧义问题, 可以联系我.

子音轨以及相关类型

  • 子音轨, 以{...}区分, 与其 Token 记法一致
  • 函数, 以标准函数记法Func(...)区分, 与其 Token 记法一致
  • 宏音轨, 以@foo区分, 与其 Token 记法一致

表达式以及相关类型

  • 表达式使用完全的解析取代过去的字符串传递模式, 允许数值函数的定义和调用, 以及四则运算和括号的使用.
  • Tokenizer 将返回一个 Expression 类型, 其 Content 属性包含了对齐内容的解析 (数组), 包含数字 (实数, 允许正负号和小数点, 分数线作为运算符处理), 运算符, 以及子表达式 (通过圆括号识别).
  • 原则上允许单位, 但只写一个, 写在表达式的最后即可, 将作为表达式的 Unit 属性, 包含常见的Bar, Beat, Sec类型.

字符串以及相关类型

  • 字符串, 以"..."区分, 与过去记法一致

数组以及相关类型

  • 数组, 以[...]区分, 内部元素以逗号分隔, 与过去记法一致

Prolog & Epilog Functions

在目前的实践中, 一些功能在实现上可能与现有函数冲突, 另一些功能则较大地依赖于音轨 meta 属性导致不能直接用函数体现. 对于这样的问题, 我提出了一种解决方案供大家参考. 这种方案在目前协议的基础上开放用户添加和使用 meta 的接口.

实现

除了官方钦定的一部分 meta 外, 用户可以像添加 settings 那样自由添加 meta, 这些 meta 将作为音轨本身的属性传递到外层音轨中. 与此同时, 用户可以编写 Prolog 和 Epilog 函数. 这些函数将按照一定的顺序在运行一个 SubtrackParser 的之前和之后运行, 并改变当前音轨的信息. 这些函数(除非标准包内置)可以被声明跳过, 从而不被调用.

用途

  1. Prolog 函数和 Epilog 函数相结合, 可以实现一些本来不被认为可以通过函数实现的功能. 踏板就是一个例子. 目前的一个问题是踏板并不能很好地处理 Overlay, 以及与函数内部读写相冲突的问题. 这种做法可以完美地被上述方案解决. 每一个音轨解析完成后, 直接对其内部的 PedalPress 和 PedalRelease 进行分析处理, 而音轨头的 PedalRelease 和音轨尾部的 PedalPress 则写入 meta, 然后像连音线一样处理.

  2. 一些用户功能可以被无冲突地实现. 比如如果现在考虑在原有的系统上加入节拍系统 (即每一小节按强弱渲染), 则不可避免地与一些函数产生矛盾 (比如在内部改变 bar 属性的 Tuplet 函数, 跨小节生成音乐的大量函数等). 而一个 Epilog 函数则能够在生成整个主音轨后依照拍数进行处理 (这一点与其他的 Epilog 不同, 可以通过设置这个 Epilog 为主音轨 Epilog 来实现), 从而避免了内部函数被错误地强化或是被二次强化的问题.

Optimization for Void Track Detection

优化对空音轨的识别, 目标是:

  • 能够分辨出子音轨中是否含有音符或者非空函数
  • 力所能及的情况下检测音轨内的音轨调用的返回值是否为空

文档系统初步

坑有点大,慢慢做吧……

  • 支持两级标题的显示
  • 支持节标题以及折叠功能
  • 支持所有的文本标记
  • 支持语法说明
  • 支持无序列表
  • 支持两种分割线

一些播放器 bug

  1. Initialize 函数在非主界面的地方运行会报错
  2. Effects 在单一音轨中失效

报错系统初步

建立报错系统的雏形,并实现基本的系统报错。

利用新的报错系统和规定的报错规范完成:

  • Note 相关

    • Note::ChordRange 计算和弦时出现错误的范围
    • Note::Reduplicate 和弦内存在重复的音
    • Note::OutOfRegister 某一个音超出音域
    • Note::NoPrevious 使用%时缺乏前置音符
    • Note::VolumeLimit 音量超过上限
  • Track 相关

    • Track::BarLength 小节长度错误
    • Track::Instrument 声明了不存在的乐器
    • Track::Undefined 发现了未知字符
    • Track::Overlay 各Overlay部分的长度不一致
  • Sect 相关

    • Sect::DiffDuration 各音轨长度不同
    • Sect::InitiativeBar 各音轨的起始小节不等长
    • Sect::Mismatch 相邻乐章的起始小节与终止小节不匹配

几个需要紧急处理的bug

  • 特定情况下pitchQueue报错(怀疑是parser未同步)。
    样例:<Piano>(Oct:-3)(84%)(6~){5o%%%%%}|4#(1=)4'#---|

  • 有的音被延长到了当前音轨的最后。
    样例:<PanFlute>(2^)3---^|%---|0---|0---|

  • % 的传递问题,希望能在一个音轨(暂时不跨音轨或乐章)中按时间顺序(程序执行的时间顺序,即在子音轨中就是播放的时间顺序,在函数中则是参数从左至右的顺序)传递,无论是否穿过子音轨

更改一些涉及拍数计算的处理

  • Tremolo2:如果subtrack1或2中含有pre和post,那么返回的音轨也应对应地进行处理。
  • Portamento:如果subtrack1或2中含有pre和post,那么返回的音轨也应对应地进行处理。
  • Tuplet:若读入的音轨有pre和post,则对应的拍数也应对应地进行处理。
  • /x:/:由于它也是小节线的一种,应补上对于小节拍数的判定。

Unit System

对于以时间作为参数的函数, 用户往往有着不同的表达需求. 有时用户希望以"秒"为单位, 另一些时候以"拍"为单位则是更好的选择. 为了迎合这两种选择, 同时增强函数的复用性, 我建议允许用户在数字的后面跟上单位来表示这个时间量. 在 tokenizer 也相应地增加一个Unit标签. 举下面的例子:

FadeOut(1s) // 1秒
Extend({...}, 1b) // 1拍

大家对此有什么看法呢?

Thulium Music 2.4 计划内容

  1. 完成对 Pedal 和 Tie 的解耦,以及实现跨乐章支持
    • 完成 pedal.tml
    • 完成 tie.tml
    • 跨乐章支持
  2. 重整 overlay 系统,修复 oriDur 的问题
    • 重整 overlay 系统,允许踏板和连音线分配入每一个部分中
    • 删除 oriDur 属性,所有相关内容全部用另外方法实现
  3. 使用新的 NoteParser 和音符系统
    • 允许在方括号外使用 Chord (Tokenizer 已支持)
    • 允许在音轨头定义音符宏,并取代 currentType 系统
  4. 规范类型系统:已经通过,将逐步取代过去的函数语法
    参见:obstudio/ThuliumMusic-Tokenizer#1

将子音轨反复中的 / 记号改为 \

由于历史原因,\ 字符被用于将下一行连接到上一行,因此子音轨反复中使用了 / 记号。但在数学中 \ 表示“除了”,更好地体现了子音轨反复中“除去这一部分不播放”的意思。目前原有 \ 记号已取消,因此建议将 / 改为 \,之后将 / 用于子音轨重叠的功能。

增加几个反复记号

几个反复记号需要实装:

记号 Token Type
+ Coda
s Segno
DC DaCapo
DS DaSegno

一个反复记号混合使用的实例:
316124_1

Thulium Music 2.5 计划内容

考虑近期完成的事项,可能在 2.5 以及之后的版本完成。

  1. 用户系统
    • 用户登录界面
    • 游客账号处理
    • 新的上传表单
  2. 函数类型识别
  3. 报错系统重做

东方妖妖梦 扒谱计划

相关歌曲列表:

  • 无何有之乡 ~ Deep Mountain
  • Crystallize Silver
  • 远野幻想物语
  • 凋叶棕
  • 布加勒斯特的人偶师
  • 人偶裁判 ~ 玩弄人形的少女
  • 天空的花都
  • 幽灵乐团 ~ Phantom Ensemble
  • 东方妖妖梦 ~ Ancient Temple
  • 广有射怪鸟事 ~ Till When?
  • Ultimate Truth
  • 幽雅绽放·墨染之樱 ~ Border of Life
  • Border of Life
  • 妖妖跋扈
  • 少女幻葬 ~ Necro-Fantasy
  • 妖妖跋扈 ~ Who done it!
  • Necro Fantasia

又开新坑ヾ(๑╹◡╹)ノ"

buffer.json 哈希值存储问题

当前音乐加载失败后,buffer.json 仍会正常存储哈希值,导致之后播放器中报错,希望能够解决。另外,希望播放前做 buffer 文件是否存在的检测,若文件不存在则进行友好的提示。

实装 Overlay 符号 /

目前原有的子音轨反复记号已改为 \,因此可以实装 Overlay 符号 /。
该符号 Token Type 为 Barline,增加一布尔属性 Overlay 来表示。
在 Parser 中的处理即为将当前子音轨时间归零,以达到重叠的效果。当各重叠部分长度有一个以上不相等时,扔出一个 Warning。

关于在更新的Wolfram版本上使用

自己排除了几个问题以后,发现在处理JS返回的结果时,Duration之类的键值读不到,似乎返回的结果与你们当时设计时考虑的已经结构不同了。

是因为ExternalEvaluate_NodeJS的版本更新了,行为不同了么?

MacOSX 上进度条无法正常显示的问题

目前两位同学的电脑上出现了进度条无法正常渲染,显示为黑色的状况。初步断定该情况是 MacOSX 上特有的情况。不认为是 Mathematica 在 Mac 上无法渲染渐变色或是动态进度条,应该是兼容性的问题。希望手边有 Mac 的同学去研究一下 Mathematica 在 Mac 上的渐变色和动态语法,进而解决这个问题。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.