From dc2189b24f97bdd6440498b1edf033bcdf886fdc Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Thu, 11 Jan 2018 21:00:56 +0800 Subject: [PATCH 01/54] Modify several songs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主要是取消BOM --- Songs/Touhou/Dream_Battle.qys | 3 ++- Songs/Touhou/Eien_no_Shyunmu.qys | 2 +- Songs/Touhou/Fushigi_Miko.qys | 26 +++++++++---------- .../Touhou/Gyakutensuru_Wheel_of_Fortune.qys | 2 +- Songs/Touhou/Hartmann_No_Youkai_Otome.qys | 2 +- Songs/Touhou/Haruka_38Man_Kilo_Voyage.qys | 2 +- Songs/Touhou/Koori_Tsuita_Eien_no_Miyako.qys | 2 +- Songs/Touhou/Kyuugatsu_no_Pumpkin.qys | 2 +- Songs/Touhou/Mizuumi_Gekkou.qys | 2 +- Songs/Touhou/Nuclear_Fusion.qys | 16 ++++++------ Songs/Touhou/Phantom_Ensemble.qys | 3 ++- Songs/Touhou/Ryokugann_No_Jealousy.qys | 2 +- Songs/Touhou/Sumizome_Sakura.qys | 2 +- Songs/Touhou/Tenkuu_Hana_Miyako.qys | 2 +- Songs/Touhou/Touhou_Mix_1.qys | 2 +- Songs/Touhou/Usagi_ha_Mai_Orita.qys | 2 +- Songs/Touhou/Wasuregataki.qys | 2 +- 17 files changed, 38 insertions(+), 36 deletions(-) diff --git a/Songs/Touhou/Dream_Battle.qys b/Songs/Touhou/Dream_Battle.qys index 6ba51ad..b83f73c 100644 --- a/Songs/Touhou/Dream_Battle.qys +++ b/Songs/Touhou/Dream_Battle.qys @@ -1,4 +1,5 @@ -//Ů_ +//少女綺想曲 +//ZUN //-------------------- Section A -------------------- <1=G><160><4/4> diff --git a/Songs/Touhou/Eien_no_Shyunmu.qys b/Songs/Touhou/Eien_no_Shyunmu.qys index a3db692..a2affc9 100644 --- a/Songs/Touhou/Eien_no_Shyunmu.qys +++ b/Songs/Touhou/Eien_no_Shyunmu.qys @@ -1,4 +1,4 @@ -//永远的春梦(东方绀珠传3面BOSS曲 哆来咪·苏伊特主题曲) +//永远的春梦(东方绀珠传3面BOSS曲 哆来咪·苏伊特主题曲) //ZUN 曲 //触手猴 LittleRed 改编 diff --git a/Songs/Touhou/Fushigi_Miko.qys b/Songs/Touhou/Fushigi_Miko.qys index c90b4cd..dbf6d77 100644 --- a/Songs/Touhou/Fushigi_Miko.qys +++ b/Songs/Touhou/Fushigi_Miko.qys @@ -1,13 +1,13 @@ -//宇宙中飞行的不可思议的巫女 +//宇宙中飞行的不可思议的巫女 //ZUN 曲 //触手猴 LittleRed 改编 -<1=C><3/4><190><0.8>\ -[31'#]_%_[42']#_%_[5#3']_%_|[42']#_%_[5#3']_%_[64'#]_%_|[31'#]_%_[42']#_%_[5#3']_%_|[27]#_%_[31'#]_%_2'#_%_\ -[1#3]'_%_[24]'#_%_[35#]'_%_|[24]'#_%_[35#]'_%_[5#7]'_%_|[1#3]'_%_[24]'#_%_[35#]'_%_|4'#_5'#_2'#_4'#_7#_2'#_\ -[31'#]_%_[42']#_%_[5#3']_%_|[42']#_%_[5#3']_%_[64'#]_%_|[31'#]_%_[42']#_%_[5#3']_%_|[27]#_%_[31'#]_%_2'#_%_\ -[1#3]'_%_[24]'#_%_[35#]'_%_|[24]'#_%_[35#]'_%_[5#7]'_%_|[1#3]'_%_[24]'#_%_[35#]'_%_|4'#_5'#_2'#_4'#_7#_2'#_\ -<6/4><0.6>\ +<1=C><3/4><190><0.8>\ +[31'#]%[42']#%[5#3']%|[42']#%[5#3']%[64'#]%|[31'#]%[42']#%[5#3']%|[27]#%[31'#]%2'#%\ +[1#3]'%[24]'#%[35#]'%|[24]'#%[35#]'%[5#7]'%|[1#3]'%[24]'#%[35#]'%|4'#5'#2'#4'#7#2'#\ +[31'#]%[42']#%[5#3']%|[42']#%[5#3']%[64'#]%|[31'#]%[42']#%[5#3']%|[27]#%[31'#]%2'#%\ +[1#3]'%[24]'#%[35#]'%|[24]'#%[35#]'%[5#7]'%|[1#3]'%[24]'#%[35#]'%|4'#5'#2'#4'#7#2'#\ +<6/4><0.6>\ 1'#-----|0-----|0-----|0-----\ 0-----|0-----|0-----|0-----\ <4/4>\ @@ -17,12 +17,12 @@ 4#-----|3-----|4#-----|5#-----\ <4/4>\ 5#---|5#---\ -<3/4><0.8>\ -[31'#]_%_[42']#_%_[5#3']_%_|[42']#_%_[5#3']_%_[64'#]_%_|[31'#]_%_[42']#_%_[5#3']_%_|[27]#_%_[31'#]_%_2'#_%_\ -[1#3]'_%_[24]'#_%_[35#]'_%_|[24]'#_%_[35#]'_%_[5#7]'_%_|[1#3]'_%_[24]'#_%_[35#]'_%_|4'#_5'#_2'#_4'#_7#_2'#_\ -[31'#]_%_[42']#_%_[5#3']_%_|[42']#_%_[5#3']_%_[64'#]_%_|[31'#]_%_[42']#_%_[5#3']_%_|[27]#_%_[31'#]_%_2'#_%_\ -[1#3]'_%_[24]'#_%_[35#]'_%_|[24]'#_%_[35#]'_%_[5#7]'_%_|[1#3]'_%_[24]'#_%_[35#]'_%_|4'#_5'#_2'#_4'#_7#_2'#_\ -[1#35#^1'#]--^|%--|| +<3/4><0.8>\ +[31'#]%[42']#%[5#3']%|[42']#%[5#3']%[64'#]%|[31'#]%[42']#%[5#3']%|[27]#%[31'#]%2'#%\ +[1#3]'%[24]'#%[35#]'%|[24]'#%[35#]'%[5#7]'%|[1#3]'%[24]'#%[35#]'%|4'#5'#2'#4'#7#2'#\ +[31'#]%[42']#%[5#3']%|[42']#%[5#3']%[64'#]%|[31'#]%[42']#%[5#3']%|[27]#%[31'#]%2'#%\ +[1#3]'%[24]'#%[35#]'%|[24]'#%[35#]'%[5#7]'%|[1#3]'%[24]'#%[35#]'%|4'#5'#2'#4'#7#2'#\ +[1#35#^1'#]--^|%--|| <1=C><3/4><190><1.0>\ 0--|0--|0--|0--\ diff --git a/Songs/Touhou/Gyakutensuru_Wheel_of_Fortune.qys b/Songs/Touhou/Gyakutensuru_Wheel_of_Fortune.qys index dbc1326..56f233f 100644 --- a/Songs/Touhou/Gyakutensuru_Wheel_of_Fortune.qys +++ b/Songs/Touhou/Gyakutensuru_Wheel_of_Fortune.qys @@ -1,4 +1,4 @@ -//逆转的命运之轮(东方绀珠传4面BOSS曲 稀神探女主题曲) +//逆转的命运之轮(东方绀珠传4面BOSS曲 稀神探女主题曲) //ZUN 曲 //触手猴 LittleRed 改编 diff --git a/Songs/Touhou/Hartmann_No_Youkai_Otome.qys b/Songs/Touhou/Hartmann_No_Youkai_Otome.qys index af31bf8..bfa0a66 100644 --- a/Songs/Touhou/Hartmann_No_Youkai_Otome.qys +++ b/Songs/Touhou/Hartmann_No_Youkai_Otome.qys @@ -1,4 +1,4 @@ -//ϥȥޥŮ +//ハルトマンの妖怪少女 //--------------------Section A -------------------- <1=C><160><7/4> diff --git a/Songs/Touhou/Haruka_38Man_Kilo_Voyage.qys b/Songs/Touhou/Haruka_38Man_Kilo_Voyage.qys index 73d1040..cd4bf7c 100644 --- a/Songs/Touhou/Haruka_38Man_Kilo_Voyage.qys +++ b/Songs/Touhou/Haruka_38Man_Kilo_Voyage.qys @@ -1,4 +1,4 @@ -//遥远的38万公里的旅行(东方绀珠传5面道中曲) +//遥远的38万公里的旅行(东方绀珠传5面道中曲) //ZUN 曲 //触手猴 LittleRed 改编 diff --git a/Songs/Touhou/Koori_Tsuita_Eien_no_Miyako.qys b/Songs/Touhou/Koori_Tsuita_Eien_no_Miyako.qys index 8be1c9e..8eddaa4 100644 --- a/Songs/Touhou/Koori_Tsuita_Eien_no_Miyako.qys +++ b/Songs/Touhou/Koori_Tsuita_Eien_no_Miyako.qys @@ -1,4 +1,4 @@ -//冻结的永恒之都(东方绀珠传4面道中曲) +//冻结的永恒之都(东方绀珠传4面道中曲) //ZUN 曲 //触手猴 LittleRed 编曲 diff --git a/Songs/Touhou/Kyuugatsu_no_Pumpkin.qys b/Songs/Touhou/Kyuugatsu_no_Pumpkin.qys index f2bbf34..977a9b1 100644 --- a/Songs/Touhou/Kyuugatsu_no_Pumpkin.qys +++ b/Songs/Touhou/Kyuugatsu_no_Pumpkin.qys @@ -1,4 +1,4 @@ -//九月的南瓜(东方绀珠传2面BOSS曲 铃瑚主题曲) +//九月的南瓜(东方绀珠传2面BOSS曲 铃瑚主题曲) //ZUN 曲 //触手猴 LittleRed 改编 diff --git a/Songs/Touhou/Mizuumi_Gekkou.qys b/Songs/Touhou/Mizuumi_Gekkou.qys index af0f16a..cbb4738 100644 --- a/Songs/Touhou/Mizuumi_Gekkou.qys +++ b/Songs/Touhou/Mizuumi_Gekkou.qys @@ -1,4 +1,4 @@ -//湖面倒映着洁净的月光(东方绀珠传2面道中曲) +//湖面倒映着洁净的月光(东方绀珠传2面道中曲) //ZUN 曲 //触手猴 LittleRed 改编 diff --git a/Songs/Touhou/Nuclear_Fusion.qys b/Songs/Touhou/Nuclear_Fusion.qys index ebfafcb..5810ac2 100644 --- a/Songs/Touhou/Nuclear_Fusion.qys +++ b/Songs/Touhou/Nuclear_Fusion.qys @@ -1,4 +1,4 @@ -//֪̫ +//霊知の太陽信仰 //-------------------- Section A -------------------- <1=bE><180> @@ -62,13 +62,13 @@ 0---|0---|0---|0---\ 0---|0---|0---|0---\ 0---|0---|0---|0---\ -0---|0---|0---|0---\ -6,010601030106,010|6,010601030106,010|6,010601030106,010|6,010601030106,010\ -6,01060104#03b07,03b0|7,03b0703b04#03b07,03b0|20502'050601'03'060|601#'03'0601'03'06'060\ -6,010601030106,010|6,010601030106,010|7,02070204#0207,020|20402'0405#0301030\ -6,010601030106,010|6,010601030106,010|5,07b,0507b,0207b,05,07b,0|6,02060206,01#06010\ -6,010601030106,010|6,010601030106,010|7,02070204#0207,020|20402'0405#0301030\ -6,010601030106,010|6,010601030106,010|5,07b,0507b,0207b,05,07b,0|6,02060206,01#06010\ +0---|0---|0---|0---\ +6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`\ +6,`1`6`1`4#`3b`7,`3b`|7,`3b`7`3b`4#`3b`7,`3b`|2`5`2'`5`6`1'`3'`6`|6`1#'`3'`6`1'`3'`6'`6`\ +6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|7,`2`7`2`4#`2`7,`2`|2`4`2'`4`5#`3`1`3`\ +6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|5,`7b,`5`7b,`2`7b,`5,`7b,`|6,`2`6`2`6,`1#`6`1`\ +6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|7,`2`7`2`4#`2`7,`2`|2`4`2'`4`5#`3`1`3`\ +6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|5,`7b,`5`7b,`2`7b,`5,`7b,`|6,`2`6`2`6,`1#`6`1`\ 0---|0---| <0.6>\ diff --git a/Songs/Touhou/Phantom_Ensemble.qys b/Songs/Touhou/Phantom_Ensemble.qys index 1a6c142..ac4ba06 100644 --- a/Songs/Touhou/Phantom_Ensemble.qys +++ b/Songs/Touhou/Phantom_Ensemble.qys @@ -1,4 +1,5 @@ -//둘S +//幽霊楽団 +//ZUN //---------------- Section A ---------------- <156><1=B><4/4> diff --git a/Songs/Touhou/Ryokugann_No_Jealousy.qys b/Songs/Touhou/Ryokugann_No_Jealousy.qys index b6a8b6e..9ccba48 100644 --- a/Songs/Touhou/Ryokugann_No_Jealousy.qys +++ b/Songs/Touhou/Ryokugann_No_Jealousy.qys @@ -1,4 +1,4 @@ -//绿眼的嫉妒(东方Project水桥帕露西主题曲) +//绿眼的嫉妒(东方Project水桥帕露西主题曲) //ZUN 曲 <1=C><3/4><144><1.0>\ diff --git a/Songs/Touhou/Sumizome_Sakura.qys b/Songs/Touhou/Sumizome_Sakura.qys index 9f07663..2698d92 100644 --- a/Songs/Touhou/Sumizome_Sakura.qys +++ b/Songs/Touhou/Sumizome_Sakura.qys @@ -1,4 +1,4 @@ -//幽雅绽放·墨染之樱(东方妖妖梦6面BOSS·西行寺幽幽子主题曲) +//幽雅绽放·墨染之樱(东方妖妖梦6面BOSS·西行寺幽幽子主题曲) //ZUN 曲 <1=C><4/4><144><1.0>\ diff --git a/Songs/Touhou/Tenkuu_Hana_Miyako.qys b/Songs/Touhou/Tenkuu_Hana_Miyako.qys index 36bef64..3aec9c8 100644 --- a/Songs/Touhou/Tenkuu_Hana_Miyako.qys +++ b/Songs/Touhou/Tenkuu_Hana_Miyako.qys @@ -1,4 +1,4 @@ -//天空的花都(东方妖妖梦四面道中曲,莉莉白主题曲) +//天空的花都(东方妖妖梦四面道中曲,莉莉白主题曲) //ZUN 曲 <1=bC><4/4><144><0.8>\ diff --git a/Songs/Touhou/Touhou_Mix_1.qys b/Songs/Touhou/Touhou_Mix_1.qys index 58581f6..f85f398 100644 --- a/Songs/Touhou/Touhou_Mix_1.qys +++ b/Songs/Touhou/Touhou_Mix_1.qys @@ -1,4 +1,4 @@ -//东方Project组曲串烧 +//东方Project组曲串烧 //行走在旧地狱街道上(东方地灵殿三面道中曲) //魔法少女们的百年祭(东方红魔乡EX面道中曲) //明日之盛,昨日之俗(东方风神录EX面道中曲) diff --git a/Songs/Touhou/Usagi_ha_Mai_Orita.qys b/Songs/Touhou/Usagi_ha_Mai_Orita.qys index 759607d..195cbce 100644 --- a/Songs/Touhou/Usagi_ha_Mai_Orita.qys +++ b/Songs/Touhou/Usagi_ha_Mai_Orita.qys @@ -1,4 +1,4 @@ -//兔已着陆(东方绀珠传一面BOSS曲·清兰主题曲) +//兔已着陆(东方绀珠传一面BOSS曲·清兰主题曲) //ZUN 曲 //触手猴 LittleRed 改编 diff --git a/Songs/Touhou/Wasuregataki.qys b/Songs/Touhou/Wasuregataki.qys index 140f680..0e2e453 100644 --- a/Songs/Touhou/Wasuregataki.qys +++ b/Songs/Touhou/Wasuregataki.qys @@ -1,4 +1,4 @@ -//忘不了,那曾依凭之绿(东方绀珠传一面道中曲) +//忘不了,那曾依凭之绿(东方绀珠传一面道中曲) //ZUN 曲 //触手猴 LittleRed 改编 From 6ee947b88aad0a730eb9afed3bc15cf6d7477a64 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Fri, 12 Jan 2018 02:14:31 +0800 Subject: [PATCH 02/54] New Song: Nyan Cat --- Meta/Nyan_Cat.meta | 8 ++++++++ Songs/Nyan_Cat.qys | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 Meta/Nyan_Cat.meta create mode 100644 Songs/Nyan_Cat.qys diff --git a/Meta/Nyan_Cat.meta b/Meta/Nyan_Cat.meta new file mode 100644 index 0000000..3852fbf --- /dev/null +++ b/Meta/Nyan_Cat.meta @@ -0,0 +1,8 @@ +Format: qys; +TrackCount: 4; +Duration: 7920/71; +Instruments: {"ElectricBass", "ElectricPiano"}; +Messages: ; +SongName: 彩虹猫; +Composer: daniwellP; +Comment: Nyan cat; \ No newline at end of file diff --git a/Songs/Nyan_Cat.qys b/Songs/Nyan_Cat.qys new file mode 100644 index 0000000..3207bce --- /dev/null +++ b/Songs/Nyan_Cat.qys @@ -0,0 +1,25 @@ +//Nyan cat + +<142><4/4> + +<1.0><1=B''>\ +34501'43451'3'4'3'71'0|5034501'02'71'2'4'3'4'2'<1=B'>\ +:5-6-3b3-23b21-1-2-|3b-3b2123563523121|3-5-6352313b33b212|3b-123523b212-1-2-\ + 5-6-3b3-23b21-1-2-|3b-3b2123563523121|3-5-6352313b33b212|3b-123523b212-1-2-\ + 1-5,6,1-5,6,12324345|1-1-5,6,15,43214,3,4,5,|1-5,6,1-5,6,112315,6,5,|1-17,15,6,143451-7,-\ + 1-5,6,1-5,6,12324345|1-1-5,6,15,43214,3,4,5,|1-5,6,1-5,6,112315,6,5,|1-17,15,6,143451-7,-:\ +:5-6-3b3-23b21-1-2-|3b-3b2123563523121|3-5-6352313b33b212|3b-123523b212-1-2-\ + 5-6-3b3-23b21-1-2-|3b-3b2123563523121|3-5-6352313b33b212|3b-123523b212-1-2-\ + 1-5,6,1-5,6,12324345|1-1-5,6,15,43214,3,4,5,|1-5,6,1-5,6,112315,6,5,|1-17,15,6,143451-7,-\ + 1-5,6,1-5,6,12324345|1-1-5,6,15,43214,3,4,5,|1-5,6,1-5,6,112315,6,5,|1-17,15,6,143451-7,-:| + +<0.8><1=B,,>\ +0---|0---\ +:44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ + 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ + 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ + 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123:\ +:44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ + 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ + 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ + 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123:| From 49079e8e229b97d7695ed63c790e73b5a8bfd005 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Fri, 12 Jan 2018 14:07:11 +0800 Subject: [PATCH 03/54] =?UTF-8?q?New=20Song:=20=E7=A9=BA=E4=B8=AD=E9=97=AA?= =?UTF-8?q?=E8=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Meta/Sora_ni_Hikaru.meta | 9 +++++++++ Songs/Sora_ni_Hikaru.qys | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Meta/Sora_ni_Hikaru.meta create mode 100644 Songs/Sora_ni_Hikaru.qys diff --git a/Meta/Sora_ni_Hikaru.meta b/Meta/Sora_ni_Hikaru.meta new file mode 100644 index 0000000..3aba46b --- /dev/null +++ b/Meta/Sora_ni_Hikaru.meta @@ -0,0 +1,9 @@ +Format: qys; +TrackCount: 4; +Duration: 1880/11; +Instruments: {"BrightPiano", "Piano"}; +Messages: ; +SongName: 空中闪耀; +Composer: 戸越まごめ; +Comment: 空に光る; +Abstract: 《Clannad》插曲; \ No newline at end of file diff --git a/Songs/Sora_ni_Hikaru.qys b/Songs/Sora_ni_Hikaru.qys new file mode 100644 index 0000000..c369a6d --- /dev/null +++ b/Songs/Sora_ni_Hikaru.qys @@ -0,0 +1,33 @@ +//空に光る + +<1=#F><4/4><66> + +<1.0>\ +0--5_2'_|2'_3'_6-5_2'_|2'_3'_5-1_5_|[6,15]_4_3_2_[5,1]7,\ +[125]--5_2'_|2'_3'_6-5_2'_|2'_3'_5-1_5_|[6,15]_4_3_2_[4,5,1]7,\ +[4,5,1]--5_2'_|2'_3'_6-5_2'_|2'_3'_5-1_5_|[6,15]_4_3_2_[5,1]7,\ +[125]--5_2'_|2'_3'_6-5_2'_|2'_3'_5-1_5_|[6,15]_4_3_2_[4,5,1]7,\ +[4,5,1]-0_1_1'_7_|7.6_6-^|%6_7_2'_1'_7_6_|6.5_5-^\ +%-0_1_1'_7_|7.6_6-^|%6_7_2'_1'_7_6_|5#73'2'\ +2'_3'_1'_7_1'2'_7_|7.6.-^|%6_7_2'_1'_7_6_|5#73'2'\ +2_3_1_7,_1_2_3_1_|6---^|%654|5---^\ +%543b|2-1-\ +7--5_2'_|2'_3'_6-5_2'_|[352']_3'_5-1_5_|[6,15]_4_3_2_[3,5,1]7,\ +[125]--5_2'_|[52']_3'_6-5_2'_|[352']_3'_5-1'_5'_|[61'5']_4'_3'_2'_[351'][247]\ +[47b1']-[4,7,2]-|[35#M],-[5#,124]-|[125]---|[7,25]--5_2'_|[4,5,1]-3,-| + +<0.6>\ +0---|[4M5]---|[351']---|2,_6,_45,,_2,_4,\ +1,_5,_1_2_5_10_|[4M5]---|[351']---|2,_6,_45,,_2,_4,\ +1,_5,_1_2_[5,13]-|[4M5]---|[351']---|2,_6,_45,,_2,_4,\ +1,_5,_1_2_5_10_|[4M5]---|[351']---|2,_6,_45,,_2,_4,\ +1,_5,_1_2_[5,13]-|[147]%[146]%|[147]%[146]%|[5p,1][125][5p,1]1M\ +[5p,1][125][5p,1]1M|[147]%[146]%|[147]%[146]%|[7,35#]%%%\ +[1o36]%%%|[147]%[146]%|[147]%[146]%|[7,235#]%%%\ +[1o36]%[1M1']%|[4M3']%[4M2']%|[4M5]%[4M2']%|4m%[45#d]%\ +[3b5#1']%[1m1'][1o3b4]|[125]%[7,25]%\ +[7,35#]-[35#]-[35#7]-0-|4,146[61'][57][61'][72']|3,1315131|2,6,26,5,252\ +1,5,1251'--|4,146[61'][57][61'][72']|3,1415131|2,6,26,5,252\ +4#,,4,7b,12---|5#,,3b,5#,145#,14|5,,2,5,12561'|[7,25]---|1,_5,_2_4_1p,-| + + From 9409eb658d4b0a972637e5a1c0b0a20da207d3ed Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Fri, 12 Jan 2018 14:40:40 +0800 Subject: [PATCH 04/54] Some adjustments for playlist --- .../{ => TH15-Kanjuden}/Akumu_no_Sekai.meta | 0 .../{ => TH15-Kanjuden}/Eien_no_Shyunmu.meta | 0 .../{ => TH15-Kanjuden}/Fushigi_Miko.meta | 0 .../Gyakutensuru_Wheel_of_Fortune.meta | 0 .../Haruka_38Man_Kilo_Voyage.meta | 0 .../Kokyou_Hoshi_Utsuru_Umi.meta | 0 .../Koori_Tsuita_Eien_no_Miyako.meta | 0 .../Kyuugatsu_no_Pumpkin.meta | 0 .../{ => TH15-Kanjuden}/Mizuumi_Gekkou.meta | 0 .../{ => TH15-Kanjuden}/Pure_Furies.meta | 0 .../Seijyouki_no_Pierrot.meta | 0 .../Usagi_ha_Mai_Orita.meta | 0 .../{ => TH15-Kanjuden}/Wasuregataki.meta | 0 Playlist/TH15-Kanjuden.qyl | 24 +++++++++++++++++++ .../{ => TH15-Kanjuden}/Akumu_no_Sekai.qys | 0 .../{ => TH15-Kanjuden}/Eien_no_Shyunmu.qys | 0 .../{ => TH15-Kanjuden}/Fushigi_Miko.qys | 0 .../Gyakutensuru_Wheel_of_Fortune.qys | 0 .../Haruka_38Man_Kilo_Voyage.qys | 0 .../Kokyou_Hoshi_Utsuru_Umi.qys | 0 .../Koori_Tsuita_Eien_no_Miyako.qys | 0 .../Kyuugatsu_no_Pumpkin.qys | 0 .../{ => TH15-Kanjuden}/Mizuumi_Gekkou.qys | 0 .../{ => TH15-Kanjuden}/Pure_Furies.qys | 0 .../Seijyouki_no_Pierrot.qys | 0 .../Usagi_ha_Mai_Orita.qys | 0 .../{ => TH15-Kanjuden}/Wasuregataki.qys | 0 27 files changed, 24 insertions(+) rename Meta/Touhou/{ => TH15-Kanjuden}/Akumu_no_Sekai.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Eien_no_Shyunmu.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Fushigi_Miko.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Gyakutensuru_Wheel_of_Fortune.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Haruka_38Man_Kilo_Voyage.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Kokyou_Hoshi_Utsuru_Umi.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Koori_Tsuita_Eien_no_Miyako.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Kyuugatsu_no_Pumpkin.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Mizuumi_Gekkou.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Pure_Furies.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Seijyouki_no_Pierrot.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Usagi_ha_Mai_Orita.meta (100%) rename Meta/Touhou/{ => TH15-Kanjuden}/Wasuregataki.meta (100%) create mode 100644 Playlist/TH15-Kanjuden.qyl rename Songs/Touhou/{ => TH15-Kanjuden}/Akumu_no_Sekai.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Eien_no_Shyunmu.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Fushigi_Miko.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Gyakutensuru_Wheel_of_Fortune.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Haruka_38Man_Kilo_Voyage.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Kokyou_Hoshi_Utsuru_Umi.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Koori_Tsuita_Eien_no_Miyako.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Kyuugatsu_no_Pumpkin.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Mizuumi_Gekkou.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Pure_Furies.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Seijyouki_no_Pierrot.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Usagi_ha_Mai_Orita.qys (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Wasuregataki.qys (100%) diff --git a/Meta/Touhou/Akumu_no_Sekai.meta b/Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.meta similarity index 100% rename from Meta/Touhou/Akumu_no_Sekai.meta rename to Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.meta diff --git a/Meta/Touhou/Eien_no_Shyunmu.meta b/Meta/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.meta similarity index 100% rename from Meta/Touhou/Eien_no_Shyunmu.meta rename to Meta/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.meta diff --git a/Meta/Touhou/Fushigi_Miko.meta b/Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.meta similarity index 100% rename from Meta/Touhou/Fushigi_Miko.meta rename to Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.meta diff --git a/Meta/Touhou/Gyakutensuru_Wheel_of_Fortune.meta b/Meta/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.meta similarity index 100% rename from Meta/Touhou/Gyakutensuru_Wheel_of_Fortune.meta rename to Meta/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.meta diff --git a/Meta/Touhou/Haruka_38Man_Kilo_Voyage.meta b/Meta/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.meta similarity index 100% rename from Meta/Touhou/Haruka_38Man_Kilo_Voyage.meta rename to Meta/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.meta diff --git a/Meta/Touhou/Kokyou_Hoshi_Utsuru_Umi.meta b/Meta/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.meta similarity index 100% rename from Meta/Touhou/Kokyou_Hoshi_Utsuru_Umi.meta rename to Meta/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.meta diff --git a/Meta/Touhou/Koori_Tsuita_Eien_no_Miyako.meta b/Meta/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.meta similarity index 100% rename from Meta/Touhou/Koori_Tsuita_Eien_no_Miyako.meta rename to Meta/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.meta diff --git a/Meta/Touhou/Kyuugatsu_no_Pumpkin.meta b/Meta/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.meta similarity index 100% rename from Meta/Touhou/Kyuugatsu_no_Pumpkin.meta rename to Meta/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.meta diff --git a/Meta/Touhou/Mizuumi_Gekkou.meta b/Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.meta similarity index 100% rename from Meta/Touhou/Mizuumi_Gekkou.meta rename to Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.meta diff --git a/Meta/Touhou/Pure_Furies.meta b/Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta similarity index 100% rename from Meta/Touhou/Pure_Furies.meta rename to Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta diff --git a/Meta/Touhou/Seijyouki_no_Pierrot.meta b/Meta/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.meta similarity index 100% rename from Meta/Touhou/Seijyouki_no_Pierrot.meta rename to Meta/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.meta diff --git a/Meta/Touhou/Usagi_ha_Mai_Orita.meta b/Meta/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.meta similarity index 100% rename from Meta/Touhou/Usagi_ha_Mai_Orita.meta rename to Meta/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.meta diff --git a/Meta/Touhou/Wasuregataki.meta b/Meta/Touhou/TH15-Kanjuden/Wasuregataki.meta similarity index 100% rename from Meta/Touhou/Wasuregataki.meta rename to Meta/Touhou/TH15-Kanjuden/Wasuregataki.meta diff --git a/Playlist/TH15-Kanjuden.qyl b/Playlist/TH15-Kanjuden.qyl new file mode 100644 index 0000000..8c24f5b --- /dev/null +++ b/Playlist/TH15-Kanjuden.qyl @@ -0,0 +1,24 @@ +{ + "Title": "东方绀珠传", + "Comment": "东方绀珠伝 ~ Legacy of Lunatic Kingdom", + "Abstract": "", + "Path": "Touhou\\TH15-Kanjuden\\", + "SongList": [ + {"Index": "一面道中曲", "Song": "Wasuregataki"}, + {"Index": "一面BOSS曲", "Song": "Usagi_ha_Mai_Orita"}, + {"Index": "二面道中曲", "Song": "Mizuumi_Gekkou"}, + {"Index": "二面BOSS曲", "Song": "Kyuugatsu_no_Pumpkin"}, + {"Index": "三面道中曲", "Song": "Fushigi_Miko"}, + {"Index": "三面BOSS曲", "Song": "Eien_no_Shyunmu"}, + {"Index": "四面道中曲", "Song": "Koori_Tsuita_Eien_no_Miyako"}, + {"Index": "四面BOSS曲", "Song": "Gyakutensuru_Wheel_of_Fortune"}, + {"Index": "五面道中曲", "Song": "Haruka_38Man_Kilo_Voyage"}, + {"Index": "五面BOSS曲", "Song": "Seijyouki_no_Pierrot"}, + {"Index": "六面道中曲", "Song": "Kokyou_Hoshi_Utsuru_Umi"}, + {"Index": "六面BOSS曲", "Song": "Pure_Furies"}, + {"Index": "EX面道中曲", "Song": "Akumu_no_Sekai"} + ], + "Indexed": true, + "HomeDisplay": true, + "SortEnabled": false +} \ No newline at end of file diff --git a/Songs/Touhou/Akumu_no_Sekai.qys b/Songs/Touhou/TH15-Kanjuden/Akumu_no_Sekai.qys similarity index 100% rename from Songs/Touhou/Akumu_no_Sekai.qys rename to Songs/Touhou/TH15-Kanjuden/Akumu_no_Sekai.qys diff --git a/Songs/Touhou/Eien_no_Shyunmu.qys b/Songs/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.qys similarity index 100% rename from Songs/Touhou/Eien_no_Shyunmu.qys rename to Songs/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.qys diff --git a/Songs/Touhou/Fushigi_Miko.qys b/Songs/Touhou/TH15-Kanjuden/Fushigi_Miko.qys similarity index 100% rename from Songs/Touhou/Fushigi_Miko.qys rename to Songs/Touhou/TH15-Kanjuden/Fushigi_Miko.qys diff --git a/Songs/Touhou/Gyakutensuru_Wheel_of_Fortune.qys b/Songs/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.qys similarity index 100% rename from Songs/Touhou/Gyakutensuru_Wheel_of_Fortune.qys rename to Songs/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.qys diff --git a/Songs/Touhou/Haruka_38Man_Kilo_Voyage.qys b/Songs/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.qys similarity index 100% rename from Songs/Touhou/Haruka_38Man_Kilo_Voyage.qys rename to Songs/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.qys diff --git a/Songs/Touhou/Kokyou_Hoshi_Utsuru_Umi.qys b/Songs/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.qys similarity index 100% rename from Songs/Touhou/Kokyou_Hoshi_Utsuru_Umi.qys rename to Songs/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.qys diff --git a/Songs/Touhou/Koori_Tsuita_Eien_no_Miyako.qys b/Songs/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.qys similarity index 100% rename from Songs/Touhou/Koori_Tsuita_Eien_no_Miyako.qys rename to Songs/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.qys diff --git a/Songs/Touhou/Kyuugatsu_no_Pumpkin.qys b/Songs/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.qys similarity index 100% rename from Songs/Touhou/Kyuugatsu_no_Pumpkin.qys rename to Songs/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.qys diff --git a/Songs/Touhou/Mizuumi_Gekkou.qys b/Songs/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.qys similarity index 100% rename from Songs/Touhou/Mizuumi_Gekkou.qys rename to Songs/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.qys diff --git a/Songs/Touhou/Pure_Furies.qys b/Songs/Touhou/TH15-Kanjuden/Pure_Furies.qys similarity index 100% rename from Songs/Touhou/Pure_Furies.qys rename to Songs/Touhou/TH15-Kanjuden/Pure_Furies.qys diff --git a/Songs/Touhou/Seijyouki_no_Pierrot.qys b/Songs/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.qys similarity index 100% rename from Songs/Touhou/Seijyouki_no_Pierrot.qys rename to Songs/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.qys diff --git a/Songs/Touhou/Usagi_ha_Mai_Orita.qys b/Songs/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.qys similarity index 100% rename from Songs/Touhou/Usagi_ha_Mai_Orita.qys rename to Songs/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.qys diff --git a/Songs/Touhou/Wasuregataki.qys b/Songs/Touhou/TH15-Kanjuden/Wasuregataki.qys similarity index 100% rename from Songs/Touhou/Wasuregataki.qys rename to Songs/Touhou/TH15-Kanjuden/Wasuregataki.qys From 7b96aa0b3d7f8045bef87898a9ff4c8cfe0cc70a Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sat, 13 Jan 2018 02:26:58 +0800 Subject: [PATCH 05/54] New Feature: Playlist --- Lang/chs.json | 1 + Lang/eng.json | 1 + Playlists/Chorus.qyl | 14 ++ Playlists/Clannad.qyl | 13 ++ Playlists/Piano.qyl | 16 ++ {Playlist => Playlists}/TH15-Kanjuden.qyl | 5 +- QYMP.wl | 33 +++- color.json | 3 +- interface.wl | 202 +++++++++++++++------- library.wl | 2 +- style.json | 5 +- 11 files changed, 216 insertions(+), 79 deletions(-) create mode 100644 Playlists/Chorus.qyl create mode 100644 Playlists/Clannad.qyl create mode 100644 Playlists/Piano.qyl rename {Playlist => Playlists}/TH15-Kanjuden.qyl (93%) diff --git a/Lang/chs.json b/Lang/chs.json index 73e0d80..c1cebf7 100644 --- a/Lang/chs.json +++ b/Lang/chs.json @@ -77,6 +77,7 @@ }, "Caption": { "QYMP": "青云播放器", + "Playlist": "歌单", "Settings": "设置", "About": "关于", "ModifySong": "修改歌曲", diff --git a/Lang/eng.json b/Lang/eng.json index 5dd5e7b..d8ff8be 100644 --- a/Lang/eng.json +++ b/Lang/eng.json @@ -77,6 +77,7 @@ }, "Caption": { "QYMP": "Qingyun Music Player", + "Playlist": "Playlist", "Settings": "Settings", "About": "About", "ModifySong": "Modify Song", diff --git a/Playlists/Chorus.qyl b/Playlists/Chorus.qyl new file mode 100644 index 0000000..d7651ab --- /dev/null +++ b/Playlists/Chorus.qyl @@ -0,0 +1,14 @@ +{ + "Title": "合唱曲", + "Comment": "", + "Abstract": "", + "Path": "", + "SongList": [ + {"Song": "NCU_School_Song"}, + {"Song": "Red_Star_Song"}, + {"Song": "Sunny_Light"}, + {"Song": "Oriental_Pearl"} + ], + "IndexWidth": 0, + "HomeDisplay": true +} \ No newline at end of file diff --git a/Playlists/Clannad.qyl b/Playlists/Clannad.qyl new file mode 100644 index 0000000..fe100d4 --- /dev/null +++ b/Playlists/Clannad.qyl @@ -0,0 +1,13 @@ +{ + "Title": "Clannad", + "Comment": "", + "Abstract": "", + "Path": "", + "SongList": [ + {"Song": "Nagisa"}, + {"Song": "Shionari"}, + {"Song": "Sora_ni_Hikaru"} + ], + "IndexWidth": 0, + "HomeDisplay": false +} \ No newline at end of file diff --git a/Playlists/Piano.qyl b/Playlists/Piano.qyl new file mode 100644 index 0000000..58753ac --- /dev/null +++ b/Playlists/Piano.qyl @@ -0,0 +1,16 @@ +{ + "Title": "钢琴曲", + "Comment": "", + "Abstract": "", + "Path": "", + "SongList": [ + {"Song": "Anima"}, + {"Song": "Gate_of_Steiner"}, + {"Song": "If_You_Were_By_My_Side"}, + {"Song": "Lonely_Night"}, + {"Song": "Sora_ni_Hikaru"}, + {"Song": "Touhou\\Necro_Fantasia"} + ], + "IndexWidth": 0, + "HomeDisplay": true +} \ No newline at end of file diff --git a/Playlist/TH15-Kanjuden.qyl b/Playlists/TH15-Kanjuden.qyl similarity index 93% rename from Playlist/TH15-Kanjuden.qyl rename to Playlists/TH15-Kanjuden.qyl index 8c24f5b..410128a 100644 --- a/Playlist/TH15-Kanjuden.qyl +++ b/Playlists/TH15-Kanjuden.qyl @@ -18,7 +18,6 @@ {"Index": "六面BOSS曲", "Song": "Pure_Furies"}, {"Index": "EX面道中曲", "Song": "Akumu_no_Sekai"} ], - "Indexed": true, - "HomeDisplay": true, - "SortEnabled": false + "IndexWidth": 160, + "HomeDisplay": true } \ No newline at end of file diff --git a/QYMP.wl b/QYMP.wl index 87ca1d3..ab58f3b 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -14,24 +14,41 @@ path=NotebookDirectory[]; refresh:=( metaTree=StringDrop[FileNames["*","Meta",Infinity],5]; - songList=StringDrop[Select[metaTree,StringMatchQ[__~~".meta"]],-5]; + songListAll=StringDrop[Select[metaTree,StringMatchQ[__~~".meta"]],-5]; dirList=Select[metaTree,!StringMatchQ[#,__~~".meta"]&]; Do[ If[!DirectoryQ[userPath<>"buffer\\"<>dir],CreateDirectory[userPath<>"buffer\\"<>dir]]; If[!DirectoryQ[userPath<>"images\\"<>dir],CreateDirectory[userPath<>"images\\"<>dir]], {dir,dirList}]; - index=AssociationMap[readInfo,songList]; - pageCount=Ceiling[Length@songList/16]; - songListPaged=Partition[songList,UpTo@Ceiling[Length@songList/pageCount]]; + index=AssociationMap[readInfo,songListAll]; + playlistList=StringDrop[FileNames["*","Playlists"],10]; + playlistData=Association[#->Association@Import[path<>"Playlists\\"<>#,"JSON"]&/@playlistList]; + playlistList=Select[playlistList,playlistData[[#,"HomeDisplay"]]&]; + PrependTo[playlistList,"All"]; + PrependTo[playlistData, + "All"-><| + "Path"->"", + "Title"->"\:6240\:6709\:6b4c\:66f2", + "Abstract"->"", + "Comment"->"", + "SongList"->({"Song"->#}&/@songListAll), + "HomeDisplay"->True, + "IndexWidth"->0 + |> + ]; ); +(* ::Input:: *) +(*refresh;*) + + updateImage:=Module[{updates={},image,filename,meta}, Do[ If[KeyExistsQ[index[[song]],"Image"]&&!FileExistsQ[userPath<>"Images\\"<>index[[song,"Image"]]], AppendTo[updates,index[[song,"Image"]]] ], - {song,songList}]; + {song,songListAll}]; If[updates=={},Return[]]; Monitor[Do[ filename=updates[[i]]; @@ -70,7 +87,7 @@ updateBuffer:=Module[{updates={},song,filename,hash,audio,messages}, AppendTo[bufferHash,song->hash]; AppendTo[updates,song]; ], - {song,songList}]; + {song,songListAll}]; If[updates=={},Return[]]; Monitor[Do[ song=updates[[i]]; @@ -98,7 +115,7 @@ updateBuffer:=Module[{updates={},song,filename,hash,audio,messages}, index[[updates[[i]],"SongName"]] }], Spacer[{4,4}]},Alignment->Center],ImageSize->400,Alignment->Center]]; - Export[userPath<>"Buffer.json",Normal@bufferHash[[Intersection[Keys@bufferHash,songList]]]]; + Export[userPath<>"Buffer.json",Normal@bufferHash[[Intersection[Keys@bufferHash,songListAll]]]]; Export[userPath<>"ErrorLog.json",Normal@errorLog]; ]; @@ -108,7 +125,7 @@ refresh;updateImage;updateBuffer; (* ::Input::Initialization:: *) -page=1;QYMP; +QYMP; (* ::Input:: *) diff --git a/color.json b/color.json index b4945ad..bc1281d 100644 --- a/color.json +++ b/color.json @@ -2,7 +2,8 @@ "StyleColor": { "Default": "#000000", "Background": "#F9F9F9", - "Comment": "#707070" + "Comment": "#707070", + "Index": "#303030" }, "ButtonColor": { "Basic": { diff --git a/interface.wl b/interface.wl index 2b881ad..476dab1 100644 --- a/interface.wl +++ b/interface.wl @@ -45,7 +45,7 @@ uiSettings:=DynamicModule[{choices}, (*uiPlayer["Touhou\\Dream_Battle"]*) -playerControlsOld:={ +uiPlayerControlsOld:={ Row[{ Dynamic[Style[timeDisplay[current["Position"]],20]], Spacer[8], @@ -66,12 +66,12 @@ playerControlsOld:={ Spacer[20], Button[text[["Stop"]],current["State"]="Stopped",ImageSize->80], Spacer[20], - Button[text[["Return"]],AudioStop[];DialogReturn[QYMP],ImageSize->80] + Button[text[["Return"]],AudioStop[];DialogReturn[uiPlaylist[]],ImageSize->80] }] }; -playerControlsNew:={ +uiPlayerControlsNew:={ Row[{ Column[{Style[Dynamic[timeDisplay[current["Position"]]],20],Spacer[1]}], Spacer[8], @@ -105,7 +105,7 @@ playerControlsNew:={ "MouseDown":>(style="Clicked";), "MouseUp":>(style="Default"; AudioStop[]; - DialogReturn[QYMP]; + DialogReturn[uiPlaylist[]]; ) }] ] @@ -160,8 +160,8 @@ uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, ], Spacer[1]}, Switch[userInfo[["Player"]], - "Old",playerControlsOld, - "New",playerControlsNew + "Old",uiPlayerControlsOld, + "New",uiPlayerControlsNew ], {Spacer[{60,60}]} ],Alignment->Center,ItemSize->Full], @@ -185,7 +185,7 @@ uiModifySong[song_]:=DynamicModule[{textInfo}, {Button[text[["Save"]],putTextInfo[song,textInfo],ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], Button[text[["Undo"]],textInfo=getTextInfo[song],ImageSize->150]}, {Button[text[["DeleteSong"]],DialogReturn[uiDeleteSong[song]],ImageSize->150], - Button[text[["Return"]],DialogReturn[QYMP],ImageSize->150]} + Button[text[["Return"]],DialogReturn[uiPlaylist[]],ImageSize->150]} }],Spacer[{20,20}] },Center,ItemSize->Full,Spacings->1], Background->styleColor[["Background"]],WindowTitle->text[["ModifySong"]]]; @@ -196,7 +196,7 @@ ignoreList={"temp.qys","test.qys"}; uiAddSong:=DynamicModule[{songPath,textInfo,candidates}, textInfo=AssociationMap[""&,textInfoTags]; candidates=Complement[StringDrop[FileNames["*.qys"|"*.qym","Songs",Infinity],6], - #<>"."<>index[[#,"Format"]]&/@songList, + #<>"."<>index[[#,"Format"]]&/@songListAll, ignoreList ]; CreateDialog[Column[{Spacer[{40,40}], @@ -209,10 +209,10 @@ uiAddSong:=DynamicModule[{songPath,textInfo,candidates}, InputField[Dynamic@textInfo[[#]],String], Spacer[40]}]&/@textInfoTags], Spacer[4], - Row[{Button[text[["Add"]],addSong[songPath,textInfo];DialogReturn[QYMP], + Row[{Button[text[["Add"]],addSong[songPath,textInfo];DialogReturn[uiPlaylist[]], ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], Spacer[20], - Button[text[["Return"]],DialogReturn[QYMP],ImageSize->150]}], + Button[text[["Return"]],DialogReturn[uiPlaylist[]],ImageSize->150]}], Spacer[{40,40}]},Center,ItemSize->Full,Spacings->1], Background->styleColor[["Background"]],WindowTitle->text[["AddSong"]]] ]; @@ -243,10 +243,10 @@ uiDeleteSong[song_]:=CreateDialog[Column[{"", Button[text[["Confirm"]], index=Delete[index,song]; DeleteFile[path<>"Meta\\"<>song<>".meta"]; - DialogReturn[QYMP], + DialogReturn[uiPlaylist[]], ImageSize->100], Spacer[20], - Button[text[["Return"]],DialogReturn[QYMP],ImageSize->100] + Button[text[["Return"]],DialogReturn[uiModifySong[song]],ImageSize->100] }],"" },Center,ItemSize->36], Background->styleColor[["Background"]],WindowTitle->text[["DeleteSong"]]]; @@ -269,37 +269,52 @@ WindowTitle->text[["About"]],Background->styleColor[["Background"]]]; (*uiAbout;*) -QYMP:=DynamicModule[{song}, +uiPageSelector:=Row[{ + Dynamic@If[page<=1,pageSelector["Prev","Disabled"], + DynamicModule[{style="Default"}, + EventHandler[Dynamic@pageSelector["Prev",style],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";page--;) + }] + ]], + Spacer[20], + Row[Flatten@Array[{ + Dynamic@If[page==#,pageSelector[#,"Current",32], + DynamicModule[{style="Default"}, + EventHandler[Dynamic@pageSelector[#,style,32],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";page=#;) + }] + ] + ],Spacer[6]}&,pageCount]], + Spacer[14], + Dynamic@If[page>=pageCount,pageSelector["Next","Disabled"], + DynamicModule[{style="Default"}, + EventHandler[Dynamic@pageSelector["Next",style],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";page++;) + }] + ]] +},ImageSize->{500,60},Alignment->Center]; + + +QYMP:=DynamicModule[{playlist="All"}, + page=1; refresh; - AudioStop[]; + pageCount=Ceiling[Length@playlistList/16]; + playlistListPaged=Partition[playlistList,UpTo@Ceiling[Length@playlistList/pageCount]]; CreateDialog[Column[{Spacer[{40,40}], Row[{ Row[{Spacer[40],caption["_QYMP","BigTitle"]},Alignment->Left,ImageSize->320], - Row[Join[{ + Row[{ DynamicModule[{style="Default"}, EventHandler[Dynamic@button["Play",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[uiPlayer[song]];) + "MouseUp":>(style="Default";currentPlaylist=playlist;DialogReturn[uiPlaylist[]]) }] ], - Spacer[10]}, - If[userInfo[["Developer"]], - {DynamicModule[{style="Default"}, - EventHandler[Dynamic@button["Modify",style],{ - "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[uiModifySong[song]];) - }] - ], - Spacer[10], - DynamicModule[{style="Default"}, - EventHandler[Dynamic@button["Add",style],{ - "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[uiAddSong];) - }] - ], - Spacer[10]}, - {Nothing}], - {DynamicModule[{style="Default"}, + Spacer[10], + DynamicModule[{style="Default"}, EventHandler[Dynamic@button["About",style],{ "MouseDown":>(style="Clicked"), "MouseUp":>(style="Default";DialogReturn[uiAbout];) @@ -319,49 +334,106 @@ QYMP:=DynamicModule[{song}, "MouseUp":>(style="Default";DialogReturn[];) }] ], - Spacer[40]} - ],Alignment->Right,ImageSize->{480,56}] + Spacer[40] + },Alignment->Right,ImageSize->{480,56}] }], Spacer[1], - Dynamic@Row[{Spacer[60],SetterBar[Dynamic@song, + Dynamic@Row[{Spacer[60],SetterBar[Dynamic@playlist, #->Row[{ - Style[index[[#,"SongName"]],24,FontFamily->"\:5fae\:8f6f\:96c5\:9ed1"], - Spacer[20], - If[KeyExistsQ[index[[#]],"Comment"],Style[index[[#,"Comment"]],20,Gray,FontFamily->"\:5fae\:8f6f\:96c5\:9ed1"],Nothing] - },ImageSize->{800,30}]&/@songListPaged[[page]], + Spacer[8], + caption[playlistData[[#,"Title"]],"SongName"], + Row[{Spacer[24],caption[playlistData[[#,"Comment"]],"SongComment"]}], + + },ImageSize->{800,30}]&/@playlistListPaged[[page]], Appearance->"Vertical" ],Spacer[60]}],Spacer[1], - Row[Join[{ - Dynamic@If[page<=1,pageSelector["Prev","Disabled"], - DynamicModule[{style="Default"}, - EventHandler[Dynamic@pageSelector["Prev",style],{ - "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";page--;) - }] - ]], - Spacer[20]}, - Flatten@Array[{ - Dynamic@If[page==#,pageSelector[#,"Current",32], + uiPageSelector, + Spacer[{40,40}] + },Center,ItemSize->Full], + WindowTitle->text[["QYMP"]],Background->styleColor[["Background"]]] +]; + + +uiPlaylist[]:=DynamicModule[{song,songList,playlistInfo,playlist}, + page=1; + playlist=currentPlaylist; + playlistInfo=playlistData[[playlist]]; + songList=Association/@playlistInfo[["SongList"]]; + Do[ + songList[[i,"Song"]]=playlistInfo[["Path"]]<>songList[[i,"Song"]], + {i,Length@songList}]; + pageCount=Ceiling[Length@songList/16]; + songListPaged=Partition[songList,UpTo@Ceiling[Length@songList/pageCount]]; + CreateDialog[Column[{Spacer[{40,40}], + Row[{ + Row[{Spacer[40],caption[playlistInfo[["Title"]],"BigTitle"]},Alignment->Left,ImageSize->320], + Row[{ DynamicModule[{style="Default"}, - EventHandler[Dynamic@pageSelector[#,style,32],{ + EventHandler[Dynamic@button["Play",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";page=#;) + "MouseUp":>(style="Default";DialogReturn[uiPlayer[song]];) }] + ], + Spacer[10], + If[userInfo[["Developer"]]&&playlist=="All",Row[{ + DynamicModule[{style="Default"}, + EventHandler[Dynamic@button["Modify",style],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";DialogReturn[uiModifySong[song]];) + }] + ], + Spacer[10], + DynamicModule[{style="Default"}, + EventHandler[Dynamic@button["Add",style],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";DialogReturn[uiAddSong];) + }] + ], + Spacer[10]}], + Nothing + ], + DynamicModule[{style="Default"}, + EventHandler[Dynamic@button["ArrowL",style],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";DialogReturn[QYMP];) + }] + ], + Spacer[40]},Alignment->Right,ImageSize->{480,56}] + }], + Spacer[1], + Dynamic@Row[{Spacer[60],SetterBar[Dynamic@song, + #[["Song"]]->Row[{ + Spacer[8], + If[playlistInfo[["IndexWidth"]]>0, + Row[{ + caption[#[["Index"]],"SongIndex"], + Spacer[16] + },ImageSize->playlistInfo[["IndexWidth"]],Alignment->Center], + Nothing + ], + caption[index[[#[["Song"]],"SongName"]],"SongName"], + If[KeyExistsQ[index[[#[["Song"]]]],"Comment"], + Row[{Spacer[24],caption[index[[#[["Song"]],"Comment"]],"SongComment"]}], + Nothing ] - ],Spacer[6]}&,pageCount], - {Spacer[14], - Dynamic@If[page>=pageCount,pageSelector["Next","Disabled"], - DynamicModule[{style="Default"}, - EventHandler[Dynamic@pageSelector["Next",style],{ - "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";page++;) - }] - ]]} - ],ImageSize->{500,60},Alignment->Center],Spacer[{40,40}] + },ImageSize->{800,30}]&/@songListPaged[[page]], + Appearance->"Vertical" + ],Spacer[60]}], + Spacer[1], + uiPageSelector, + Spacer[{40,40}] },Center,ItemSize->Full], - WindowTitle->text[["QYMP"]],Background->styleColor[["Background"]]] + WindowTitle->text[["Playlist"]]<>" - "<>playlistInfo[["Title"]],Background->styleColor[["Background"]]] ]; (* ::Input:: *) (*QYMP;*) + + +(* ::Input:: *) +(*uiPlaylist["TH15-Kanjuden.qyl"];*) + + +(* ::Input:: *) +(*uiPlaylist["All"];*) diff --git a/library.wl b/library.wl index 775bdbe..eaf5293 100644 --- a/library.wl +++ b/library.wl @@ -84,7 +84,7 @@ generateMessage[tag_,arg_]:=completeText[errorDict[[tag]],arg]; caption[string_,style_]:=caption[string,style,{}]; caption[string_,style_,argument_]:=Style[ completeText[ - If[StringPart[string,1]=="_",text[[StringDrop[string,1]]],string], + If[StringLength@string>0&&StringPart[string,1]=="_",text[[StringDrop[string,1]]],string], argument], styleDict[[style]]]; diff --git a/style.json b/style.json index 4cf9d3f..616b263 100644 --- a/style.json +++ b/style.json @@ -3,5 +3,8 @@ "Title": {"FontSize": 32, "FontWeight": "Bold", "FontFamily": "微软雅黑"}, "TitleComment": {"FontSize": 32, "FontWeight": "Bold", "FontFamily": "微软雅黑", "FontColor": "Comment"}, "Subtitle": {"FontSize": 24, "FontWeight": "Bold", "FontFamily": "微软雅黑"}, - "BigTitle": {"FontSize": 40, "FontWeight": "Bold", "FontFamily": "微软雅黑"} + "BigTitle": {"FontSize": 40, "FontWeight": "Bold", "FontFamily": "微软雅黑"}, + "SongName": {"FontSize": 24, "FontFamily": "微软雅黑"}, + "SongIndex": {"FontSize": 22, "FontFamily": "微软雅黑", "FontColor": "Index"}, + "SongComment": {"FontSize": 22, "FontFamily": "微软雅黑", "FontColor": "Comment"} } \ No newline at end of file From 6ea83f2ae2a811241951cddb22179bbe83290c68 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sat, 13 Jan 2018 03:44:39 +0800 Subject: [PATCH 06/54] New Song: El Pollito Pio Also fixed a bug --- Meta/El_Pollito_Pio.meta | 7 +++++ Songs/El_Pollito_Pio.qys | 60 ++++++++++++++++++++++++++++++++++++++++ interface.wl | 23 ++++++++------- 3 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 Meta/El_Pollito_Pio.meta create mode 100644 Songs/El_Pollito_Pio.qys diff --git a/Meta/El_Pollito_Pio.meta b/Meta/El_Pollito_Pio.meta new file mode 100644 index 0000000..d87f9bf --- /dev/null +++ b/Meta/El_Pollito_Pio.meta @@ -0,0 +1,7 @@ +Format: qys; +TrackCount: 6; +Duration: 243559/1518; +Instruments: {"ElectricBass", "ElectricPiano"}; +Messages: ; +SongName: 小鸡哔哔; +Comment: El Pollito Pio; \ No newline at end of file diff --git a/Songs/El_Pollito_Pio.qys b/Songs/El_Pollito_Pio.qys new file mode 100644 index 0000000..958e3de --- /dev/null +++ b/Songs/El_Pollito_Pio.qys @@ -0,0 +1,60 @@ +//小鸡哔哔 + +<1=A><4/4> + +<1.0><120>\ +01$0%0%0%|0%0%0%0%|0%0%0%0%|0%0%%-3-\ +:66661'1'656---0---|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---\ + 66661'1'656---0---|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---:\ +<128>\ +:66661'1'656---6-6'-|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%\ + 7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---:\ +<132>\ +:66661'1'656---6-[16]'-|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%\ + 7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---:\ +<138>\ +:66661'1'6566666666|66661'1'6566666633|(2-)2'(2-)1'|(2-)7(2-)1'\ + (2-)7(2-)1'|(2-)7(2-)1'|(2-)7(2-)1'|7-%-%%%%6---[23]---:\ +<144>\ +:66661'1'6566666666|66661'1'6566666633|(2-)2'(2-)1'|(2-)7(2-)1'\ + (2-)7(2-)1'|(2-)7(2-)1'|(2-)7(2-)1'|(2-)7(2-)1'|7-%-%%%%6---[23]---:\ +66661'1'656---0---|66661'1'656-3'-%-%-|2'%%%1'%%%|7771'66[16]'-|| + +<1.0><120>\ +0---|0---|0---|0---\ +:1316,|1313|6-3-|5#-3-|5#-6m,5#,\ + 1316,|1313|6-3-|5#-3-|5#-6m,5#,:\ +<128>\ +:1316,|1313|6236|5#7,36|5#-3-|5#-6m,5#,:\ +<132>\ +:1316,|1313|6236|5#7,36|5#7,36|5#-3-|5#-6m,5#,:\ +<138>\ +:1316,|1313|6236|5#7,36|5#7,36|5#7,36|5#-3-|5#-6m,5#,:\ +<144>\ +:[13][36][13]6,|[13][36][13]3|[26][26][36][36]|[35#]7,[36]6\ + [35#]7,[36]6|[35#]-[36]-|[35#]7,[36]6|[35#]-[36]-|5#-6m,5#,:\ +1316,|1313|6-3-|5#-3-|| + +<1.0><120>\ +6o,03'5'6o,03'5'|6o,03'5'6o,03'5'|6o,03'5'6o,03'5'|6o,03'5'6o,06o,,-\ +:6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-\ + 6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-:\ +<128>\ +:6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-:\ +<132>\ +:6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-:\ +<138>\ +:6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-:\ +<144>\ +:6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-:\ +6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ +3o,3M'5#[75#']6o,1$'6o,-|| diff --git a/interface.wl b/interface.wl index 476dab1..1c2a3b8 100644 --- a/interface.wl +++ b/interface.wl @@ -66,7 +66,7 @@ uiPlayerControlsOld:={ Spacer[20], Button[text[["Stop"]],current["State"]="Stopped",ImageSize->80], Spacer[20], - Button[text[["Return"]],AudioStop[];DialogReturn[uiPlaylist[]],ImageSize->80] + Button[text[["Return"]],AudioStop[];DialogReturn[uiPlaylist],ImageSize->80] }] }; @@ -105,7 +105,7 @@ uiPlayerControlsNew:={ "MouseDown":>(style="Clicked";), "MouseUp":>(style="Default"; AudioStop[]; - DialogReturn[uiPlaylist[]]; + DialogReturn[uiPlaylist]; ) }] ] @@ -185,7 +185,7 @@ uiModifySong[song_]:=DynamicModule[{textInfo}, {Button[text[["Save"]],putTextInfo[song,textInfo],ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], Button[text[["Undo"]],textInfo=getTextInfo[song],ImageSize->150]}, {Button[text[["DeleteSong"]],DialogReturn[uiDeleteSong[song]],ImageSize->150], - Button[text[["Return"]],DialogReturn[uiPlaylist[]],ImageSize->150]} + Button[text[["Return"]],DialogReturn[uiPlaylist],ImageSize->150]} }],Spacer[{20,20}] },Center,ItemSize->Full,Spacings->1], Background->styleColor[["Background"]],WindowTitle->text[["ModifySong"]]]; @@ -209,10 +209,10 @@ uiAddSong:=DynamicModule[{songPath,textInfo,candidates}, InputField[Dynamic@textInfo[[#]],String], Spacer[40]}]&/@textInfoTags], Spacer[4], - Row[{Button[text[["Add"]],addSong[songPath,textInfo];DialogReturn[uiPlaylist[]], + Row[{Button[text[["Add"]],addSong[songPath,textInfo];DialogReturn[uiPlaylist], ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], Spacer[20], - Button[text[["Return"]],DialogReturn[uiPlaylist[]],ImageSize->150]}], + Button[text[["Return"]],DialogReturn[uiPlaylist],ImageSize->150]}], Spacer[{40,40}]},Center,ItemSize->Full,Spacings->1], Background->styleColor[["Background"]],WindowTitle->text[["AddSong"]]] ]; @@ -243,7 +243,7 @@ uiDeleteSong[song_]:=CreateDialog[Column[{"", Button[text[["Confirm"]], index=Delete[index,song]; DeleteFile[path<>"Meta\\"<>song<>".meta"]; - DialogReturn[uiPlaylist[]], + DialogReturn[uiPlaylist], ImageSize->100], Spacer[20], Button[text[["Return"]],DialogReturn[uiModifySong[song]],ImageSize->100] @@ -310,7 +310,7 @@ QYMP:=DynamicModule[{playlist="All"}, DynamicModule[{style="Default"}, EventHandler[Dynamic@button["Play",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";currentPlaylist=playlist;DialogReturn[uiPlaylist[]]) + "MouseUp":>(style="Default";currentPlaylist=playlist;DialogReturn[uiPlaylist]) }] ], Spacer[10], @@ -342,8 +342,7 @@ QYMP:=DynamicModule[{playlist="All"}, #->Row[{ Spacer[8], caption[playlistData[[#,"Title"]],"SongName"], - Row[{Spacer[24],caption[playlistData[[#,"Comment"]],"SongComment"]}], - + Row[{Spacer[24],caption[playlistData[[#,"Comment"]],"SongComment"]}] },ImageSize->{800,30}]&/@playlistListPaged[[page]], Appearance->"Vertical" ],Spacer[60]}],Spacer[1], @@ -354,7 +353,7 @@ QYMP:=DynamicModule[{playlist="All"}, ]; -uiPlaylist[]:=DynamicModule[{song,songList,playlistInfo,playlist}, +uiPlaylist:=DynamicModule[{song}, page=1; playlist=currentPlaylist; playlistInfo=playlistData[[playlist]]; @@ -432,8 +431,8 @@ uiPlaylist[]:=DynamicModule[{song,songList,playlistInfo,playlist}, (* ::Input:: *) -(*uiPlaylist["TH15-Kanjuden.qyl"];*) +(*currentPlaylist="TH15-Kanjuden.qyl";uiPlaylist;*) (* ::Input:: *) -(*uiPlaylist["All"];*) +(*currentPlaylist="All";uiPlaylist;*) From 0a60869597a115d525e37134dfe7b1c786648a19 Mon Sep 17 00:00:00 2001 From: Kouchya <312533284@qq.com> Date: Sat, 13 Jan 2018 16:49:58 +0800 Subject: [PATCH 07/54] Added a new song. Pandemonic Planet This marks the end of Touhou Kanjyuden series. Congratulations to me. --- Meta/Touhou/Pandemonic_Planet.meta | 9 + Songs/Touhou/Pandemonic_Planet.qys | 565 +++++++++++++++++++++++++++++ 2 files changed, 574 insertions(+) create mode 100644 Meta/Touhou/Pandemonic_Planet.meta create mode 100644 Songs/Touhou/Pandemonic_Planet.qys diff --git a/Meta/Touhou/Pandemonic_Planet.meta b/Meta/Touhou/Pandemonic_Planet.meta new file mode 100644 index 0000000..518d715 --- /dev/null +++ b/Meta/Touhou/Pandemonic_Planet.meta @@ -0,0 +1,9 @@ +Format: qys; +TrackCount: 20; +Duration: 228; +Instruments: {"BassDrum", "BassDrum2", "ChineseCymbal", "Clap", "ElectricBass", "ElectricGrandPiano", "EnglishHorn", "HiHatClosed", "Koto", "Maracas", "Snare", "Strings", "Violin", "Xylophone"}; +SongName: Pandemonic Planet; +Composer: ZUN; +Adapter: 触手猴 LittleRed; +Comment: パンデモニックプラネット; +Abstract: 东方绀珠传EX面BOSS曲 赫卡提亚·拉碧斯拉祖利主题曲; \ No newline at end of file diff --git a/Songs/Touhou/Pandemonic_Planet.qys b/Songs/Touhou/Pandemonic_Planet.qys new file mode 100644 index 0000000..eddc75e --- /dev/null +++ b/Songs/Touhou/Pandemonic_Planet.qys @@ -0,0 +1,565 @@ +//Pandemonic Planet(东方绀珠传EX面BOSS曲 赫卡提亚·拉碧斯拉祖利主题曲) +//ZUN 编曲 +//触手猴 LittleRed 改编 + +//------------------------------ Sec A ------------------------------ + +<4/4><180> + +<1=C><1.2>\ +1,#o`-5,#o`-|6,o-3,o4,#o`_%`_|5,#o-1#o-|2#o-6,o`7,#o`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +1#o_%_%_%_%_%_%_%_|%--^%_0_|| + +<1=C,,><0.7>\ +1,#o-5,#o-|6,o-3,o-|1#o_1'#_3'1#o_1'#_3'_6_|6,o_3'_6'_1''#_[7,57]#%,\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +<1=C,,,>1#o1'#_5#_[1#o]_%_%_%_|%_0_0--|| + +<1=C><0.3>\ +0---|0---|5,#_1#_35,#1#|2#-6,7,#\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#---|0---|| + +<1=C><0.5>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +0---|0---|| + +<1=C><0.7>\ +x-x-|x-x-|x-x-|x_x_x_x_xx__x__x__x__\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +xxx_x_x__x__x_|x00_x_x_x_|| + +<1=C><0.5>\ +0---|0---|x0x0|0--x__x__x__x__\ +0---|0---|0---|0---\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_\ +x_x_x_x_x_x_x_x_|x0--|| + +<1=C><0.6>\ +0---|0---|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0---|0---|| + +<1=C><0.6>\ +x---|0---|0---|x---^\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|| + +//------------------------------ Sec B ------------------------------ + +<4/4><180> + +<1=C,><1.5>\ +1#o-4#o`-|5o-7o`-|5#o-4#3|2#o-7,#o-\ +1#o-4#o`-|5o-7o`-|1'#o-7p5'#|[141']'#---\ +1#o-4#o`-|5o-7o`-|5#o-4#3|2#o-7,#o-\ +1#o-4#o`-|5o-7o`-|1'#o-[2#72'#]'-|[35#1'#3']'--4''#|| + +<1=C><0.8>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0--4'#_%_|| + +<1=C,,,><0.5>\ +1#o1'#1'#_[15]'#_1'#|51'#_5_5_1'#_5|63'_6_6_3'_6_6_|7#_7#_4'#_7#_7#_4'#_7#_7#_\ +1'#_1'#_5'#_1'#_1'#_5'#_1'#_1'#_|5_5_1'#_5_5_1'#_5|6__3'__66__3'__7o4'#|1'#_1'#_5'#_1'#_1'#_5'#_1'#_1'#_\ +1'#5'#_1'#_1'#_5'#_1'#_1'#_|5_5_1'#_5_5_1'#_5_5_|6_6_3'_6_6_3'_6_6_|7#_7#_4'#_7#_7#_4'#_7#_7#_\ +1'#_1'#_5'#_1'#_1'#_5'#_1'#_1'#_|5_5_1'#_5_5_1'#_5_5_|6_6_.3'__6_77'_4'#_|<1=C,,>1#_5#_1'#_3'_5'#_1''#.|| + +<1=C><0.4>\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x__x__x__x__x|| + +<1=C><0.3>\ +0x_0_0x_0_|0x_0_0_x_0_x_|0.x_0-|0x_0_0_x_0_x_\ +0x_0_0x_0_|0x_0_0_x_0_x_|0.x_0-|0x_0_0_x_0_x_\ +0.x_0x_0_|0x_0_0_x_0_x_|0.x_0-|0x_0_0_x_0_x_\ +0x_0_0x_0_|0x_0_0_x_0_x_|x0x0|0x_0_0_x_0_x_|| + +<1=C><0.1>\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|| + +//------------------------------ Sec C ------------------------------ + +<4/4><180> + +<1=C><1.5>\ +[75']7_5'_[64'#]6_4'#_|[53']5_3'_2'#_1'_7_6_|7__1'__7__1'__7--^|%-^%_[72'#]_3'_4'#_\ +[73'5']-[62'4'#6']_.5'_.4'#_|3'_.2'_.7_6-|7_5_6_4#_2'_6_7|[53']--3'_4'#_\ +[75']7_5'_[64'#]6_4'#_|[53']5_3'_2'#_1'_7_6_|7__1'__7__1'__7--^|%-^%_[72'#]_3'_4'#_\ +[73'5']-[62'4'#6']_.5'_.4'#_|[23]'_.2'_.7_6-|7_5_6_4#_2'_6_7|[53']---^\ +%---^|%---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|| + +<1=Eb><1.2>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +1,#o`-5,#o`-|6,o-3,o4,#o`_%`_|5,#o-1#o-|2#o-6,o`7,#o`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +<1=bD>[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +1#o_%_%_%_%_%_%_%_|%--^%_0_|| + +<1=Eb,,><0.7>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +1,#o-5,#o-|6,o-3,o-|1#o_1'#_3'1#o_1'#_3'_6_|6,o_3'_6'_1''#_[7,57]#%,\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +<1=bD,,>1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +<1=bD,,,>1#o1'#_5#_[1#o]_%_%_%_|%_0_0--|| + +<1=C,,><0.9>\ +3_7_3'2_6_2'|1'_5_1'0_[242']#%_|3_7_3'4'#_2'_4'#|5_2'_5'_[242']#2#_[2,4,2]#\ +3,_7,_34,#_.2_.4#_|5_.2_.5_6,_3_6_3_|5,o5_2_6,o6_3_|3,o3_[3573']3_7,\ +<1=C,,,>3p%0_%%_|1p1'_5'_0_2#o%_|3(2=)3'34#_4'#_4#|5_2'_5'_2#o[242']'#.\ +3(2=)3'34#o_.2'_.4'#_|5o_.2'_.5'_6p6_[36]'_|5o5'_2'_6o6'_3'_|3o3'_[3573']'.3_7_\ +<1=Eb,,>0---|0---|5,#_1#_35,#1#|2#-6,7,#\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +<1=bD,,>1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#---|0---|| + +<1=C,><0.8>\ +[735']-4'#-|3'-2'#-|7_1'_7--^|%-^%_2'#_3'_4'#_\ +5'-6'_.5'_.4'#_|3'_.2'_.7_6-|7_5_6_4#_2'_6_7|3'---\ +[75']-[64'#]-|[53']-[42']#-|7_1'_7--^|%-^%_2'#_3'_4'#_\ +[75]'-[66']_.5'_.4'#_|3'_.2'_.7_6-|7_5_6_4#_2'_6_7|[53']---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|| + +<1=C'><0.4>\ +0---|0---|7'__1''__7'__1''__70-|0---\ +0---|0---|0---|0---\ +0---|0---|7'__1''__7'__1''__70-|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|| + +<1=Eb><0.5>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +<1=bD>1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +0---|0---|| + +<1=C><0.7>\ +x__x__x__x__0x-|x.x_xx|xxxx|xx0x_x__x__\ +x-x-|x.x_xx|xxxx|xx0_x__x__x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x-x-|x-x-|x-x-|x_x_x_x_xx__x__x__x__\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +xxx_x_x__x__x_|x00_x_x_x_|| + +<1=C><0.5>\ +x---|0---|0---|00_x_0-\ +0---|0---|0---|00_x_0-\ +0x0x|0x0_x_0_x_|0x0x|0x0_x_0_x__x__\ +x__x__x__x__x0x|0x0_x_0_x_|0x0x|0x__x__x__x__x_x_x_x_\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|| + +<1=C><0.5>\ +x---|0---|0---|0---\ +0---|0---|0---|0---\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0---|0---|x0x0|0--x__x__x__x__\ +0---|0---|0---|0---\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_\ +x_x_x_x_x_x_x_x_|x0--|| + +<1=C><0.6>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0---|0---|| + +<1=C><0.4>\ +x---|0---|0---|0---\ +0---|0---|0---|0---\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|0---|x---^\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|| + +//------------------------------ Sec D ------------------------------ + +<4/4><180> + +<1=Db,><1.5>\ +1#o-4#o`-|5o-7o`-|5#o-4#3|2#o-7,#o-\ +1#o-4#o`-|5o-7o`-|1'#o-7p5'#|[141']'#---\ +1#o-4#o`-|5o-7o`-|5#o-4#3|2#o-7,#o-\ +1#o-4#o`-|5o-7o`-|1'#o-[2#72'#]'-|[35#1'#3']'--4''#|| + +<1=Db><0.8>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0--4'#_%_|| + +<1=Db,,,><0.5>\ +1#o1'#1'#_[15]'#_1'#|51'#_5_5_1'#_5|63'_6_6_3'_6_6_|7#_7#_4'#_7#_7#_4'#_7#_7#_\ +1'#_1'#_5'#_1'#_1'#_5'#_1'#_1'#_|5_5_1'#_5_5_1'#_5|6__3'__66__3'__7o4'#|1'#_1'#_5'#_1'#_1'#_5'#_1'#_1'#_\ +1'#5'#_1'#_1'#_5'#_1'#_1'#_|5_5_1'#_5_5_1'#_5_5_|6_6_3'_6_6_3'_6_6_|7#_7#_4'#_7#_7#_4'#_7#_7#_\ +1'#_1'#_5'#_1'#_1'#_5'#_1'#_1'#_|5_5_1'#_5_5_1'#_5_5_|6_6_.3'__6_77'_4'#_|<1=Db,,>1#_5#_1'#_3'_5'#_1''#.|| + +<1=C><0.4>\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x__x__x__x__x|| + +<1=C><0.3>\ +0x_0_0x_0_|0x_0_0_x_0_x_|0.x_0-|0x_0_0_x_0_x_\ +0x_0_0x_0_|0x_0_0_x_0_x_|0.x_0-|0x_0_0_x_0_x_\ +0.x_0x_0_|0x_0_0_x_0_x_|0.x_0-|0x_0_0_x_0_x_\ +0x_0_0x_0_|0x_0_0_x_0_x_|x0x0|0x_0_0_x_0_x_|| + +<1=C><0.1>\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|| + +//------------------------------ Sec E ------------------------------ + +<4/4><180> + +<1=Db><1.5>\ +[75']7_5'_[64'#]6_4'#_|[53']5_3'_2'#_1'_7_6_|7__1'__7__1'__7--^|%-^%_[72'#]_3'_4'#_\ +[73'5']-[62'4'#6']_.5'_.4'#_|3'_.2'_.7_6-|7_5_6_4#_2'_6_7|[53']--3'_4'#_\ +[75']7_5'_[64'#]6_4'#_|[53']5_3'_2'#_1'_7_6_|7__1'__7__1'__7--^|%-^%_[72'#]_3'_4'#_\ +[73'5']-[62'4'#6']_.5'_.4'#_|[23]'_.2'_.7_6-|7_5_6_4#_2'_6_7|[53']---^|| + +<1=Db,,><0.7>\ +3_7_3'2_6_2'|1'_5_1'0_[242']#%_|3_7_3'4'#_2'_4'#|5_2'_5'_[242']#2#_[2,4,2]#\ +3,_7,_34,#_.2_.4#_|5_.2_.5_6,_3_6_3_|5,o5_2_6,o6_3_|3,o3_[3573']3_7,\ +<1=Db,,,>3p%0_%%_|1p1'_5'_0_2#o%_|3(2=)3'34#_4'#_4#|5_2'_5'_2#o[242']'#.\ +3(2=)3'34#o_.2'_.4'#_|5o_.2'_.5'_6p6_[36]'_|5o5'_2'_6o6'_3'_|3o3'_[3573']'.3_7_|| + +<1=Db,><0.8>\ +[735']-4'#-|3'-2'#-|7_1'_7--^|%-^%_2'#_3'_4'#_\ +5'-6'_.5'_.4'#_|3'_.2'_.7_6-|7_5_6_4#_2'_6_7|3'---\ +[75']-[64'#]-|[53']-[42']#-|7_1'_7--^|%-^%_2'#_3'_4'#_\ +[75]'-[66']_.5'_.4'#_|3'_.2'_.7_6-|7_5_6_4#_2'_6_7|[53']---|| + +<1=Db'><0.4>\ +0---|0---|7'__1''__7'__1''__70-|0---\ +0---|0---|0---|0---\ +0---|0---|7'__1''__7'__1''__70-|0---\ +0---|0---|0---|0---|| + +<1=C><0.7>\ +x__x__x__x__0x-|x.x_xx|xxxx|xx0x_x__x__\ +x-x-|x.x_xx|xxxx|xx0_x__x__x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|| + +<1=C><0.5>\ +x---|0---|0---|00_x_0-\ +0---|0---|0---|00_x_0-\ +0x0x|0x0_x_0_x_|0x0x|0x0_x_0_x__x__\ +x__x__x__x__x0x|0x0_x_0_x_|0x0x|0x__x__x__x__x_x_x_x_|| + +<1=C><0.5>\ +x---|0---|0---|0---\ +0---|0---|0---|0---\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|| + +<1=C><0.4>\ +x---|0---|0---|0---\ +0---|0---|0---|0---\ +x---|0---|x---|0---\ +x---|0---|x---|0---|| + +//------------------------------ Sec F ------------------------------ + +<4/4><180> + +<1=Db><1.0>\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|5,#o-0-|0---|| + +<1=Db><1.2>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|5,#o-0-|0---|| + +<1=Db,,><0.6>\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|5,#p`0--|0---|| + +<1=Db,,><0.5>\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`0--|<1=C,,b>0-2#__7,__5,__2#__7,__3__2#__3__|| + +<1=Db><0.5>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`0--|0---|| + +<1=C><0.8>\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x0--|0-x_x__x__x__x__x__x__|| + +<1=C><0.5>\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|x0--|0---|| + +<1=C><0.4>\ +0x0x|0x0x|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0x0x|0x0x|0x0x|0---|0---|| + +<1=C><0.3>\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|x---|x---|0---|| + +//------------------------------ Sec G ------------------------------ + +<4/4><180> + +<1=Cb><2.0>\ +3o-4#o-|7o-6o_7o_2#o|3o4#o5o6o_2'o_|[75'7'].[2#62'#]'.^%\ +3'o-7o-|6o-5o_6o_4#o_2#o_|3o6o7o2'o|[363']'---\ +3o-4#o-|7o-6o_7o_2#o|3o4#o5o6o_2'o_|[75'7'].[2#62'#]'.^%\ +3'o-7o-|6o-5o_6o_4#o_2#o_|3o6o7o2'o|[363']'---\ +<1=C>3o-4#o-|7o-6o_7o_2#o|3o4#o5o6o_2'o_|[75'7'].[2#62'#]'.^%\ +3'o-7o-|6o-5o_6o_4#o_2#o_|3o6o7o2'o|[363']'---\ +3o-4#o-|7o-6o_7o_2#o|3o4#o5o6o_2'o_|[75'7'].[2#62'#]'.^%\ +3'o-7o-|6o-5o_6o_4#o_2#o_|3o6o7o2'o|[363']'---^\ +%---^|%---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|| + +<1=Eb><1.8>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +1,#o`-5,#o`-|6,o-3,o4,#o`_%`_|5,#o-1#o-|2#o-6,o`7,#o`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +<1=bD>[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`|[1#31'#]`[35#]`[2#6]`[27]#`|[31'#]`[35#]`[2#6]`[27]#`\ +1#o_%_%_%_%_%_%_%_|%--^%_0_|| + +<1=Cb><1.0>\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +<1=C>3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +3'__7__5__2'__6__3'__7__4'#__1'__5'__2'__6'__3'__7'__5'__2''__|3''__7'__2''__6'__7'__5'__6'__4'#__5'__3'__4'#__6__7__5__6__4#__\ +<1=Eb,,>1,#o-5,#o-|6,o-3,o-|1#o_1'#_3'1#o_1'#_3'_6_|6,o_3'_6'_1''#_[7,57]#%,\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +<1=bD,,>1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#|1,#o[15]#_1'#_7,#_7#_[7,4]#_7#_|[15]#(1=)1'#-[7,4]#_7#_[7,47]#\ +<1=bD,,,>1#o1'#_5#_[1#o]_%_%_%_|%_0_0--|| + +<1=Cb,,><1.0>\ +3,o3_[35]'_2o2_[24#]'_|1o1_[13]'_2#o2'#_7_|3,o3,_[35]_4,#o4#_2_|5,o5,p_2,#o2#_2'#_7_\ +3,o3,_[35]_4,#o4,#_[4#6]_|5,o5,_[57]_6,o%|5,o5,_[57]_6,o6_3_|3,o3_[3573'].3,o\ +3,o3_[35]'_2o2_[24#]'_|1o1_[13]'_2#o2'#_7_|3,o3,_[35]_4,#o4#_2_|5,o5,p_2,#o2#_2'#_7_\ +3,o3,_[35]_4,#o4,#_[4#6]_|5,o5,_[57]_6,o%|5,o5,_[57]_6,o6_3_|3,o3_[3573'].3,o\ +<1=C,,>3,o3_[35]'_2o2_[24#]'_|1o1_[13]'_2#o2'#_7_|3,o3,_[35]_4,#o4#_2_|5,o5,p_2,#o2#_2'#_7_\ +3,o3,_[35]_4,#o4,#_[4#6]_|5,o5,_[57]_6,o%|5,o5,_[57]_6,o6_3_|3,o3_[3573'].3,o\ +3,o3_[35]'_2o2_[24#]'_|1o1_[13]'_2#o2'#_7_|3,o3,_[35]_4,#o4#_2_|5,o5,p_2,#o2#_2'#_7_\ +3,o3,_[35]_4,#o4,#_[4#6]_|5,o5,_[57]_6,o%|5,o5,_[57]_6,o6_3_|3,o3_[3573'].3,o\ +<1=Eb,,>0---|0---|5,#_1#_35,#1#|2#-6,7,#\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +<1=bD,,>1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#---|0---|| + +<1=Eb><0.7>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +<1=bD>1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_|1#`_3`_5#`_3`_6`_3_7#`_3`_\ +0---|0---|| + +<1=C><0.8>\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|x__x__x__x__x__x__x__x__x__x__x__x__x_x_\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|x__x__x__x__x__x__x__x__x__x__x__x__x_x_\ +x-x-|x-x-|x-x-|x_x_x_x_xx__x__x__x__\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_|x_x_x_x__x__x__x__x__x__x_x_\ +xxx_x_x__x__x_|x0--|| + +<1=C><0.7>\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0---|0---|x0x0|0--x__x__x__x__\ +0---|0---|0---|0---\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_\ +0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_|0x_0_0x_0_\ +x_x_x_x_x_x_x_x_|x0--|| + +<1=C><0.74>\ +xxxx|xxxx|xxxx|xxx__x__x_x_x_\ +xxxx|xxxx|xxxx|xxx__x__x_x_x_\ +xxxx|xxxx|xxxx|xxx__x__x_x_x_\ +x__x__x_xxx|xxxx|xxxx|xxx__x__x_x_x_\ +xxxx|xxxx|xxxx|xxx__x__x_x_x_\ +xxxx|xxxx|xxxx|xxx__x__x_x_x_\ +xxxx|xxxx|xxxx|xxx__x__x_x_x_\ +x__x__x_xxx|xxxx|xxxx|xxx__x__x_x_x_\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|| + +<1=C><0.6>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0x0x|0x0x|0x0x|0x0x\ +0---|0---|| + +<1=C><0.4>\ +x---|0---|0---|0---\ +x---|0---|0---|0---\ +x---|0---|0---|0---\ +x---|0---|0---|0---\ +x---|0---|0---|0---\ +x---|0---|0---|0---\ +x---|0---|0---|0---\ +x---|0---|0---|0---\ +x---|0---|0---|x---^\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|| \ No newline at end of file From 07b577606a04c99a74917632e16750f5b2be0ebb Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sat, 13 Jan 2018 19:48:46 +0800 Subject: [PATCH 08/54] Add song "Pandemonic Planet" into playlist "TH15" --- Meta/Touhou/{ => TH15-Kanjuden}/Pandemonic_Planet.meta | 0 Playlists/TH15-Kanjuden.qyl | 3 ++- Songs/Touhou/{ => TH15-Kanjuden}/Pandemonic_Planet.qys | 0 3 files changed, 2 insertions(+), 1 deletion(-) rename Meta/Touhou/{ => TH15-Kanjuden}/Pandemonic_Planet.meta (100%) rename Songs/Touhou/{ => TH15-Kanjuden}/Pandemonic_Planet.qys (100%) diff --git a/Meta/Touhou/Pandemonic_Planet.meta b/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta similarity index 100% rename from Meta/Touhou/Pandemonic_Planet.meta rename to Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta diff --git a/Playlists/TH15-Kanjuden.qyl b/Playlists/TH15-Kanjuden.qyl index 410128a..ab21186 100644 --- a/Playlists/TH15-Kanjuden.qyl +++ b/Playlists/TH15-Kanjuden.qyl @@ -16,7 +16,8 @@ {"Index": "五面BOSS曲", "Song": "Seijyouki_no_Pierrot"}, {"Index": "六面道中曲", "Song": "Kokyou_Hoshi_Utsuru_Umi"}, {"Index": "六面BOSS曲", "Song": "Pure_Furies"}, - {"Index": "EX面道中曲", "Song": "Akumu_no_Sekai"} + {"Index": "EX面道中曲", "Song": "Akumu_no_Sekai"}, + {"Index": "EX面BOSS曲", "Song": "Pandemonic_Planet"} ], "IndexWidth": 160, "HomeDisplay": true diff --git a/Songs/Touhou/Pandemonic_Planet.qys b/Songs/Touhou/TH15-Kanjuden/Pandemonic_Planet.qys similarity index 100% rename from Songs/Touhou/Pandemonic_Planet.qys rename to Songs/Touhou/TH15-Kanjuden/Pandemonic_Planet.qys From 60ccf284e2965de63a6a0e050314b287cf7f2c12 Mon Sep 17 00:00:00 2001 From: Kouchya <312533284@qq.com> Date: Sat, 13 Jan 2018 23:06:11 +0800 Subject: [PATCH 09/54] Added a new song. Houkainohi This is a Touhou BGM with a totally different form of music construction from any other Touhou BGM added in QYMP. And what's more, there isn't a single score of this song on the Internet, which means I composed this totally on my own, without any reference. (P.S. I wrote some trivial inputs in QYMP.wl in this commit.) --- Meta/Touhou/Houkainohi.meta | 9 ++ QYMP.wl | 12 +- Songs/Touhou/Houkainohi.qys | 283 ++++++++++++++++++++++++++++++++++++ 3 files changed, 300 insertions(+), 4 deletions(-) create mode 100644 Meta/Touhou/Houkainohi.meta create mode 100644 Songs/Touhou/Houkainohi.qys diff --git a/Meta/Touhou/Houkainohi.meta b/Meta/Touhou/Houkainohi.meta new file mode 100644 index 0000000..3657db7 --- /dev/null +++ b/Meta/Touhou/Houkainohi.meta @@ -0,0 +1,9 @@ +Format: qys; +TrackCount: 0; +Duration: 112; +Instruments: {"BassDrum2", "BlownBottle", "Cello", "HiHatPedal", "MuteSurdo", "NewAge", "Piano", "Strings", "SynthBass", "Taiko", "Timpani"}; +SongName: 法界之火; +Composer: ZUN; +Adapter: LittleRed; +Comment: 法界の火; +Abstract: 东方星莲船6面道中曲; \ No newline at end of file diff --git a/QYMP.wl b/QYMP.wl index ab58f3b..7705d02 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -133,11 +133,15 @@ QYMP; (* ::Input:: *) -(*AudioStop[];AudioPlay@QYSParse[path<>"Songs\\Shionari.qys"];*) +(*AudioStop[];AudioPlay@QYSParse[path<>"Songs\\Touhou\\Houkainohi.qys"];*) (* ::Input:: *) -(*Options[QYSParse[path<>"Songs\\Touhou\\Phantom_Ensemble.qys"]]*) +(*AudioStop[];AudioPlay@QYSParse[path<>"Songs\\test.qys"];*) + + +(* ::Input:: *) +(*Options[QYSParse[path<>"Songs\\Touhou\\Houkainohi.qys"]]*) (* ::Input:: *) @@ -145,8 +149,8 @@ QYMP; (* ::Input:: *) -(*EmitSound@Sound@SoundNote[12,1,"Harp"]*) +(*EmitSound@Sound@SoundNote[23,.5,"Halo"]*) (* ::Input:: *) -(*EmitSound@Sound@SoundNote["RideCymbal"]*) +(*EmitSound@Sound@SoundNote["PanFlute"]*) diff --git a/Songs/Touhou/Houkainohi.qys b/Songs/Touhou/Houkainohi.qys new file mode 100644 index 0000000..212b639 --- /dev/null +++ b/Songs/Touhou/Houkainohi.qys @@ -0,0 +1,283 @@ +//法界之火(东方星莲船6面道中曲) +//ZUN 曲 +//LittleRed 改编 + +<4/4><180> + +<1=C><0.7>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0--3'_4'#_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_3'_|0[42']#--\ +<1=A,>[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_3'_|[42']#---\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_3'_|[42']#---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---|| + +<1=C><2.0>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%`_4'#_2'_6_5_4#_2'_3'_|[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%`_4'#_2'_6_5_4#_2'_3'_\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%`_4'#_2'_6_5_4#_2'_3'_|[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%`_4'#_2'_6_5_4#_2'_4'#_\ +[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[72'']`|[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[73'']`\ +[57'].`[56'].`[57']^|%`_0_[56']`[57']`[52'']`|[57'].`[56'].`[57']^|%_[4#2'#6']-^%_3'_4'#_\ +<1=A>[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[72'']`|[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[73'']`\ +[57'].`[56'].`[57']^|%`_0_[56']`[57']`[52'']`|[57'].`[56'].`[57']|[4#2'#6']--5'_6'_\ +[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[72'']`|[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[73'']`\ +[57'].`[56'].`[57']^|%`_0_[56']`[57']`[52'']`|[57'].`[56'].`[57']|[4#2'#6']---^\ +%---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---|| + +<1=C,,><0.6>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +[73']`-%_6'_2''_[73'3'']_^|%.[73']-%_^|%.%-%_^|%.%-^%_\ +%.%.%^|%_%.%%|%.%.%^|%_%.%%\ +[53'].%.%^|%_%.%%|%.%.%^|%_[42']#.%%\ +[73'].%.%^|%_%.%%|%.%.%^|%_%.%%\ +[53'].%.%^|%_%.%%|%.%.%^|%_[42']#.%%\ +[73'].%.%^|%_%.%%|%.%.%^|%_%.%%\ +[53'].%.%^|%_%.%%|%.%.%^|%_[42']#.%%\ +[73'].%.%^|%_%.%%|%.%.%^|%_%.%%\ +[53'].%.%^|%_%.%%|%.%.%^|%_[42']#.%%\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\|| + +<1=C><0.4>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +7---^|%---^|%62'4'#|6'-2''-\ +3'`--[24#]'^|%`-3'-^|%`2'--^|%---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +<1=A,>7---^|%---^|%62'4'#|6'-2''-\ +3'`--[24#]'^|%`-3'-^|%`2'--^|%---\ +7---^|%---^|%62'4'#|6'-2''-\ +3'`--[24#]'^|%`-3'-^|%`2'--^|%---^\ +%---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---|| + +<1=C><0.6>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +[357]'---^|%---^|%---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---|| + +<1=C><0.6>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +[357]'---^|%---|0---|0---|| + +<1=C><1.0>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +[37]'---^|%---^|%---|[4#6]'-[62']'-\ +3'p---^|%---|0---|4'#-6'-\ +[37]'---^|%---^|%---|[4#6]'-[62']'-\ +3'p---^|%---|0---|4'#-6'-\ +[37]'---^|%---^|%---|[4#6]'-[62']'-\ +3'p---^|%---|0---|4'#-6'-\ +[37]'---^|%---^|%---|[4#6]'-[62']'-\ +3'p---^|%---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---|| + +<1=C><0.5>\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|22--|22--\ +22--|22--|0---|0---|| + +<1=C><0.7>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0\ +0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0\ +[5,4#]_0_0[5,4#]_0[5,4#]_|0.[5,4#]_0.[5,4#]_|0.[5,4#]_0.[5,4#]_|0.[5,4#]_[5,4#]_0.\ +0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0\ +0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0\ +0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0\ +0-[5,4#]_0_0|0-[5,4#]_0_0|0-[5,4#]_0_0|0[5,4#]_0_[5,4#]_0_[5,4#]_0_\ +%.%.%^|%_%.%%|%.%.%^|%_%.%%\ +%.%.%^|%_%.%%|%.%.%^|%_%.%%\ +%.%.%^|%%%%|%.%.%^|%%%%\ +%.%.%^|%%%%|%.%.%^|%---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +%.%.%^|%%%%|%.%.%^|%%%%\ +%.%.%^|%%%%|%.%.%^|%---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---|| + +<1=C><0.6>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0x_x_x_x_x_x_\ +0---|0---|0---|0---\ +x0--|x0--|x0--|x0--\ +x0--|x0--|x0--|x0--\ +x0--|x0--|x0--|x0--\ +x0--|x0--|x0--|0_x_x_x_xx_x_\ +x0--|x0--|x0--|x0--\ +x0--|x0--|x0--|x0--\ +x_x_0--|x_x_0--|x_x_0--|x_x_0--\ +x_x_0--|x_x_0--|x_x_0--|x_x_0--\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +x_x_0--|x_x_0--|x_x_0--|x_x_0--\ +x_x_0--|x_x_0--|x_x_0--|x_x_0--\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---|| + +<1=C><0.8>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0-xx_x_\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +x---|x---|x---|x---\ +x---|x---|x---|x---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---|| + +<1=C><0.4>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +x-x-|x-x-|x-x-|x-xx_x_\ +x-x-|x-x-|x-x-|x-x-\ +x-x-|x-x-|x-x-|x-x-\ +x.x__x__x-|x.x__x__x-|x.x__x__x-|x.x__x__x-\ +x.x__x__x-|x.x__x__x-|x.x__x__x-|x.x__x__x-\ +x.x__x__x-|x.x__x__x-|x.x__x__x-|x.x__x__x-\ +x.x__x__x-|x.x__x__x-|x.x__x__x-|x.x__x__x-\ +x.x__x__x-|x.x__x__x-|x.x__x__x-|x.x__x__x-\ +x.x__x__x-|x.x__x__x-|x.x__x__x-|x.x__x__x-\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x0--\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x0--\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---|| + + \ No newline at end of file From e904e491ad9340bd5ebc37476b88216eece47a71 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sun, 14 Jan 2018 00:50:34 +0800 Subject: [PATCH 10/54] =?UTF-8?q?New=20Song=EF=BC=9A=E5=90=8C=E3=81=98?= =?UTF-8?q?=E9=AB=98=E3=81=BF=E3=81=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add fix a serious duration bug --- Meta/Onaji_Takami_he.meta | 8 +++++ Playlists/Clannad.qyl | 3 +- Playlists/Piano.qyl | 1 + Songs/Onaji_Takami_he.qys | 69 +++++++++++++++++++++++++++++++++++++++ qysParse.wl | 8 ++--- 5 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 Meta/Onaji_Takami_he.meta create mode 100644 Songs/Onaji_Takami_he.qys diff --git a/Meta/Onaji_Takami_he.meta b/Meta/Onaji_Takami_he.meta new file mode 100644 index 0000000..3f3821b --- /dev/null +++ b/Meta/Onaji_Takami_he.meta @@ -0,0 +1,8 @@ +Format: qys; +TrackCount: 6; +Duration: 116; +Instruments: {"BrightPiano", "Piano"}; +Messages: ; +SongName: 到相同的高度; +Composer: 鷹石忍; +Comment: 同じ高みへ; \ No newline at end of file diff --git a/Playlists/Clannad.qyl b/Playlists/Clannad.qyl index fe100d4..b8a97b1 100644 --- a/Playlists/Clannad.qyl +++ b/Playlists/Clannad.qyl @@ -6,8 +6,9 @@ "SongList": [ {"Song": "Nagisa"}, {"Song": "Shionari"}, + {"Song": "Onaji_Takami_he"}, {"Song": "Sora_ni_Hikaru"} ], "IndexWidth": 0, - "HomeDisplay": false + "HomeDisplay": true } \ No newline at end of file diff --git a/Playlists/Piano.qyl b/Playlists/Piano.qyl index 58753ac..f50f16c 100644 --- a/Playlists/Piano.qyl +++ b/Playlists/Piano.qyl @@ -9,6 +9,7 @@ {"Song": "If_You_Were_By_My_Side"}, {"Song": "Lonely_Night"}, {"Song": "Sora_ni_Hikaru"}, + {"Song": "Onaji_Takami_he"}, {"Song": "Touhou\\Necro_Fantasia"} ], "IndexWidth": 0, diff --git a/Songs/Onaji_Takami_he.qys b/Songs/Onaji_Takami_he.qys new file mode 100644 index 0000000..1a78763 --- /dev/null +++ b/Songs/Onaji_Takami_he.qys @@ -0,0 +1,69 @@ +//同じ高みへ + +<1=E><120><4/4> + +<1.0>5-1'-\ +[62'].1'.3'^|%---|[62'].1'.3'^|%---\ +[42'].1'.3'^|%---|[37].1'.5^|%--0\ +[462'].1'.[63']^|%---|[352'].1'.[52']_3'_^|%---\ +[462'].1'.[463']^|%-[41']2|3m.[351'].[51']^|%-2o5o\ +[141']'.2p'.%^|%---|[141']'.2o'.5o'_3o'_^|%---\ +[141']'.2p'.%^|%---|[75'7'].1o'.[535']^|%---\ +[41'].[62'].%^|%---|[51'].[42'].[75']_[13]'_^|%---\ +[41'].[42'].%^|%---|[27].[31'].[51']^|%-0-\ +<5/8>\ +0----|0----|0----|0----\ +0----|0----|0----|0--71'\ +5--5-|5--71'|5--5-|3--71'\ +7--7-|1'--2'3'|2'--1'-|3'--71'\ +5'--5'-|3'--71'|5'--5'-|[27]'--[31']'-\ +[57]'--2'-|1'--71'|5--5-|1-1_2_3_4_5\ +[57].1'.53|[51']--7-|71'-5.4_|3--7-\ +72_3_4_5_61'|2'(3~)1'_2'_1'_753|2'521'5|3'--71'\ +[75']-1'[75']2'|3'5'1'2'1'|5'1'2'1'_2'_7_1'_|7'_2'_1'7[31']'1'\ +[13^7]'--[35]2'|1'--2'-|[53']-^%_4'_3'-|[13]'----\ +| + +<0.6>0---\ +215,215,21|5,215,215,1|215,215,21|5,215,5215,\ +215,215,21|5,215,215,1|215,215,12|5,17,---0-\ +215,215,21|5,215,215,1|215,215,21|5,215,5215,\ +215,215,21|5,215,215,1|215,215,12|351'2'0---\ +12512512|5125(7^)1'752|12512512|52'1'5(7^)1'752\ +12512512|51251'525|12512512|51251-2-\ +12512512|5125(7^)1'752|12512512|52'1'5(7^)1'752\ +12512512|51251'525|12512512|52'3'5'1''-0-\ +<5/8>\ +231[35]1|231[35]1|231[35]1|231[35]1\ +231[35]1|231[35]1|231[35]1|231[35]1\ +231[35]1|231[35]1|231[35]1|231[35]1\ +231[35]1|231[35]1|231[35]1|231[35]1\ +231[35]1|231[35]1|231[35]1|231[35]1\ +231[35]1|231[35]1|231[35]1|23[5,1]0-\ +231[35]1|231[35]1|231[35]1|231[35]1\ +231[35]1|231[35]1|231[35]1|231[35]1\ +231[35]1|231[35]1|231[35]1|231[35]1\ +231[35]1|231[35]1|231[35]1|23[5,1]--\ +| + +<0.8>0---\ +4o---^|%---|3o---^|%---\ +2o---^|%---|1o---^|%---\ +4o---^|%_4.5-|3o---^|%_4.1'2'\ +2o---^|%_3.71'|1o---^|%---\ +4o---^|%_4.5-|6o---^|%_4.1'2'\ +4o---^|%_3.71'|1o---^|%---\ +4o---^|%_4.5-|6o---^|%_4.1'2'\ +2o---^|%_3.71'|1o---^|%---\ +<5/8>\ +6----|4----|5----|1'----\ +6----|4----|5----|1'----\ +6----|4----|5----|1'----\ +6----|4----|5----|1'----\ +6----|4----|5----|1'----\ +6----|4----|5----|1'--0-\ +6----|4----|5----|1'----\ +6----|4----|5----|1'----\ +6----|4----|5----|1'----\ +6----|4----|5----|1'-0--\ +| diff --git a/qysParse.wl b/qysParse.wl index f0690b9..89df84d 100644 --- a/qysParse.wl +++ b/qysParse.wl @@ -201,7 +201,7 @@ track[score_,global_,location_]:=Module[ If[tercet>0,beatCount*=tercetTime;tercet--]; beatCount*=2^(-parameter[["Dur"]]); barBeat+=beatCount; - duration=15/parameter[["Speed"]]*beatCount*parameter[["Beat"]]; + duration=240/parameter[["Speed"]]*beatCount/parameter[["Beat"]]; trackDuration+=duration; Which[ percussion, @@ -240,18 +240,18 @@ track[score_,global_,location_]:=Module[ If[appoggiatura!={}, If[Length@appoggiatura<4, beatCount-=Length@appoggiatura*parameter[["Appo"]]/4; - duration=15/parameter[["Speed"]]*parameter[["Appo"]]/4*parameter[["Beat"]]; + duration=240/parameter[["Speed"]]*parameter[["Appo"]]/4/parameter[["Beat"]]; Do[ AppendTo[soundData,{appoggiatura[[k]],duration,parameter[["Instr"]]}], {k,Length@appoggiatura}], beatCount-=parameter[["Appo"]]; - duration=15/parameter[["Speed"]]*parameter[["Appo"]]/Length@appoggiatura*parameter[["Beat"]]; + duration=240/parameter[["Speed"]]*parameter[["Appo"]]/Length@appoggiatura/parameter[["Beat"]]; Do[ AppendTo[soundData,{appoggiatura[[k]],duration,parameter[["Instr"]]}], {k,Length@appoggiatura}]; ]; appoggiatura={}; - duration=15/parameter[["Speed"]]*beatCount*parameter[["Beat"]]; + duration=240/parameter[["Speed"]]*beatCount/parameter[["Beat"]]; ]; lastBeat=beatCount; If[!pitch===None,lastPitch=pitch]; From 8b56e50204dbcbd2d6d64b47e75c8cfe943f05ef Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sun, 14 Jan 2018 10:53:50 +0800 Subject: [PATCH 11/54] New Playlist: TH11-Chireiden MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 准备开新坑2333 --- .gitignore | 3 ++- .../Hartmann_No_Youkai_Otome.meta | 0 .../{ => TH11-Chireiden}/Ryokugann_No_Jealousy.meta | 0 Playlists/TH11-Chireiden.qyl | 12 ++++++++++++ .../Hartmann_No_Youkai_Otome.qys | 0 Songs/Touhou/{ => TH11-Chireiden}/Nuclear_Fusion.qys | 0 .../{ => TH11-Chireiden}/Ryokugann_No_Jealousy.qys | 0 7 files changed, 14 insertions(+), 1 deletion(-) rename Meta/Touhou/{ => TH11-Chireiden}/Hartmann_No_Youkai_Otome.meta (100%) rename Meta/Touhou/{ => TH11-Chireiden}/Ryokugann_No_Jealousy.meta (100%) create mode 100644 Playlists/TH11-Chireiden.qyl rename Songs/Touhou/{ => TH11-Chireiden}/Hartmann_No_Youkai_Otome.qys (100%) rename Songs/Touhou/{ => TH11-Chireiden}/Nuclear_Fusion.qys (100%) rename Songs/Touhou/{ => TH11-Chireiden}/Ryokugann_No_Jealousy.qys (100%) diff --git a/.gitignore b/.gitignore index ea18cff..bd2ac2a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ *_.qys /*.docx *.png -/Songs/interlude.qys \ No newline at end of file +/Songs/interlude.qys +*.txt diff --git a/Meta/Touhou/Hartmann_No_Youkai_Otome.meta b/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta similarity index 100% rename from Meta/Touhou/Hartmann_No_Youkai_Otome.meta rename to Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta diff --git a/Meta/Touhou/Ryokugann_No_Jealousy.meta b/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta similarity index 100% rename from Meta/Touhou/Ryokugann_No_Jealousy.meta rename to Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta diff --git a/Playlists/TH11-Chireiden.qyl b/Playlists/TH11-Chireiden.qyl new file mode 100644 index 0000000..319e300 --- /dev/null +++ b/Playlists/TH11-Chireiden.qyl @@ -0,0 +1,12 @@ +{ + "Title": "东方地灵殿", + "Comment": "東方地霊殿 ~ Subterranean Animism", + "Abstract": "", + "Path": "Touhou\\TH11-Chireiden\\", + "SongList": [ + {"Index": "二面BOSS曲", "Song": "Ryokugann_No_Jealousy"}, + {"Index": "EX面BOSS曲", "Song": "Hartmann_No_Youkai_Otome"} + ], + "IndexWidth": 160, + "HomeDisplay": false +} \ No newline at end of file diff --git a/Songs/Touhou/Hartmann_No_Youkai_Otome.qys b/Songs/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.qys similarity index 100% rename from Songs/Touhou/Hartmann_No_Youkai_Otome.qys rename to Songs/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.qys diff --git a/Songs/Touhou/Nuclear_Fusion.qys b/Songs/Touhou/TH11-Chireiden/Nuclear_Fusion.qys similarity index 100% rename from Songs/Touhou/Nuclear_Fusion.qys rename to Songs/Touhou/TH11-Chireiden/Nuclear_Fusion.qys diff --git a/Songs/Touhou/Ryokugann_No_Jealousy.qys b/Songs/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.qys similarity index 100% rename from Songs/Touhou/Ryokugann_No_Jealousy.qys rename to Songs/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.qys From ccc25536f217056bd6069153c2d3bbb17d3342bd Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sun, 14 Jan 2018 23:52:58 +0800 Subject: [PATCH 12/54] qys track tokenizer --- qysToken.wl | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 qysToken.wl diff --git a/qysToken.wl b/qysToken.wl new file mode 100644 index 0000000..d374ee8 --- /dev/null +++ b/qysToken.wl @@ -0,0 +1,208 @@ +(* ::Package:: *) + +getPitchOp[score_,pos_]:=Module[ + { + i=pos, + char, + semitones=0, + octaves=0, + chordSymbol="" + }, + While[i<=StringLength@score && MemberQ[pitchOpList,StringPart[score,i]], + char=StringPart[score,i]; + Switch[char, + "#",semitones++, + "b",semitones--, + "'",octaves++, + ",",octaves--, + _,chordSymbol=char + ]; + i++; + ]; + Return[{{ + "SemitonesCount"->semitones, + "OctavesCount"->octaves, + "ChordSymbol"->chordSymbol + },i}]; +]; + + +trackTokenize[score_]:=Module[ + { + tokens={},i=1,j, + char,match,content, + function,argument,position, + notes,pitchOpData,pitches, + pitchOperators, + staccato,arpeggio, + semitones,octaves, + durOperators,chordSymbol + }, + While[i<=StringLength[score], + char=StringPart[score,i]; + Switch[char, + "|"|"\\", + AppendTo[tokens,{ + "Type"->"Barline", + "Newline"->(char=="\\") + }]; + i++, + "<", + match=Select[Transpose[StringPosition[score,">"]][[1]],#>i&][[1]]; + content=StringTake[score,{i+1,match-1}]; + Which[ + StringContainsQ[content,":"], (* function *) + position=StringPosition[content,":"][[1,1]]; + function=StringTake[content,position-1]; + argument=toArgument@StringDrop[content,position]; + AppendTo[tokens,{ + "Type"->"Function", + "Name"->function, + "Argument"->argument + }], + StringContainsQ[content,"="], (* key&oct *) + AppendTo[tokens,{ + "Type"->"FunctionSimplified", + "Argument"->{ + "Key"->tonalityDict[[StringDelete[StringTake[content,{3,StringLength@content}],","|"'"]]], + "Oct"->StringCount[content,"'"]-StringCount[content,","] + } + }], + StringContainsQ[content,"/"], (* bar&beat *) + position=StringPosition[content,"/"][[1,1]]; + AppendTo[tokens,{ + "Type"->"FunctionSimplified", + "Argument"->{ + "Bar"->ToExpression[StringTake[content,position-1]], + "Beat"->ToExpression[StringDrop[content,position]] + } + }], + StringContainsQ[content,"."], (* volume *) + AppendTo[tokens,{ + "Type"->"FunctionSimplified", + "Argument"->{"Volume"->ToExpression[content]} + }], + StringMatchQ[content,NumberString], (* speed *) + AppendTo[tokens,{ + "Type"->"FunctionSimplified", + "Argument"->{"Speed"->ToExpression[content]} + }], + True, (* instrument *) + AppendTo[tokens,{ + "Type"->"FunctionSimplified", + "Argument"->{"Instr"->content} + }] + ]; + i=match+1, + "(", + match=Select[Transpose[StringPosition[score,")"]][[1]],#>i&][[1]]; + content=StringTake[score,{i+1,match-2}]; + Switch[StringTake[score,{match-1}], + "~", (* tuplet *) + AppendTo[tokens,{ + "Type"->"Tuplet", + "NoteCount"->ToExpression[content] + }], + "-", (* single tremolo *) + AppendTo[tokens,{ + "Type"->"Tremolo1", + "StrokeCount"->ToExpression[content] + }], + "=", (* double tremolo *) + AppendTo[tokens,{ + "Type"->"Tremolo2", + "StrokeCount"->ToExpression[content] + }], + "^", (* appoggiatura *) + j=1; + pitches={}; + While[j<=StringLength[content] && DigitQ@StringPart[content,j], + pitchOpData=getPitchOp[content,j+1]; + pitchOperators=pitchOpData[[1]]; + AppendTo[pitches,Prepend[ + pitchOperators, + "ScaleDegree"->ToExpression@StringPart[content,j] + ]]; + j=pitchOpData[[2]]; + ]; + AppendTo[tokens,{ + "Type"->"Appoggiatura", + "Notes"->pitches + }] + ]; + i=match+1, + "~", (* portamento *) + AppendTo[tokens,{"Type"->"Portamento"}]; + i++, + "^", (* tie *) + AppendTo[tokens,{"Type"->"Tie"}]; + i++, + _, + arpeggio=False; + staccato=False; + Switch[char, + "x", + pitches={{ + "ScaleDegree"->10, + "SemitonesCount"->0, + "OctavesCount"->0, + "ChordSymbol"->"" + }}, + "%", + pitches={{ + "ScaleDegree"->-1, + "SemitonesCount"->0, + "OctavesCount"->0, + "ChordSymbol"->"" + }}, + "[", + match=Select[Transpose[StringPosition[score,"]"]][[1]],#>i&][[1]]; + content=StringTake[score,{i+1,match-1}]; + arpeggio=StringContainsQ[content,"^"]; + content=StringDelete[content,"^"]; + j=1; + pitches={}; + While[j<=StringLength[content] && DigitQ@StringPart[content,j], + pitchOpData=getPitchOp[content,j+1]; + pitchOperators=pitchOpData[[1]]; + AppendTo[pitches,Prepend[pitchOperators,"ScaleDegree"->ToExpression@StringPart[content,j]]]; + j=pitchOpData[[2]]; + ]; + i=match, + _, + pitches={{ + "ScaleDegree"->ToExpression@char, + "SemitonesCount"->0, + "OctavesCount"->0, + "ChordSymbol"->"" + }} + ]; + i++; + pitchOpData=getPitchOp[score,i]; + pitchOperators=pitchOpData[[1]]; + i=pitchOpData[[2]]; + durOperators={}; + While[i<=StringLength[score] && MemberQ[{"-","_",".","`"},StringPart[score,i]], + char=StringPart[score,i]; + If[char=="`", + staccato=True, + AppendTo[durOperators,char] + ]; + i++; + ]; + AppendTo[tokens,Join[ + {"Type"->"Note", + "Pitches"->pitches}, + pitchOperators, + {"Staccato"->staccato, + "Arpeggio"->arpeggio, + "DurationOperators"->durOperators} + ]]; + ]; + ]; + Return[tokens]; +]; + + +(* ::Input:: *) +(*ExportString[trackTokenize["[13b^5]-"],"JSON"]*) From 77190d43e0868a728053eccbf5dff416417b3a23 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Mon, 15 Jan 2018 00:23:23 +0800 Subject: [PATCH 13/54] A little adjustment for qys track tokenizer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 去除了note下的ChordSymbol属性 --- qysToken.wl | 95 ++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 48 deletions(-) diff --git a/qysToken.wl b/qysToken.wl index d374ee8..7e361de 100644 --- a/qysToken.wl +++ b/qysToken.wl @@ -27,6 +27,13 @@ getPitchOp[score_,pos_]:=Module[ ]; +pitchOpDefault={ + "SemitonesCount"->0, + "OctavesCount"->0, + "ChordSymbol"->"" +}; + + trackTokenize[score_]:=Module[ { tokens={},i=1,j, @@ -140,47 +147,38 @@ trackTokenize[score_]:=Module[ _, arpeggio=False; staccato=False; - Switch[char, - "x", - pitches={{ - "ScaleDegree"->10, - "SemitonesCount"->0, - "OctavesCount"->0, - "ChordSymbol"->"" - }}, - "%", - pitches={{ - "ScaleDegree"->-1, - "SemitonesCount"->0, - "OctavesCount"->0, - "ChordSymbol"->"" - }}, - "[", - match=Select[Transpose[StringPosition[score,"]"]][[1]],#>i&][[1]]; - content=StringTake[score,{i+1,match-1}]; - arpeggio=StringContainsQ[content,"^"]; - content=StringDelete[content,"^"]; - j=1; - pitches={}; - While[j<=StringLength[content] && DigitQ@StringPart[content,j], - pitchOpData=getPitchOp[content,j+1]; - pitchOperators=pitchOpData[[1]]; - AppendTo[pitches,Prepend[pitchOperators,"ScaleDegree"->ToExpression@StringPart[content,j]]]; - j=pitchOpData[[2]]; - ]; - i=match, - _, - pitches={{ - "ScaleDegree"->ToExpression@char, - "SemitonesCount"->0, - "OctavesCount"->0, - "ChordSymbol"->"" - }} + If[char=="[", + (* a list of pitches *) + match=Select[Transpose[StringPosition[score,"]"]][[1]],#>i&][[1]]; + content=StringTake[score,{i+1,match-1}]; + arpeggio=StringContainsQ[content,"^"]; + content=StringDelete[content,"^"]; + j=1; + pitches={}; + While[j<=StringLength[content] && DigitQ@StringPart[content,j], + pitchOpData=getPitchOp[content,j+1]; + pitchOperators=pitchOpData[[1]]; + AppendTo[pitches,Prepend[pitchOperators,"ScaleDegree"->ToExpression@StringPart[content,j]]]; + j=pitchOpData[[2]]; + ]; + i=match+1; + pitchOpData=getPitchOp[score,i]; + pitchOperators=pitchOpData[[1]]; + i=pitchOpData[[2]], + (* one pitch *) + pitchOpData=getPitchOp[score,i+1]; + pitchOperators=pitchOpData[[1]]; + i=pitchOpData[[2]]; + pitches={Prepend[ + pitchOperators, + "ScaleDegree"->Switch[char, + "x",10, + "%",-1, + _,ToExpression@char + ] + ]}; + pitchOperators=pitchOpDefault; ]; - i++; - pitchOpData=getPitchOp[score,i]; - pitchOperators=pitchOpData[[1]]; - i=pitchOpData[[2]]; durOperators={}; While[i<=StringLength[score] && MemberQ[{"-","_",".","`"},StringPart[score,i]], char=StringPart[score,i]; @@ -190,14 +188,15 @@ trackTokenize[score_]:=Module[ ]; i++; ]; - AppendTo[tokens,Join[ - {"Type"->"Note", - "Pitches"->pitches}, - pitchOperators, - {"Staccato"->staccato, + AppendTo[tokens,{ + "Type"->"Note", + "Pitches"->pitches, + pitchOperators[[1]], + pitchOperators[[2]], + "Staccato"->staccato, "Arpeggio"->arpeggio, - "DurationOperators"->durOperators} - ]]; + "DurationOperators"->durOperators + }]; ]; ]; Return[tokens]; @@ -205,4 +204,4 @@ trackTokenize[score_]:=Module[ (* ::Input:: *) -(*ExportString[trackTokenize["[13b^5]-"],"JSON"]*) +(*ExportString[trackTokenize["1b-2#_"],"JSON"]*) From e6527229ff1faae19f0c68277a39fe1ab057892f Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Mon, 15 Jan 2018 13:10:53 +0800 Subject: [PATCH 14/54] qys tokenizer --- library.wl | 1 + qysToken.wl | 73 ++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 59 insertions(+), 15 deletions(-) diff --git a/library.wl b/library.wl index eaf5293..60a6c31 100644 --- a/library.wl +++ b/library.wl @@ -103,6 +103,7 @@ pitchOpDict=<| "#"->1,"b"->-1,"'"->12,","->-12,"M"->{0,4,7},"m"->{0,3,7}, "a"->{0,4,8},"d"->{0,3,6},"p"->{0,7,12},"o"->{0,12} |>; +pitchOpDefault={"SemitonesCount"->0,"OctavesCount"->0,"ChordSymbol"->""}; pitchOpList=Append[Keys[pitchOpDict],"$"]; defaultParameter=<| "Volume"->1,"Speed"->90,"Key"->0,"Beat"->4,"Bar"->4,"Instr"->"Piano", diff --git a/qysToken.wl b/qysToken.wl index 7e361de..5871970 100644 --- a/qysToken.wl +++ b/qysToken.wl @@ -2,11 +2,8 @@ getPitchOp[score_,pos_]:=Module[ { - i=pos, - char, - semitones=0, - octaves=0, - chordSymbol="" + i=pos,char, + semitones=0,octaves=0,chordSymbol="" }, While[i<=StringLength@score && MemberQ[pitchOpList,StringPart[score,i]], char=StringPart[score,i]; @@ -27,14 +24,7 @@ getPitchOp[score_,pos_]:=Module[ ]; -pitchOpDefault={ - "SemitonesCount"->0, - "OctavesCount"->0, - "ChordSymbol"->"" -}; - - -trackTokenize[score_]:=Module[ +QYSTrackTokenize[score_]:=Module[ { tokens={},i=1,j, char,match,content, @@ -63,7 +53,7 @@ trackTokenize[score_]:=Module[ function=StringTake[content,position-1]; argument=toArgument@StringDrop[content,position]; AppendTo[tokens,{ - "Type"->"Function", + "Type"->"FunctionToken", "Name"->function, "Argument"->argument }], @@ -204,4 +194,57 @@ trackTokenize[score_]:=Module[ (* ::Input:: *) -(*ExportString[trackTokenize["1b-2#_"],"JSON"]*) +(*ExportString[QYSTrackTokenize["<90>"],"JSON"]*) + + +QYSTokenize[filename_]:=Module[ + { + i,data,tokenizer={}, + songComments={}, + comments={}, + sections={}, + sectionInfo={}, + tracks={}, + trackToken, + score="" + }, + data=Import[filename,"Lines"]; + Do[ + Which[ + line=="", + If[sectionInfo=={}&&songComments=={}, + songComments=comments; + comments={} + ], + StringTake[line,2]=="//", + AppendTo[comments,StringDrop[line,2]], + True, + score=score<>line; + If[StringPart[line,-1]=="\\",Continue[]]; + trackToken=QYSTrackTokenize[StringDelete[score,Whitespace]]; + If[MemberQ[Association[#][["Type"]]&/@trackToken,"Note"], (* empty track *) + AppendTo[tracks,trackToken], + If[sectionInfo!={}, + AppendTo[sections,Append[sectionInfo,"Tracks"->tracks]]; + tracks={}; + ]; + sectionInfo={"Comments"->comments,"GlobalSettings"->trackToken}; + comments={}; + ]; + score="" + ], + {line,data}]; + If[sectionInfo!={},AppendTo[sections,Append[sectionInfo,"Tracks"->tracks]]]; + Return[{ + "Comments"->songComments, + "Sections"->sections + }]; +]; + + +(* ::Input:: *) +(*Export["E:\\test-Tokenizer.json",QYSTokenize[path<>"Songs\\test.qys"]];*) + + +(* ::Input:: *) +(*ExportString[QYSTokenize[path<>"Songs\\test.qys"],"JSON"]*) From 0eefac497ab730d6157298833cbf126954b041b7 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Mon, 15 Jan 2018 16:40:43 +0800 Subject: [PATCH 15/54] New Song: Nuclear Fusion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 啊啊打击乐真难配…… --- .../TouHou/TH11-Chireiden/Nuclear_Fusion.meta | 10 + Playlists/TH11-Chireiden.qyl | 1 + .../Touhou/TH11-Chireiden/Nuclear_Fusion.qys | 314 ++++++++++++------ qysParse.wl | 12 +- 4 files changed, 233 insertions(+), 104 deletions(-) create mode 100644 Meta/TouHou/TH11-Chireiden/Nuclear_Fusion.meta diff --git a/Meta/TouHou/TH11-Chireiden/Nuclear_Fusion.meta b/Meta/TouHou/TH11-Chireiden/Nuclear_Fusion.meta new file mode 100644 index 0000000..bf89920 --- /dev/null +++ b/Meta/TouHou/TH11-Chireiden/Nuclear_Fusion.meta @@ -0,0 +1,10 @@ +Format: qys; +TrackCount: 0; +Duration: 232/3; +Instruments: {"AltoSax", "Bass", "BassDrum", "BrightPiano", "Clap", "CrashCymbal", "GuitarMuted", "HighTom", "HiHatClosed", "HiHatOpen", "HiHatPedal", "LowTom", "MidTom", "Piano", "Snare", "SopranoSax", "Square", "Strings", "Trumpet"}; +Messages: (章节5) 各音轨长度不统一:24, 24, 24, 24, 24, 24, 24, 64/3, 64/3, 64/3, 64/3, 64/3, 64/3; +SongName: 灵知的太阳信仰; +Composer: ZUN; +Adapter: Shigma; +Comment: 霊知の太陽信仰 ~ Nuclear Fusion; +Abstract: 东方地灵殿6面BOSS曲 灵乌路空主题曲; \ No newline at end of file diff --git a/Playlists/TH11-Chireiden.qyl b/Playlists/TH11-Chireiden.qyl index 319e300..3ee85e9 100644 --- a/Playlists/TH11-Chireiden.qyl +++ b/Playlists/TH11-Chireiden.qyl @@ -5,6 +5,7 @@ "Path": "Touhou\\TH11-Chireiden\\", "SongList": [ {"Index": "二面BOSS曲", "Song": "Ryokugann_No_Jealousy"}, + {"Index": "六面BOSS曲", "Song": "Nuclear_Fusion"}, {"Index": "EX面BOSS曲", "Song": "Hartmann_No_Youkai_Otome"} ], "IndexWidth": 160, diff --git a/Songs/Touhou/TH11-Chireiden/Nuclear_Fusion.qys b/Songs/Touhou/TH11-Chireiden/Nuclear_Fusion.qys index 5810ac2..6a39122 100644 --- a/Songs/Touhou/TH11-Chireiden/Nuclear_Fusion.qys +++ b/Songs/Touhou/TH11-Chireiden/Nuclear_Fusion.qys @@ -1,36 +1,182 @@ //霊知の太陽信仰 //-------------------- Section A -------------------- -<1=bE><180> +<1=bE><180><4/4> \ 6,33b7,4#41#3|3b7,21#7b,1#15#,|6,33b7,4#41#3|3b7,21#7b,1#15#,\ 6,33b7,4#41#3|3b7,21#7b,1#15#,|6,33b7,4#41#3|3b7,21#7b,1#15#,\ 6,o3o3bo7,o4#o4o1#o3o|3bo7,o2o1#o7b,o1#o1o5#,o|6,o3o3bo7,o4#o4o1#o3o|3bo7,o2o1#o7b,o1#o1o5#,o\ -6,o3o3bo7,o4#o4o1#o3o|3bo7,o2o1#o7b,o1#o1o5#,o|6,o3o3bo7,o4#o4o1#o3o|3bo7,o2o1#o7b,o1#o1o5#,o\ -[16]-%02[7,5]02_5_|[16]01[7,5]02[16]-|[6,4]-%----5_7_|[31']-----[6,3]5\ -[16]-%-6[257]-5#_6_|[31'][16][31'][27][7,5][27][31']-|[6,4]-%----5_7_|[52']-----35\ -[16]-%02[7,5]02_5_|[16]01[7,5]02[16]-|[6,4]-%----5_7_|[31']-----[6,3]5\ -[16]-%-6[257]-5#_6_|[31'][16][31'][27][7,5][27][31']-|[6,4]-%----5_7_|[52']-------\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ +6,o3o3bo7,o4#o4o1#o3o|3bo7,o2o1#o7b,o1#o1o5#,o|6,o3o3bo7,o4#o4o1#o3o|3bo7,o2o1#o7b,o1#o1o5#,o| + +<0.6>\ +6,p.0_[146b1']#.1$_^|%7,$.5#,$.|6,p%[146b1']#.1$_^|%7,$.5#,$.\ +6,p%[146b1']#.1$_^|%7,$.5#,$.|6,p%[146b1']#.1$_^|%7,$.5#,$.\ +6,p%[146b1']#.1$_^|%7,$.5#,$.|6,p%[146b1']#.1$_^|%7,$.5#,$.\ +6,p%[146b1']#.1$_^|%7,$.5#,$.|6,p%[146b1']#.1$_^|%7,$.5#,$.| + +<0.4>\ +6.0_1#'.1'_^|%7.5#.|661#'.1'_^|%7.5#.\ +6.0_1#'.1'_^|%7.5#.|661#'.1'_^|%7.5#.\ +6%%%1#'%%%b|%%7%%5#%%|6%%%1#'%%%b|%%7%%5#%%\ +6%%%1#'%%%b|%%7%%5#%%|6%%%1#'%%%b|%%7%%5#%%| + +<0.8>\ 0---|0---|0---|0---\ 0---|0---|0---|0---\ +[36],-[6,1#].[5#,1]_^|%[57],.[35#],.|[36],-[6,1#].[5#,1]_^|%[57],.[35#],.\ +[36o],-[6,1#o].[5#,1o]_^|%[57o],.[35#o],.|[36o],-[6,1#o].[5#,1o]_^|%[57o],.[35#o],.| + +<0.5>\ +x---|0---|0---|0---\ +xx00xx0x|xx00xx0x|xx00xx0x|xx00x_x_x_x_00\ +x-0-xx0-x-0-xx0-|x-0-xx0-xxxx0x0x|x-0-xx0-x-0-xx0-|x-0-xx0-xxxx0x0x\ +x-0-xx0-x-0-xx0-|x-0-xx0-xxxx0x0x|x-0-xx0-x-0-xx0-|x-0-xx0-xxxx0x0x| + +<0.3>\ +0---|0---|xx00|00xx\ +00x.x_0_x.x.x_|00x.x_0_x.x.x_|00x.x_0_x.x.x_|00x.x_00x_x_x_x_\ +0x0x0x0x|0x0x0xxx|0x0x0x0x|0x0x0xxx\ +0x0x0x0x|0x0x0xxx|0x0x0x0x|0x0x0xxx| + +<0.1>\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|x---|0---\ +x---|0---|x---|0---| + +<0.05>\ +00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx00xx\ +00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx00xx\ +0xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx|0xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx\ +0xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx|0xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx| + +<0.1>\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ 0---|0---|0---|0---\ -0---|0---| +0---|0---|0---|0---| + +//-------------------- Section B -------------------- +<1=bE><180><4/4> + +\ +[16]-%02[7,5]02_5_|[16]01[7,5]02[16]-|[6,4]-%----5_7_|[31']-----[6,3]5\ +[16]-%-6[257]-5#_6_|[31'][16][31'][27][7,5][27][31']-|[6,4]-%----5_7_|[52']-----35\ +[16]-%02[7,5]02_5_|[16]01[7,5]02[16]-|[6,4]-%----5_7_|[31']-----[6,3]5\ +[16]-%-6[257]-5#_6_|[31'][16][31'][27][7,5][27][31']-|[6,4]-%----5_7_|[52']-------| \ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ 0---|0---|0.2_5_[27].|33_[25]_7,_2_6,_3_\ 0---|0---|0.4_6_[31']_6_5__7__|5_6_[37]_5_7_1'_3_5_\ 0---|0---|0.2_5_[27].|33_[25]_7,_2_6,_3_\ -0---|0---|0.4_6_[31']_6_5__7__|5_6_[37]_5_[57]_[21']_[7,3]_[3,5]_\ -[61']%0_[57]0_|[46]0_%0_[57]|[61']%0_[57]0_|[46]0_%0_[5#7]\ -[61']%0_[73b']0_|[1#3]'_[73b']_[1#3]'_[73b']_[51']#_[73b']_[1#3]'_[73b']_|[7b2']%0_[13]'0_|[1#3]'-[1#6]'-\ +0---|0---|0.4_6_[31']_6_5__7__|5_6_[37]_5_[57]_[21']_[7,3]_[3,5]_| + +<0.6>\ +[6o1']-%.0.[5o7].0.|[6o1'].0.[5o7].0.[6o1']-|[4o6]--%--%-|[5o1']--%--%-\ +[6o1']-%.0.[5o7].0.|[6o1'].0.[5o7].0.[6o1']-|[4o6]--%--%-|[5o1']--%--%-\ +[6o1']-%.0.[5o7].0.|[6o1'].0.[5o7].0.[6o1']-|[4o6]--%--%-|[5o1']--%--%-\ +[6o1']-%.0.[5o7].0.|[61'o]6'1''[57o]5'7'[6o1']-|[4o6]--%--%-|[5o7]--%--%-| + +<0.4>\ +6-6-05-0|6-05-06-|4644461'7|42'1'01'51'5\ +6-6-05-0|6-05-06-|4644461'7|51'2'51'51'5\ +6-6-05-0|6-05-06-|4644461'7|42'1'01'51'5\ +6-6-05-0|6-05-06-|4644461'7|51'2'51'51'5| + +<0.8>\ +[16],%_0.-|0---|4,---|1---\ +[16],%_0.-|0---|4,---|2---\ +[16],%_0.-|0---|4,---|1---\ +[16],%0_[27],0_|[3,1].[27],.[3,1]|6,---|2---| + +<0.5>\ +xxx00-x-x-0-x0xx|0xx0x-0-x0xx0xxx|x0x0x0x0|x0x0x_x_x0x\ +xxx00-x-x-0-x0xx|0xx0x-0-x0xx0xxx|x0x0x0x0|x0x0x_x_x0x\ +xxx00-x-x-0-x0xx|0xx0x-0-x0xx0xxx|x0x0x0x0|x0x0x_x_x0x\ +xxx00-x-x-0-x0xx|0xx0x-0-x0xx0xxx|x0x0x0x0|x0x0x_x_x0x| + +<0.3>\ +0x.x.|x.x.x|0x0x0x0x|0x0x0x0x\ +0x.x.|x.x.x|0x0x0x0x|0x0x0x0x\ +0x.x.|x.x.x|0x0x0x0x|0x0x0x0x\ +0x.x.|x.x.x|0x0x0x0x|0x0x0x0x| + +<0.1>\ +xx.x.|x.x.x|x---|0---\ +xx.x.|x.x.x|x---|0---\ +xx.x.|x.x.x|x---|0---\ +xx.x.|x.x.x|x---|0---| + +<0.05>\ +0---|0---|xx00xx00xx00xx00|xx00xx00xx00xx0x\ +0---|0---|xx00xx00xx00xx00|xx00xx00xx00xx0x\ +0---|0---|xx00xx00xx00xx00|xx00xx00xx00xx0x\ +0---|0---|xx00xx00xx00xx00|xx00xx00xx00xx0x| + +<0.1>\ +0---|0---|0x0x0x0x|0x0x0x0x\ +0---|0---|0x0x0x0x|0x0x0x0x\ +0---|0---|0x0x0x0x|0x0x0x0x\ +0---|0---|0x0x0x0x|0x0x0x0x| + +//-------------------- Section C -------------------- +<1=bE><180><4/4> + +\ +[61']%0_[57]0_|[46]0_%0_[57]\ +[61']%0_[57]0_|[46]0_%0_[5#7]\ +[61']%0_[73b']0_|[1#3]'[73b'][1#3]'[73b'][51']#[73b'][1#3]'[73b']\ +[7b2']%0_[13]'0_|[1#3]'-[1#6]'-| + +<0.6>\ +[16],.0[7,5],.|[6,4],0_%.[7,5],|[16],.0[7,5],.|[6,4],0_%.[7,5#],\ +[16],.0[3b7],.|0---|[27b],-0_[3,1].|[3,1#]-[1#o6o]-| + +<0.3>\ +6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`\ +6,`1`6`1`4#`3b`7,`3b`|7,`3b`7`3b`4#`3b`7,`3b`|2`5`2'`5`6`1'`3'`6`|6`1#'`3'`6`1'`3'`6'`6`| + +<0.4>\ +[16]%_0_[7,5]%|[6,4]%[7,5]%|[16]%[7,5]%|[6,4]%[7,5]%\ +[16]%[3b7]%|[31#']%[3b7]%|[27b]%[31']%|%%%%| + +<0.8>\ +[16].0[7,5].|[6,4]0_%.[7,5]|[16].0[7,5].|[6,4]0_%.[7,5#]\ +[16].0[3b7].|0---|[27b]-0_[31'].|[31#']-[1#o6o]'-| + +<0.5>\ +xx0x0x0x_x_|0-------|xx0x0x0x_x_|0-------\ +xx0x0x0x_x_|0xxx|x000|0---| + +<0.3>\ +0-x-x-0-|x00x00xx_x_|0-x-x-0-|x00x00xx_x_\ +0-x-x-0-|xxx000x0x0xx0---|xxxxx0x0xxxxx0x0|000xxxxxxxx| + +<0.1>\ +x---|0---|0---|0---\ +x---|0---|0---|0---| + +<0.1>\ +0---|x.x.x|0---|x.x.x\ +0---|0---|0---|0---| + +<0.5>\ +000x0.x_x_x_0|0xx0xx00|x00x0.x_x_x_0|0xx0xx00\ +x00x0.x_x_x_0|0-----xx_x_|0-------|x_x_x_x_0-----| + +<0.5>\ +0---|0---|0---|0---\ +0---|0---|0---|0x__x__x__x__00| + +<0.5>\ +0---|0---|0---|0---\ +0---|0---|0---|00x__x__x__x__0| + +//-------------------- Section D -------------------- +<1=bE><180><4/4> + +\ [24]---|[16]---|[7,5][27][31#']_[52'][42']_^|%-[31#']-\ [42']---|[16]--[26]|[7,5].[5,2].[7,5]|[24]-[1#3]-\ [24]---|[16]---|[7,5][27][31#']_[52'][42']_^|%-[31#']-\ @@ -38,33 +184,13 @@ [6,2]---^|%---| <0.6>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -[16],.0[7,5],.|[6,4],0_%.[7,5],|[16],.0[7,5],.|[6,4],0_%.[7,5#],\ -[16],.0[3b7],.|0---|[27b],-0_[3,1].|[3,1#]-[1#o6o]-\ [462'].%.%|5$.%.%|5M.%.%|4$.%.3$\ [462'].%.%|6m.%.[62']_[62'4']_|5M.%.%|2p.%.3$\ [462'].%.%|5$.%.%|5M.%.%|4$.%.3$\ [462'].%.%|6m.%.[62']_[62'4']_|5M.%.%|2p.%.3$\ [62']---^|%---| -<0.2>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`\ -6,`1`6`1`4#`3b`7,`3b`|7,`3b`7`3b`4#`3b`7,`3b`|2`5`2'`5`6`1'`3'`6`|6`1#'`3'`6`1'`3'`6'`6`\ +<0.3>\ 6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|7,`2`7`2`4#`2`7,`2`|2`4`2'`4`5#`3`1`3`\ 6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|5,`7b,`5`7b,`2`7b,`5,`7b,`|6,`2`6`2`6,`1#`6`1`\ 6,`1`6`1`3`1`6,`1`|6,`1`6`1`3`1`6,`1`|7,`2`7`2`4#`2`7,`2`|2`4`2'`4`5#`3`1`3`\ @@ -72,86 +198,74 @@ 0---|0---| <0.6>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ [24]---|[16]---|[7,5][27][31#']_[52'][42']_^|%-[31#']-\ [42']---|[16]--[26]|[7,5].[5,2].[7,5]|[24]-[1#3]-\ [24]---|[16]---|[7,5][27][31#']_[52'][42']_^|%-[31#']-\ [42']---|[16]--[26]|[7,5].[5,2].[7,5]|[24]-[1#3]-\ [6,2]---^|%---| -<0.8>\ -6,p.0_[146b1']#.1$_^|%7,$.5#,$.|6,p%[146b1']#.1$_^|%7,$.5#,$.\ -6,p%[146b1']#.1$_^|%7,$.5#,$.|6,p%[146b1']#.1$_^|%7,$.5#,$.\ -6,p%[146b1']#.1$_^|%7,$.5#,$.|6,p%[146b1']#.1$_^|%7,$.5#,$.\ -6,p%[146b1']#.1$_^|%7,$.5#,$.|6,p%[146b1']#.1$_^|%7,$.5#,$.\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ +<0.8>\ [24]---|[16]---|[7,5][27][31#']_[52'][42']_^|%-[31#']-\ [42']---|[16]--[26]|[7,5].[5,2].[7,5]|[24]-[1#3]-\ [24]---|[16]---|[7,5][27][31#']_[52'][42']_^|%-[31#']-\ [42']---|[16]--[26]|[7,5].[5,2].[7,5]|[24]-[1#3]-\ [6,2]---^|%---| -<0.6>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -[6o1']-%.0.[5o7].0.|[6o1'].0.[5o7].0.[6o1']-|[4o6]--%--%-|[5o1']--%--%-\ -[6o1']-%.0.[5o7].0.|[6o1'].0.[5o7].0.[6o1']-|[4o6]--%--%-|[5o1']--%--%-\ -[6o1']-%.0.[5o7].0.|[6o1'].0.[5o7].0.[6o1']-|[4o6]--%--%-|[5o1']--%--%-\ -[6o1']-%.0.[5o7].0.|[61'o]6'1''[57o]5'7'[6o1']-|[4o6]--%--%-|[5o7]--%--%-\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---| - -<0.4>\ -6.0_1#'.1'_^|%7.5#.|661#'.1'_^|%7.5#.\ -6.0_1#'.1'_^|%7.5#.|661#'.1'_^|%7.5#.\ -6%%%1#'%%%b|%%7%%5#%%|6%%%1#'%%%b|%%7%%5#%%\ -6%%%1#'%%%b|%%7%%5#%%|6%%%1#'%%%b|%%7%%5#%%\ -6-6-05-0|6-05-06-|4644461'7|42'1'01'51'5\ -6-6-05-0|6-05-06-|4644461'7|51'2'51'51'5\ -6-6-05-0|6-05-06-|4644461'7|42'1'01'51'5\ -6-6-05-0|6-05-06-|4644461'7|51'2'51'51'5\ -[16]%_0_[7,5]%|[6,4]%[7,5]%|[16]%[7,5]%|[6,4]%[7,5]%\ -[16]%[3b7]%|[31#']%[3b7]%|[27b]%[31']%|%%%%\ +<0.4>\ 4444462'4|555551'3'5|555551'3'1'|44443333\ 4444462'4|666662'4'6|5555572'5|22223333\ 4444462'4|4444462'4|555551'3'5|555551'3'1'\ 44443333|4444462'4|666662'4'6|5555572'5\ -6---^|6---| +6---^|%---| -<0.6>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -[36],-[6,1#].[5#,1]_^|%[57],.[35#],.|[36],-[6,1#].[5#,1]_^|%[57],.[35#],.\ -[36o],-[6,1#o].[5#,1o]_^|%[57o],.[35#o],.|[36o],-[6,1#o].[5#,1o]_^|%[57o],.[35#o],.\ -[16],%_0.-|0---|4,---|1---\ -[16],%_0.-|0---|4,---|2---\ -[16],%_0.-|0---|4,---|1---\ -[16],%0_[27],0_|[3,1].[27],.[3,1]|6,---|2---\ -[16].0[7,5].|[6,4]0_%.[7,5]|[16].0[7,5].|[6,4]0_%.[7,5#]\ -[16].0[3b7].|0---|[27b]-0_[31'].|[31#']-[1#o6o]'-\ +<0.8>\ [462']---|[361']---|[57]-[35]-|[7b2'4']-[361#']-\ [42'4']---|[136]---|[7,25]---|[246]-[1#36]-\ [462']---|[361']---|[57]-[35]-|[7b2'4']-[361#']-\ [42'4']---|[136]---|[7,25]---|[246]-[1#36]-\ -[6,2]---^|%---| \ No newline at end of file +[6,2]---^|%---| + +<0.4>\ +xx0xxx0xxx0xxx0x|xx0xxx0xxx0xxx0x|xx0xxx0xxx0xxx0x|xx0xxx0xxx0xxx0x\ +xx0xxx0xxx0xxx0x|xx0xxx0xxx0xxx0x|xx0xxx0xxx0xxx0x|xx0xxx0xxx0x0000\ +xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx\ +xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx|00000x000x000000\ +0---| + +<0.3>\ +0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ +0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0xx_x_x_x_\ +0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ +0x0x0x0x|0x0x0x0x|0x0x0x0x|xxxxx0xxx0xxxxxx\ +0---| + +<0.1>\ +x---|0---|0---|0---\ +x---|0---|0---|0---\ +x---|0---|0---|0---\ +x---|0---|0---|0---\ +0---| + +<0.05>\ +00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx00xx\ +00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx0xxx\ +00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx00xx\ +00xx00xx00xx00xx|00xx00xx00xx00xx|00xx00xx00xx00xx|0---\ +0---| + +<0.1>\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxxxxxxxxxxxxxx\ +0---| + +<0.2>\ +0---|0---|0---|0---\ +0---|0---|0---|0--x_x_x_x_\ +0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ +0x0x0x0x|0x0x0x0x|0x0x0x0x|0-------\ +0---| + + + diff --git a/qysParse.wl b/qysParse.wl index 89df84d..1d68a3c 100644 --- a/qysParse.wl +++ b/qysParse.wl @@ -374,7 +374,7 @@ QYSParse[filename_]:=Module[ (* ::Input:: *) -(*AudioStop[];AudioPlay@QYSParse[path<>"Songs\\TouHou\\Hartmann_No_Youkai_Otome.qys"];*) +(*AudioStop[];AudioPlay@QYSParse[path<>"Songs\\TouHou\\TH11-Chireiden\\Nuclear_Fusion.qys"];*) (* ::Input:: *) @@ -382,15 +382,15 @@ QYSParse[filename_]:=Module[ (* ::Input:: *) -(*EmitSound@Sound@SoundNote[-12,1,"Xylophone"]*) +(*EmitSound@Sound@SoundNote[12,1,"SopranoSax"]*) (* ::Input:: *) -(*EmitSound@Sound@SoundNote["HiHatPedal",1]*) +(*EmitSound@Sound@SoundNote["HighTom",1]*) (* ::Input:: *) -(*AudioStop[];AudioPlay@QYSParse[path<>"Songs\\test.qys"];*) +(*Export["E:\\1.mp3",QYSParse[path<>"Songs\\temp.qys"]];*) (* ::Input:: *) @@ -400,3 +400,7 @@ QYSParse[filename_]:=Module[ (* ::Text:: *) (*ElectricSnare, BassDrum, Shaker, RideCymbal, Snare, CrashCymbal, HiHatPedal, HiHatClosed*) (*Ocarina, Oboe, Clarinet, Recorder, BrassSection, Harpsichord, BrightPiano, Organ, DrawbarOrgan, FretlessBass*) + + +(* ::Input:: *) +(*pitchDict[["2"]]+tonalityDict[["bE"]]+36*) From adae08d594650380fcb123e78d670c7a9e6f66ab Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Mon, 15 Jan 2018 19:48:38 +0800 Subject: [PATCH 16/54] Add some adjustments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增了playlist.json文件用以记录歌单在主页面上的位置。 2. 删除了qyl文件中的HomeDisplay标签。 3. 新增系统歌单:未分类的歌曲。 4. 现在系统能够记录在每个歌单的页码了。当到达一个页面时会自动返回到上次访问时的页码。 5. 疑似解决了歌单页面的报错问题。 6. 修改了部分歌曲的名称。 --- Meta/Onaji_Takami_he.meta | 2 +- .../TH15-Kanjuden/Pandemonic_Planet.meta | 2 +- Playlists/Chorus.qyl | 3 +- Playlists/Clannad.qyl | 3 +- Playlists/Piano.qyl | 3 +- Playlists/TH11-Chireiden.qyl | 3 +- Playlists/TH15-Kanjuden.qyl | 3 +- QYMP.wl | 49 +++++++++++++------ interface.wl | 47 +++++++++--------- playlist.json | 6 +++ 10 files changed, 71 insertions(+), 50 deletions(-) create mode 100644 playlist.json diff --git a/Meta/Onaji_Takami_he.meta b/Meta/Onaji_Takami_he.meta index 3f3821b..fb8541d 100644 --- a/Meta/Onaji_Takami_he.meta +++ b/Meta/Onaji_Takami_he.meta @@ -3,6 +3,6 @@ TrackCount: 6; Duration: 116; Instruments: {"BrightPiano", "Piano"}; Messages: ; -SongName: 到相同的高度; +SongName: 向着同一高度; Composer: 鷹石忍; Comment: 同じ高みへ; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta b/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta index 518d715..cd10bc2 100644 --- a/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta +++ b/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta @@ -2,7 +2,7 @@ Format: qys; TrackCount: 20; Duration: 228; Instruments: {"BassDrum", "BassDrum2", "ChineseCymbal", "Clap", "ElectricBass", "ElectricGrandPiano", "EnglishHorn", "HiHatClosed", "Koto", "Maracas", "Snare", "Strings", "Violin", "Xylophone"}; -SongName: Pandemonic Planet; +SongName: 嘈乱的星球; Composer: ZUN; Adapter: 触手猴 LittleRed; Comment: パンデモニックプラネット; diff --git a/Playlists/Chorus.qyl b/Playlists/Chorus.qyl index d7651ab..684c491 100644 --- a/Playlists/Chorus.qyl +++ b/Playlists/Chorus.qyl @@ -9,6 +9,5 @@ {"Song": "Sunny_Light"}, {"Song": "Oriental_Pearl"} ], - "IndexWidth": 0, - "HomeDisplay": true + "IndexWidth": 0 } \ No newline at end of file diff --git a/Playlists/Clannad.qyl b/Playlists/Clannad.qyl index b8a97b1..7ac7eb6 100644 --- a/Playlists/Clannad.qyl +++ b/Playlists/Clannad.qyl @@ -9,6 +9,5 @@ {"Song": "Onaji_Takami_he"}, {"Song": "Sora_ni_Hikaru"} ], - "IndexWidth": 0, - "HomeDisplay": true + "IndexWidth": 0 } \ No newline at end of file diff --git a/Playlists/Piano.qyl b/Playlists/Piano.qyl index f50f16c..46f5d12 100644 --- a/Playlists/Piano.qyl +++ b/Playlists/Piano.qyl @@ -12,6 +12,5 @@ {"Song": "Onaji_Takami_he"}, {"Song": "Touhou\\Necro_Fantasia"} ], - "IndexWidth": 0, - "HomeDisplay": true + "IndexWidth": 0 } \ No newline at end of file diff --git a/Playlists/TH11-Chireiden.qyl b/Playlists/TH11-Chireiden.qyl index 3ee85e9..cf3aca2 100644 --- a/Playlists/TH11-Chireiden.qyl +++ b/Playlists/TH11-Chireiden.qyl @@ -8,6 +8,5 @@ {"Index": "六面BOSS曲", "Song": "Nuclear_Fusion"}, {"Index": "EX面BOSS曲", "Song": "Hartmann_No_Youkai_Otome"} ], - "IndexWidth": 160, - "HomeDisplay": false + "IndexWidth": 160 } \ No newline at end of file diff --git a/Playlists/TH15-Kanjuden.qyl b/Playlists/TH15-Kanjuden.qyl index ab21186..b1c5a98 100644 --- a/Playlists/TH15-Kanjuden.qyl +++ b/Playlists/TH15-Kanjuden.qyl @@ -19,6 +19,5 @@ {"Index": "EX面道中曲", "Song": "Akumu_no_Sekai"}, {"Index": "EX面BOSS曲", "Song": "Pandemonic_Planet"} ], - "IndexWidth": 160, - "HomeDisplay": true + "IndexWidth": 160 } \ No newline at end of file diff --git a/QYMP.wl b/QYMP.wl index 7705d02..a2ad5ea 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -12,31 +12,49 @@ path=NotebookDirectory[]; <<(path<>"qymParse.wl") -refresh:=( +refresh:=Module[ + { + metaTree,songsClassified, + playlistInfo,songList + }, metaTree=StringDrop[FileNames["*","Meta",Infinity],5]; - songListAll=StringDrop[Select[metaTree,StringMatchQ[__~~".meta"]],-5]; + songs=StringDrop[Select[metaTree,StringMatchQ[__~~".meta"]],-5]; dirList=Select[metaTree,!StringMatchQ[#,__~~".meta"]&]; Do[ If[!DirectoryQ[userPath<>"buffer\\"<>dir],CreateDirectory[userPath<>"buffer\\"<>dir]]; If[!DirectoryQ[userPath<>"images\\"<>dir],CreateDirectory[userPath<>"images\\"<>dir]], {dir,dirList}]; - index=AssociationMap[readInfo,songListAll]; - playlistList=StringDrop[FileNames["*","Playlists"],10]; - playlistData=Association[#->Association@Import[path<>"Playlists\\"<>#,"JSON"]&/@playlistList]; - playlistList=Select[playlistList,playlistData[[#,"HomeDisplay"]]&]; - PrependTo[playlistList,"All"]; - PrependTo[playlistData, + index=AssociationMap[readInfo,songs]; + playlists=#&/@Import[path<>"playlist.json"]; + playlistData=<||>; + songsClassified={}; + Do[ + playlistInfo=Association@Import[path<>"Playlists\\"<>playlist<>".qyl","JSON"]; + songList=#Song&/@Association/@playlistInfo[["SongList"]]; + AppendTo[playlistData,<|playlist->playlistInfo|>]; + songsClassified=Union[songsClassified,playlistInfo[["Path"]]<>#&/@songList], + {playlist,playlists}]; + playlists=Join[{"All","Unclassified"},playlists]; + playlistData=Join[<| "All"-><| "Path"->"", "Title"->"\:6240\:6709\:6b4c\:66f2", "Abstract"->"", "Comment"->"", - "SongList"->({"Song"->#}&/@songListAll), - "HomeDisplay"->True, + "SongList"->({"Song"->#}&/@songs), + "IndexWidth"->0 + |>, + "Unclassified"-><| + "Path"->"", + "Title"->"\:672a\:5206\:7c7b\:7684\:6b4c\:66f2", + "Abstract"->"", + "Comment"->"", + "SongList"->({"Song"->#}&/@Complement[songs,songsClassified]), "IndexWidth"->0 |> - ]; -); + |>,playlistData]; + pageData=AssociationMap[1&,Prepend[playlists,"Main"]]; +]; (* ::Input:: *) @@ -48,7 +66,7 @@ updateImage:=Module[{updates={},image,filename,meta}, If[KeyExistsQ[index[[song]],"Image"]&&!FileExistsQ[userPath<>"Images\\"<>index[[song,"Image"]]], AppendTo[updates,index[[song,"Image"]]] ], - {song,songListAll}]; + {song,songs}]; If[updates=={},Return[]]; Monitor[Do[ filename=updates[[i]]; @@ -87,7 +105,7 @@ updateBuffer:=Module[{updates={},song,filename,hash,audio,messages}, AppendTo[bufferHash,song->hash]; AppendTo[updates,song]; ], - {song,songListAll}]; + {song,songs}]; If[updates=={},Return[]]; Monitor[Do[ song=updates[[i]]; @@ -115,8 +133,7 @@ updateBuffer:=Module[{updates={},song,filename,hash,audio,messages}, index[[updates[[i]],"SongName"]] }], Spacer[{4,4}]},Alignment->Center],ImageSize->400,Alignment->Center]]; - Export[userPath<>"Buffer.json",Normal@bufferHash[[Intersection[Keys@bufferHash,songListAll]]]]; - Export[userPath<>"ErrorLog.json",Normal@errorLog]; + Export[userPath<>"Buffer.json",Normal@bufferHash[[Intersection[Keys@bufferHash,songs]]]]; ]; diff --git a/interface.wl b/interface.wl index 1c2a3b8..a97a58e 100644 --- a/interface.wl +++ b/interface.wl @@ -66,7 +66,7 @@ uiPlayerControlsOld:={ Spacer[20], Button[text[["Stop"]],current["State"]="Stopped",ImageSize->80], Spacer[20], - Button[text[["Return"]],AudioStop[];DialogReturn[uiPlaylist],ImageSize->80] + Button[text[["Return"]],AudioStop[];DialogReturn[uiPlaylist[currentPlaylist]],ImageSize->80] }] }; @@ -105,7 +105,7 @@ uiPlayerControlsNew:={ "MouseDown":>(style="Clicked";), "MouseUp":>(style="Default"; AudioStop[]; - DialogReturn[uiPlaylist]; + DialogReturn[uiPlaylist[currentPlaylist]]; ) }] ] @@ -185,7 +185,7 @@ uiModifySong[song_]:=DynamicModule[{textInfo}, {Button[text[["Save"]],putTextInfo[song,textInfo],ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], Button[text[["Undo"]],textInfo=getTextInfo[song],ImageSize->150]}, {Button[text[["DeleteSong"]],DialogReturn[uiDeleteSong[song]],ImageSize->150], - Button[text[["Return"]],DialogReturn[uiPlaylist],ImageSize->150]} + Button[text[["Return"]],DialogReturn[refresh;uiPlaylist["All"]],ImageSize->150]} }],Spacer[{20,20}] },Center,ItemSize->Full,Spacings->1], Background->styleColor[["Background"]],WindowTitle->text[["ModifySong"]]]; @@ -196,7 +196,7 @@ ignoreList={"temp.qys","test.qys"}; uiAddSong:=DynamicModule[{songPath,textInfo,candidates}, textInfo=AssociationMap[""&,textInfoTags]; candidates=Complement[StringDrop[FileNames["*.qys"|"*.qym","Songs",Infinity],6], - #<>"."<>index[[#,"Format"]]&/@songListAll, + #<>"."<>index[[#,"Format"]]&/@songs, ignoreList ]; CreateDialog[Column[{Spacer[{40,40}], @@ -209,10 +209,10 @@ uiAddSong:=DynamicModule[{songPath,textInfo,candidates}, InputField[Dynamic@textInfo[[#]],String], Spacer[40]}]&/@textInfoTags], Spacer[4], - Row[{Button[text[["Add"]],addSong[songPath,textInfo];DialogReturn[uiPlaylist], + Row[{Button[text[["Add"]],addSong[songPath,textInfo];DialogReturn[QYMP], ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], Spacer[20], - Button[text[["Return"]],DialogReturn[uiPlaylist],ImageSize->150]}], + Button[text[["Return"]],DialogReturn[refresh;uiPlaylist["All"]],ImageSize->150]}], Spacer[{40,40}]},Center,ItemSize->Full,Spacings->1], Background->styleColor[["Background"]],WindowTitle->text[["AddSong"]]] ]; @@ -243,7 +243,7 @@ uiDeleteSong[song_]:=CreateDialog[Column[{"", Button[text[["Confirm"]], index=Delete[index,song]; DeleteFile[path<>"Meta\\"<>song<>".meta"]; - DialogReturn[uiPlaylist], + DialogReturn[refresh;uiPlaylist["All"]], ImageSize->100], Spacer[20], Button[text[["Return"]],DialogReturn[uiModifySong[song]],ImageSize->100] @@ -298,11 +298,12 @@ uiPageSelector:=Row[{ },ImageSize->{500,60},Alignment->Center]; -QYMP:=DynamicModule[{playlist="All"}, - page=1; +QYMP:=DynamicModule[{playlist}, refresh; - pageCount=Ceiling[Length@playlistList/16]; - playlistListPaged=Partition[playlistList,UpTo@Ceiling[Length@playlistList/pageCount]]; + pageCount=Ceiling[Length@playlists/16]; + If[pageData[["Main"]]>pageCount,pageData[["Main"]]=pageCount]; + playlistsPaged=Partition[playlists,UpTo@Ceiling[Length@playlists/pageCount]]; + page=pageData[["Main"]]; CreateDialog[Column[{Spacer[{40,40}], Row[{ Row[{Spacer[40],caption["_QYMP","BigTitle"]},Alignment->Left,ImageSize->320], @@ -310,7 +311,7 @@ QYMP:=DynamicModule[{playlist="All"}, DynamicModule[{style="Default"}, EventHandler[Dynamic@button["Play",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";currentPlaylist=playlist;DialogReturn[uiPlaylist]) + "MouseUp":>(style="Default";DialogReturn[uiPlaylist[playlist]];) }] ], Spacer[10], @@ -343,7 +344,7 @@ QYMP:=DynamicModule[{playlist="All"}, Spacer[8], caption[playlistData[[#,"Title"]],"SongName"], Row[{Spacer[24],caption[playlistData[[#,"Comment"]],"SongComment"]}] - },ImageSize->{800,30}]&/@playlistListPaged[[page]], + },ImageSize->{800,30}]&/@playlistsPaged[[page]], Appearance->"Vertical" ],Spacer[60]}],Spacer[1], uiPageSelector, @@ -353,16 +354,18 @@ QYMP:=DynamicModule[{playlist="All"}, ]; -uiPlaylist:=DynamicModule[{song}, - page=1; - playlist=currentPlaylist; +uiPlaylist[playlist_]:=DynamicModule[{song}, + If[!MemberQ[playlists,playlist],Return[]]; + currentPlaylist=playlist; playlistInfo=playlistData[[playlist]]; - songList=Association/@playlistInfo[["SongList"]]; - Do[ - songList[[i,"Song"]]=playlistInfo[["Path"]]<>songList[[i,"Song"]], - {i,Length@songList}]; + songList=If[playlistInfo[["IndexWidth"]]>0, + <|"Song"->playlistInfo[["Path"]]<>#Song,"Index"->#Index|>&/@Association/@playlistInfo[["SongList"]], + <|"Song"->playlistInfo[["Path"]]<>#Song|>&/@Association/@playlistInfo[["SongList"]] + ]; pageCount=Ceiling[Length@songList/16]; songListPaged=Partition[songList,UpTo@Ceiling[Length@songList/pageCount]]; + If[pageData[[playlist]]>pageCount,pageData[[playlist]]=pageCount]; + page=pageData[[playlist]]; CreateDialog[Column[{Spacer[{40,40}], Row[{ Row[{Spacer[40],caption[playlistInfo[["Title"]],"BigTitle"]},Alignment->Left,ImageSize->320], @@ -431,8 +434,8 @@ uiPlaylist:=DynamicModule[{song}, (* ::Input:: *) -(*currentPlaylist="TH15-Kanjuden.qyl";uiPlaylist;*) +(*uiPlaylist["TH15-Kanjuden"];*) (* ::Input:: *) -(*currentPlaylist="All";uiPlaylist;*) +(*uiPlaylist["All"];*) diff --git a/playlist.json b/playlist.json new file mode 100644 index 0000000..b28fe00 --- /dev/null +++ b/playlist.json @@ -0,0 +1,6 @@ +[ + "Chorus", + "Piano", + "Clannad", + "TH15-Kanjuden" +] \ No newline at end of file From 8061baa523eab6c8da2298b7cd4f06131d8fd8ac Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Mon, 15 Jan 2018 19:49:30 +0800 Subject: [PATCH 17/54] Fuck the git (Part.1) --- Meta/TouHou/TH11-Chireiden/Nuclear_Fusion.meta | 10 ---------- .../TH11-Chireiden/Hartmann_No_Youkai_Otome.meta | 10 ---------- Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta | 9 --------- 3 files changed, 29 deletions(-) delete mode 100644 Meta/TouHou/TH11-Chireiden/Nuclear_Fusion.meta delete mode 100644 Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta delete mode 100644 Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta diff --git a/Meta/TouHou/TH11-Chireiden/Nuclear_Fusion.meta b/Meta/TouHou/TH11-Chireiden/Nuclear_Fusion.meta deleted file mode 100644 index bf89920..0000000 --- a/Meta/TouHou/TH11-Chireiden/Nuclear_Fusion.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 232/3; -Instruments: {"AltoSax", "Bass", "BassDrum", "BrightPiano", "Clap", "CrashCymbal", "GuitarMuted", "HighTom", "HiHatClosed", "HiHatOpen", "HiHatPedal", "LowTom", "MidTom", "Piano", "Snare", "SopranoSax", "Square", "Strings", "Trumpet"}; -Messages: (章节5) 各音轨长度不统一:24, 24, 24, 24, 24, 24, 24, 64/3, 64/3, 64/3, 64/3, 64/3, 64/3; -SongName: 灵知的太阳信仰; -Composer: ZUN; -Adapter: Shigma; -Comment: 霊知の太陽信仰 ~ Nuclear Fusion; -Abstract: 东方地灵殿6面BOSS曲 灵乌路空主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta b/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta deleted file mode 100644 index 6b0c221..0000000 --- a/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 48; -Instruments: {"BrightPiano", "ElectricBass", "GuitarMuted", "Piano", "SopranoSax", "Strings", "SynthStrings"}; -Image: Touhou\Komeiji_Koishi.jpg; -SongName: 哈德曼的妖怪少女; -Composer: ZUN; -Adapter: Shigma; -Comment: ハルトマンの妖怪少女; -Abstract: 东方地灵殿EX面BOSS曲 古明地恋主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta b/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta deleted file mode 100644 index 521e4bb..0000000 --- a/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 4; -Duration: 99.869; -Instruments: {"ElectricBass", "ElectricPiano2", "Piano", "Violin"}; -Image: Touhou\Mizuhashi_Parsee.jpg; -SongName: 绿眼的嫉妒; -Composer: ZUN; -Comment: 緑眼のジェラシー; -Abstract: 东方地灵殿2面BOSS曲 水桥帕露西主题曲; \ No newline at end of file From 786962fb62d4d4e691c13d0826a54019a07c86be Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Mon, 15 Jan 2018 19:49:57 +0800 Subject: [PATCH 18/54] Fuck the git (Part.2) --- .../TH11-Chireiden/Hartmann_No_Youkai_Otome.meta | 10 ++++++++++ Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta | 10 ++++++++++ Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta | 9 +++++++++ 3 files changed, 29 insertions(+) create mode 100644 Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta create mode 100644 Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta create mode 100644 Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta diff --git a/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta b/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta new file mode 100644 index 0000000..6b0c221 --- /dev/null +++ b/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta @@ -0,0 +1,10 @@ +Format: qys; +TrackCount: 0; +Duration: 48; +Instruments: {"BrightPiano", "ElectricBass", "GuitarMuted", "Piano", "SopranoSax", "Strings", "SynthStrings"}; +Image: Touhou\Komeiji_Koishi.jpg; +SongName: 哈德曼的妖怪少女; +Composer: ZUN; +Adapter: Shigma; +Comment: ハルトマンの妖怪少女; +Abstract: 东方地灵殿EX面BOSS曲 古明地恋主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta b/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta new file mode 100644 index 0000000..bf89920 --- /dev/null +++ b/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta @@ -0,0 +1,10 @@ +Format: qys; +TrackCount: 0; +Duration: 232/3; +Instruments: {"AltoSax", "Bass", "BassDrum", "BrightPiano", "Clap", "CrashCymbal", "GuitarMuted", "HighTom", "HiHatClosed", "HiHatOpen", "HiHatPedal", "LowTom", "MidTom", "Piano", "Snare", "SopranoSax", "Square", "Strings", "Trumpet"}; +Messages: (章节5) 各音轨长度不统一:24, 24, 24, 24, 24, 24, 24, 64/3, 64/3, 64/3, 64/3, 64/3, 64/3; +SongName: 灵知的太阳信仰; +Composer: ZUN; +Adapter: Shigma; +Comment: 霊知の太陽信仰 ~ Nuclear Fusion; +Abstract: 东方地灵殿6面BOSS曲 灵乌路空主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta b/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta new file mode 100644 index 0000000..521e4bb --- /dev/null +++ b/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta @@ -0,0 +1,9 @@ +Format: qys; +TrackCount: 4; +Duration: 99.869; +Instruments: {"ElectricBass", "ElectricPiano2", "Piano", "Violin"}; +Image: Touhou\Mizuhashi_Parsee.jpg; +SongName: 绿眼的嫉妒; +Composer: ZUN; +Comment: 緑眼のジェラシー; +Abstract: 东方地灵殿2面BOSS曲 水桥帕露西主题曲; \ No newline at end of file From d7dc2b20944a183c3f627f5c770aed2b87db5ef3 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Mon, 15 Jan 2018 23:15:14 +0800 Subject: [PATCH 19/54] Add some adjustments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 优化了缓冲系统:多余的buffer文件已经能够自动删除了。 2. 新增歌单《东方Project》。 3. 为三首歌曲添加了配图。 4. 优化了播放界面:为图片添加了虚化边缘(部分png出现了黑底的问题,将在日后修复)。 5. 优化了播放界面:当程序判定标题过长时将自动分行显示。 6. 加长了歌单界面的宽度,同时缩短了主界面的宽度。 --- .../Touhou/TH11-Chireiden/Nuclear_Fusion.meta | 1 + .../TH15-Kanjuden/Pandemonic_Planet.meta | 1 + Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta | 1 + Meta/Touhou/Touhou_Mix_1.meta | 4 +- Playlists/Touhou.qyl | 34 +++++++++++++ QYMP.wl | 6 ++- interface.wl | 48 ++++++++++--------- library.wl | 4 +- playlist.json | 2 + style.json | 2 +- 10 files changed, 75 insertions(+), 28 deletions(-) create mode 100644 Playlists/Touhou.qyl diff --git a/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta b/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta index bf89920..69ab9bd 100644 --- a/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta +++ b/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta @@ -2,6 +2,7 @@ Format: qys; TrackCount: 0; Duration: 232/3; Instruments: {"AltoSax", "Bass", "BassDrum", "BrightPiano", "Clap", "CrashCymbal", "GuitarMuted", "HighTom", "HiHatClosed", "HiHatOpen", "HiHatPedal", "LowTom", "MidTom", "Piano", "Snare", "SopranoSax", "Square", "Strings", "Trumpet"}; +Image: Touhou\Reiuji_Utsuho.jpg; Messages: (章节5) 各音轨长度不统一:24, 24, 24, 24, 24, 24, 24, 64/3, 64/3, 64/3, 64/3, 64/3, 64/3; SongName: 灵知的太阳信仰; Composer: ZUN; diff --git a/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta b/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta index cd10bc2..38360a3 100644 --- a/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta +++ b/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta @@ -2,6 +2,7 @@ Format: qys; TrackCount: 20; Duration: 228; Instruments: {"BassDrum", "BassDrum2", "ChineseCymbal", "Clap", "ElectricBass", "ElectricGrandPiano", "EnglishHorn", "HiHatClosed", "Koto", "Maracas", "Snare", "Strings", "Violin", "Xylophone"}; +Image: Touhou\Hecatia_Lapislazuli.png; SongName: 嘈乱的星球; Composer: ZUN; Adapter: 触手猴 LittleRed; diff --git a/Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta b/Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta index a4fd75c..e3824b0 100644 --- a/Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta +++ b/Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta @@ -2,6 +2,7 @@ Format: qys; TrackCount: 0; Duration: 5/746; Instruments: {"BassDrum", "CrashCymbal2", "ElectricBass", "HiHatClosed", "Piano", "Snare", "SynthStrings2", "Violin"}; +Image: Touhou\Junko.png; SongName: Pure Furies ~ 心之所在; Composer: ZUN; Adapter: 触手猴 LittleRed; diff --git a/Meta/Touhou/Touhou_Mix_1.meta b/Meta/Touhou/Touhou_Mix_1.meta index aaf764c..25a6beb 100644 --- a/Meta/Touhou/Touhou_Mix_1.meta +++ b/Meta/Touhou/Touhou_Mix_1.meta @@ -2,8 +2,8 @@ SongName: 东方组曲第一弹; Format: qys; Composer: ZUN; Abstract: 行走在旧地狱街道上(旧地獄街道を行く):东方地灵殿3面道中曲 -魔法少女们的百年祭(魔法少女達の百年祭):东方红魔乡EX道中曲 -明日之盛·昨日之俗(明日ハレの日、ケの昨日):东方风神录EX道中曲; +魔法少女们的百年祭(魔法少女達の百年祭):东方红魔乡EX面道中曲 +明日之盛·昨日之俗(明日ハレの日、ケの昨日):东方风神录EX面道中曲; TrackCount: 6; Duration: 123.391; Instruments: {"Cello", "ElectricGrandPiano", "Flute", "Piano", "Violin", "Whistle"}; \ No newline at end of file diff --git a/Playlists/Touhou.qyl b/Playlists/Touhou.qyl new file mode 100644 index 0000000..8e10263 --- /dev/null +++ b/Playlists/Touhou.qyl @@ -0,0 +1,34 @@ +{ + "Title": "东方Project", + "Comment": "東方プロジェクト", + "Abstract": "", + "Path": "Touhou\\", + "SongList": [ + {"Index": "妖妖梦四面道中曲", "Song": "Tenkuu_Hana_Miyako"}, + {"Index": "妖妖梦四面BOSS曲", "Song": "Phantom_Ensemble"}, + {"Index": "妖妖梦六面BOSS曲", "Song": "Sumizome_Sakura"}, + {"Index": "妖妖梦PH面BOSS曲", "Song": "Necro_Fantasia"}, + {"Index": "永夜抄四面BOSS曲", "Song": "Dream_Battle"}, + {"Index": "风神录二面BOSS曲", "Song": "Dark_Side_of_Fate"}, + {"Index": "地灵殿二面BOSS曲", "Song": "TH11-Chireiden\\Ryokugann_No_Jealousy"}, + {"Index": "地灵殿六面BOSS曲", "Song": "TH11-Chireiden\\Nuclear_Fusion"}, + {"Index": "地灵殿EX面BOSS曲", "Song": "TH11-Chireiden\\Hartmann_No_Youkai_Otome"}, + {"Index": "星莲船六面道中曲", "Song": "Houkainohi"}, + {"Index": "绀珠传一面道中曲", "Song": "TH15-Kanjuden\\Wasuregataki"}, + {"Index": "绀珠传一面BOSS曲", "Song": "TH15-Kanjuden\\Usagi_ha_Mai_Orita"}, + {"Index": "绀珠传二面道中曲", "Song": "TH15-Kanjuden\\Mizuumi_Gekkou"}, + {"Index": "绀珠传二面BOSS曲", "Song": "TH15-Kanjuden\\Kyuugatsu_no_Pumpkin"}, + {"Index": "绀珠传三面道中曲", "Song": "TH15-Kanjuden\\Fushigi_Miko"}, + {"Index": "绀珠传三面BOSS曲", "Song": "TH15-Kanjuden\\Eien_no_Shyunmu"}, + {"Index": "绀珠传四面道中曲", "Song": "TH15-Kanjuden\\Koori_Tsuita_Eien_no_Miyako"}, + {"Index": "绀珠传四面BOSS曲", "Song": "TH15-Kanjuden\\Gyakutensuru_Wheel_of_Fortune"}, + {"Index": "绀珠传五面道中曲", "Song": "TH15-Kanjuden\\Haruka_38Man_Kilo_Voyage"}, + {"Index": "绀珠传五面BOSS曲", "Song": "TH15-Kanjuden\\Seijyouki_no_Pierrot"}, + {"Index": "绀珠传六面道中曲", "Song": "TH15-Kanjuden\\Kokyou_Hoshi_Utsuru_Umi"}, + {"Index": "绀珠传六面BOSS曲", "Song": "TH15-Kanjuden\\Pure_Furies"}, + {"Index": "绀珠传EX面道中曲", "Song": "TH15-Kanjuden\\Akumu_no_Sekai"}, + {"Index": "绀珠传EX面BOSS曲", "Song": "TH15-Kanjuden\\Pandemonic_Planet"}, + {"Index": "组曲串烧", "Song": "Touhou_Mix_1"} + ], + "IndexWidth": 240 +} \ No newline at end of file diff --git a/QYMP.wl b/QYMP.wl index a2ad5ea..669054c 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -17,6 +17,7 @@ refresh:=Module[ metaTree,songsClassified, playlistInfo,songList }, + SetDirectory[path]; metaTree=StringDrop[FileNames["*","Meta",Infinity],5]; songs=StringDrop[Select[metaTree,StringMatchQ[__~~".meta"]],-5]; dirList=Select[metaTree,!StringMatchQ[#,__~~".meta"]&]; @@ -93,7 +94,10 @@ updateImage:=Module[{updates={},image,filename,meta}, ]; -updateBuffer:=Module[{updates={},song,filename,hash,audio,messages}, +updateBuffer:=Module[{updates={},song,filename,hash,audio,messages,bufferList}, + SetDirectory[userPath]; + bufferList=StringTake[FileNames["*.buffer","buffer",Infinity],{8,-8}]; + DeleteFile[userPath<>"Buffer\\"<>#<>".buffer"]&/@Complement[bufferList,songs]; Do[ filename=path<>"Songs\\"<>song<>"."<>index[[song,"Format"]]; hash=toBase32@FileHash[filename]; diff --git a/interface.wl b/interface.wl index a97a58e..f2e10b4 100644 --- a/interface.wl +++ b/interface.wl @@ -126,12 +126,12 @@ uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, current=AudioPlay[audio]; CreateDialog[Row[{ If[imageExist,Row[{Spacer[48],Column[{Spacer[{40,40}], - Tooltip[Image[image,ImageSize->Piecewise[{ + Tooltip[ImageEffect[Image[image,ImageSize->Piecewise[{ {{Automatic,600},aspectRatio>2}, {{480,Automatic},aspectRatio<1/2}, {{Automatic,400},aspectRatio<1&&aspectRatio>1/2}, - {{300,Automatic},aspectRatio>1&&aspectRatio<2} - }]], + {{360,Automatic},aspectRatio>1&&aspectRatio<2} + }]],{"FadedFrame"}], If[KeyExistsQ[imageData,index[[song,"Image"]]], Column[If[KeyExistsQ[imageData[[index[[song,"Image"]]]],#], tagName[[#]]<>": "<>imageData[[index[[song,"Image"]],#]], @@ -142,12 +142,16 @@ uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, ], Spacer[{40,40}]}]}],Nothing],Spacer[48], Column[Join[{Spacer[{60,60}], - Row[{caption[index[[song,"SongName"]],"Title"], - If[KeyExistsQ[index[[song]],"Comment"], - caption[" ("<>index[[song,"Comment"]]<>")","TitleComment"], - Nothing - ] - }], + If[KeyExistsQ[index[[song]],"Comment"], + If[textLength@index[[song,"SongName"]]>16||textLength@index[[song,"Comment"]]>16, + Column, + Row + ][{ + caption[index[[song,"SongName"]],"Title"], + caption[" ("<>index[[song,"Comment"]]<>")","TitleComment"] + },Alignment->Center], + caption[index[[song,"SongName"]],"Title"] + ], Spacer[1], Column[If[KeyExistsQ[index[[song]],#], caption[tagName[[#]]<>": "<>index[[song,#]],"Text"], @@ -195,6 +199,7 @@ uiModifySong[song_]:=DynamicModule[{textInfo}, ignoreList={"temp.qys","test.qys"}; uiAddSong:=DynamicModule[{songPath,textInfo,candidates}, textInfo=AssociationMap[""&,textInfoTags]; + SetDirectory[path]; candidates=Complement[StringDrop[FileNames["*.qys"|"*.qym","Songs",Infinity],6], #<>"."<>index[[#,"Format"]]&/@songs, ignoreList @@ -299,7 +304,6 @@ uiPageSelector:=Row[{ QYMP:=DynamicModule[{playlist}, - refresh; pageCount=Ceiling[Length@playlists/16]; If[pageData[["Main"]]>pageCount,pageData[["Main"]]=pageCount]; playlistsPaged=Partition[playlists,UpTo@Ceiling[Length@playlists/pageCount]]; @@ -311,32 +315,32 @@ QYMP:=DynamicModule[{playlist}, DynamicModule[{style="Default"}, EventHandler[Dynamic@button["Play",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[uiPlaylist[playlist]];) + "MouseUp":>(style="Default";DialogReturn[pageData[["Main"]]=page;playlist;uiPlaylist[playlist]];) }] ], Spacer[10], DynamicModule[{style="Default"}, EventHandler[Dynamic@button["About",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[uiAbout];) + "MouseUp":>(style="Default";DialogReturn[pageData[["Main"]]=page;uiAbout];) }] ], Spacer[10], DynamicModule[{style="Default"}, EventHandler[Dynamic@button["Settings",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[uiSettings];) + "MouseUp":>(style="Default";DialogReturn[pageData[["Main"]]=page;uiSettings];) }] ], Spacer[10], DynamicModule[{style="Default"}, EventHandler[Dynamic@button["Exit",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[];) + "MouseUp":>(style="Default";DialogReturn[pageData[["Main"]]=page;];) }] ], Spacer[40] - },Alignment->Right,ImageSize->{480,56}] + },Alignment->Right,ImageSize->{320,56}] }], Spacer[1], Dynamic@Row[{Spacer[60],SetterBar[Dynamic@playlist, @@ -344,7 +348,7 @@ QYMP:=DynamicModule[{playlist}, Spacer[8], caption[playlistData[[#,"Title"]],"SongName"], Row[{Spacer[24],caption[playlistData[[#,"Comment"]],"SongComment"]}] - },ImageSize->{800,30}]&/@playlistsPaged[[page]], + },ImageSize->{640,30}]&/@playlistsPaged[[page]], Appearance->"Vertical" ],Spacer[60]}],Spacer[1], uiPageSelector, @@ -368,12 +372,12 @@ uiPlaylist[playlist_]:=DynamicModule[{song}, page=pageData[[playlist]]; CreateDialog[Column[{Spacer[{40,40}], Row[{ - Row[{Spacer[40],caption[playlistInfo[["Title"]],"BigTitle"]},Alignment->Left,ImageSize->320], + Row[{Spacer[40],caption[playlistInfo[["Title"]],"BigTitle"]},Alignment->Left,ImageSize->480], Row[{ DynamicModule[{style="Default"}, EventHandler[Dynamic@button["Play",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[uiPlayer[song]];) + "MouseUp":>(style="Default";DialogReturn[pageData[[playlist]]=page;uiPlayer[song]];) }] ], Spacer[10], @@ -381,14 +385,14 @@ uiPlaylist[playlist_]:=DynamicModule[{song}, DynamicModule[{style="Default"}, EventHandler[Dynamic@button["Modify",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[uiModifySong[song]];) + "MouseUp":>(style="Default";DialogReturn[pageData[[playlist]]=page;uiModifySong[song]];) }] ], Spacer[10], DynamicModule[{style="Default"}, EventHandler[Dynamic@button["Add",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[uiAddSong];) + "MouseUp":>(style="Default";DialogReturn[pageData[[playlist]]=page;uiAddSong];) }] ], Spacer[10]}], @@ -397,7 +401,7 @@ uiPlaylist[playlist_]:=DynamicModule[{song}, DynamicModule[{style="Default"}, EventHandler[Dynamic@button["ArrowL",style],{ "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";DialogReturn[QYMP];) + "MouseUp":>(style="Default";DialogReturn[pageData[[playlist]]=page;QYMP];) }] ], Spacer[40]},Alignment->Right,ImageSize->{480,56}] @@ -418,7 +422,7 @@ uiPlaylist[playlist_]:=DynamicModule[{song}, Row[{Spacer[24],caption[index[[#[["Song"]],"Comment"]],"SongComment"]}], Nothing ] - },ImageSize->{800,30}]&/@songListPaged[[page]], + },ImageSize->{960,30}]&/@songListPaged[[page]], Appearance->"Vertical" ],Spacer[60]}], Spacer[1], diff --git a/library.wl b/library.wl index eaf5293..d3a8eb4 100644 --- a/library.wl +++ b/library.wl @@ -1,7 +1,7 @@ (* ::Package:: *) version=201; -userPath="C:\\Users\\"<>$UserName<>"\\AppData\\Local\\QYMP\\"; +userPath=$HomeDirectory<>"\\AppData\\Local\\QYMP\\"; cloudPath="http://www.qymp.tk/assets/"; If[!DirectoryQ[userPath],CreateDirectory[userPath]]; If[!DirectoryQ[userPath<>"export\\"],CreateDirectory[userPath<>"export\\"]]; @@ -27,7 +27,6 @@ If[!FileExistsQ[userPath<>"Image.json"],Export[userPath<>"Image.json",{}]]; imageData=Association/@Association@Import[userPath<>"image.json"]; -SetDirectory[path]; instrData=Association@Import[path<>"instr.json"]; (* instruments *) colorData=Association@Import[path<>"color.json"]; (* colors *) styleColor=RGBColor/@Association@colorData[["StyleColor"]]; @@ -69,6 +68,7 @@ findMatch[score_,pos_]:=Module[ ]; Return[i]; ]; +textLength[string_]:=2StringLength[string]-StringCount[string,Alternatives@CharacterRange[32,127]]; toArgument[str_]:=If[StringContainsQ[str,","],ToExpression/@StringSplit[str,","],ToExpression@str]; toBase32[n_]:=StringDelete[ToString@BaseForm[n,32],"\n"~~__]; timeDisplay[t_]:=Module[ diff --git a/playlist.json b/playlist.json index b28fe00..3654106 100644 --- a/playlist.json +++ b/playlist.json @@ -2,5 +2,7 @@ "Chorus", "Piano", "Clannad", + "Touhou", + "TH11-Chireiden", "TH15-Kanjuden" ] \ No newline at end of file diff --git a/style.json b/style.json index 616b263..469155d 100644 --- a/style.json +++ b/style.json @@ -1,7 +1,7 @@ { "Text": {"FontSize": 20}, "Title": {"FontSize": 32, "FontWeight": "Bold", "FontFamily": "微软雅黑"}, - "TitleComment": {"FontSize": 32, "FontWeight": "Bold", "FontFamily": "微软雅黑", "FontColor": "Comment"}, + "TitleComment": {"FontSize": 28, "FontWeight": "Bold", "FontFamily": "微软雅黑", "FontColor": "Comment"}, "Subtitle": {"FontSize": 24, "FontWeight": "Bold", "FontFamily": "微软雅黑"}, "BigTitle": {"FontSize": 40, "FontWeight": "Bold", "FontFamily": "微软雅黑"}, "SongName": {"FontSize": 24, "FontFamily": "微软雅黑"}, From fe19189a7eb3e39d36626e4e8867425e74f573b4 Mon Sep 17 00:00:00 2001 From: NN708 Date: Tue, 16 Jan 2018 14:44:32 +0800 Subject: [PATCH 20/54] qymToken Part 1 --- qymToken.wl | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 qymToken.wl diff --git a/qymToken.wl b/qymToken.wl new file mode 100644 index 0000000..2b2bf49 --- /dev/null +++ b/qymToken.wl @@ -0,0 +1,74 @@ +(* ::Package:: *) + +qymTrackTokenizer[track_]:=Module[ + { + + }, + Return[{}]; +]; + +qymTokenizer[filename_]:=Module[ + { + (* Define variables *) + i, + content, + globalcomments,sections, + comments,globalsettings,tracks + }, + (* Read file *) + If[!FileExistsQ[filename], + MessageDialog[TextCell["File not found!"],WindowTitle->"Error"]; + Return[]; + ]; + content=Import[filename,"Lines"]; + (* Global comments *) + i=1; + globalcomments={}; + While[i<=Length[content] && StringLength[content[[i]]]>=2 && StringTake[content[[i]],2]=="//", + AppendTo[globalcomments,StringDrop[content[[i]],2]]; + i++; + ]; + (* Sections *) + sections={}; + While[i<=Length[content], + (* Blank lines *) + While[i<=Length[content] && content[[i]]=="", + i++; + ]; + (* Section comments *) + comments={}; + While[i<=Length[content] && StringLength[content[[i]]]>=2 && StringTake[content[[i]],2]=="//", + AppendTo[comments,StringDrop[content[[i]],2]]; + i++; + ]; + (* Global settings *) + globalsettings={}; + If[i<=Length[content] && content[[i]]!="" && StringTake[content[[i]],-1]==">", + globalsettings=qymTrackTokenizer[content[[i]]]; + i++; + ]; + (* Tracks *) + tracks={}; + While[i<=Length[content] && content[[i]]!="" && (StringLength[content[[i]]]<2 || StringTake[content[[i]],2]!="//"), + AppendTo[tracks,qymTrackTokenizer[content[[i]]]]; + i++; + ]; + (* Construct section *) + If[tracks!={} || comments!={} || globalsettings!={}, + AppendTo[sections,{ + "Comments"->comments, + "GlobalSettings"->globalsettings, + "Tracks"->tracks + }]; + ]; + ]; + (* Return tokenized data *) + Return[{ + "Comments"->globalcomments, + "Sections"->sections + }]; +]; + + +(* ::Input:: *) +(*ExportString[qymTokenizer[NotebookDirectory[]<>"Songs\\Frozen\\Let_It_Go.qym"],"JSON"]*) From 0f78cbba219f0782c1320fd06ec09095b5661a40 Mon Sep 17 00:00:00 2001 From: Kouchya <312533284@qq.com> Date: Wed, 17 Jan 2018 00:18:16 +0800 Subject: [PATCH 21/54] Added a new song. Taeta Hashi And someone seems to think it's hard to write a song without an online score ;-) --- Meta/Touhou/TH11-Chireiden/Taeta_Hashi.meta | 10 + Playlists/TH11-Chireiden.qyl | 1 + Playlists/Touhou.qyl | 1 + Songs/Touhou/Houkainohi.qys | 2 +- Songs/Touhou/TH11-Chireiden/Taeta_Hashi.qys | 250 ++++++++++++++++++++ 5 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 Meta/Touhou/TH11-Chireiden/Taeta_Hashi.meta create mode 100644 Songs/Touhou/TH11-Chireiden/Taeta_Hashi.qys diff --git a/Meta/Touhou/TH11-Chireiden/Taeta_Hashi.meta b/Meta/Touhou/TH11-Chireiden/Taeta_Hashi.meta new file mode 100644 index 0000000..a7c18c2 --- /dev/null +++ b/Meta/Touhou/TH11-Chireiden/Taeta_Hashi.meta @@ -0,0 +1,10 @@ +Format: qys; +TrackCount: 0; +Duration: 2862/29; +Instruments: {"BassDrum2", "ElectricBass", "ElectricGrandPiano", "Flute", "HiHatClosed", "Koto", "Marimba", "MelodicTom", "Shaker", "Snare", "Sticks", "Strings2", "Violin"}; +Messages: ; +SongName: 无人渡过之桥; +Composer: ZUN; +Adapter: LittleRed; +Comment: 渡る者の途絶えた橋; +Abstract: 东方地灵殿2面道中曲; \ No newline at end of file diff --git a/Playlists/TH11-Chireiden.qyl b/Playlists/TH11-Chireiden.qyl index cf3aca2..ca70478 100644 --- a/Playlists/TH11-Chireiden.qyl +++ b/Playlists/TH11-Chireiden.qyl @@ -4,6 +4,7 @@ "Abstract": "", "Path": "Touhou\\TH11-Chireiden\\", "SongList": [ + {"Index": "二面道中曲", "Song": "Taeta_Hashi"}, {"Index": "二面BOSS曲", "Song": "Ryokugann_No_Jealousy"}, {"Index": "六面BOSS曲", "Song": "Nuclear_Fusion"}, {"Index": "EX面BOSS曲", "Song": "Hartmann_No_Youkai_Otome"} diff --git a/Playlists/Touhou.qyl b/Playlists/Touhou.qyl index 8e10263..2a4396b 100644 --- a/Playlists/Touhou.qyl +++ b/Playlists/Touhou.qyl @@ -10,6 +10,7 @@ {"Index": "妖妖梦PH面BOSS曲", "Song": "Necro_Fantasia"}, {"Index": "永夜抄四面BOSS曲", "Song": "Dream_Battle"}, {"Index": "风神录二面BOSS曲", "Song": "Dark_Side_of_Fate"}, + {"Index": "地灵殿二面道中曲", "Song": "TH11-Chireiden\\Taeta_Hashi"}, {"Index": "地灵殿二面BOSS曲", "Song": "TH11-Chireiden\\Ryokugann_No_Jealousy"}, {"Index": "地灵殿六面BOSS曲", "Song": "TH11-Chireiden\\Nuclear_Fusion"}, {"Index": "地灵殿EX面BOSS曲", "Song": "TH11-Chireiden\\Hartmann_No_Youkai_Otome"}, diff --git a/Songs/Touhou/Houkainohi.qys b/Songs/Touhou/Houkainohi.qys index 212b639..d04ed63 100644 --- a/Songs/Touhou/Houkainohi.qys +++ b/Songs/Touhou/Houkainohi.qys @@ -73,7 +73,7 @@ 0---|0---|0---|0---\ 0---|0---|0---|0---\|| -<1=C><0.4>\ +<1=C><0.4>\ 0---|0---|0---|0---\ 0---|0---|0---|0---\ 0---|0---|0---|0---\ diff --git a/Songs/Touhou/TH11-Chireiden/Taeta_Hashi.qys b/Songs/Touhou/TH11-Chireiden/Taeta_Hashi.qys new file mode 100644 index 0000000..1e6c711 --- /dev/null +++ b/Songs/Touhou/TH11-Chireiden/Taeta_Hashi.qys @@ -0,0 +1,250 @@ +//无人渡过之桥(东方地灵殿2面道中曲) +//ZUN 曲 +//LittleRed 改编 + +//------------------------------ Sec A ------------------------------ + +<4/4><145> + +<1=C><0.5>\ +0---|0---|0---|0---\ +[14]#_[61'#]_[15]#_[61'#]_[14]#_[61'#]__[13]#_.[61'#]_|[14]#_[61'#]_[15]#_[61'#]_[14]#_[61'#]__[13]#_.[61'#]_\ +[14]#_[61'#]_[15]#_[61'#]_[14]#_[61'#]__[13]#_.[61'#]_|[14]#_[61'#]_[15]#_[61'#]_[14]#_[61'#]__[13]#_.[61'#]_\ +[14]#_[61'#]_[15]#_[61'#]_[14]#_[61'#]__[13]#_.[61'#]_|[14]#_[61'#]_[15]#_[61'#]_[14]#_[61'#]__[13]#_.[61'#]_\ +[14]#_[61'#]_[15]#_[61'#]_[14]#_[61'#]__[13]#_.[61'#]_|[14]#_[61'#]_[15]#_[61'#]_[14]#_[61'#]__[13]#_.[61'#]_|| + +<1=C,><0.3>\ +1#`_5#`_6`_5#`_1#`_5#`__4#`__1#`_5#`_|1#`_5#`_6`_5#`_1#`_5#`__4#`__1#`_5#`_|1#`_5#`_6`_5#`_1#`_5#`__4#`__1#`_5#`_|1#`_5#`_6`_5#`_1#`_5#`__4#`__1#`_5#`_\ +0---|0---|0---|0---\ +0---|0---|0---|0---|| + +<1=C,><0.4>\ +[45]#---^|[14]#---^|[45]#---^|[14]#---\ +[45]#---^|[14]#---^|[45]#---^|[14]#---\ +[45]#---^|[14]#---^|[45]#---^|[14]#---|| + +<1=C,,><0.7>\ +0---|0---|0---|0-1'#__4'#__6__1'#__1#__4#__4,#_\ +[1#4#6]-%0|0---|%-%0|0--%\ +%--%|0---|%-%0|0---|| + +<1=C><0.2>\ +0---|0---|0---|0---\ +5#-5#0|0-5#_.1#_.1,#_|1,#-1#0|5#_.1,#_.5#_1#1#\ +5#-5#0|0-5#_.1#_.1,#_|1,#-1#0|5#_.1,#_.5#_1#1#|| + +<1=C><0.4>\ +xxx_.x__x|xx_.x__x_.x__x|xxx_.x__x|xx_.x__x_.x__x\ +xxx_.x__x|xx_.x__x_.x__x|xxx_.x__x|xx_.x__x_.x__x\ +xxx_.x__x|xx_.x__x_.x__x|xxx_.x__x|xx_.x__x_.x__x__x__x__x__|| + +<1=C><0.2>\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.x__x__x__x__x__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_|| + +<1=C><0.4>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0-xx__x__x_|| + +<1=C><0.2>\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx|| + +//------------------------------ Sec B ------------------------------ + +<4/4><145> + +<1=C><0.6>\ +[24#]_[61'#]_[24#]_[61'#]_[24#]_[61'#]__[6,1#]_.[61'#]_|[24#]_[61'#]_[24#]_[61'#]_[24#]_[61'#]__[6,1#]_.[61'#]_\ +[1#3]_[5#7]_[1#3]_[5#7]_[1#3]_[5#7]__[5#7],_.[5#7]_|[1#3]_[5#7]_[1#3]_[5#7]_[1#3]_[5#7]__[5#7],_.[5#7]_\ +[24#]_[61'#]_[24#]_[61'#]_[24#]_[61'#]__[6,1#]_.[61'#]_|[37]_[1#3]'_[37]_[1#3]'_[37]_[1#3]'_[37]_[1#3]'_\ +[14]#_[61'#]_[14]#_[61'#]_[14]#_[61'#]__[14]#__[14]#_[61'#]_|[14]#_[61'#]_[14]#_[61'#]_[14]#_[61'#]__[14]#__[14]#_[61'#]_\ +[24#]_[61'#]_[24#]_[61'#]_[24#]_[61'#]__[6,1#]_.[61'#]_|[24#]_[61'#]_[24#]_[61'#]_[24#]_[61'#]__[6,1#]_.[61'#]_\ +[1#3]_[5#7]_[1#3]_[5#7]_[1#3]_[5#7]__[5#7],_.[5#7]_|[1#3]_[5#7]_[1#3]_[5#7]_[1#3]_[5#7]__[5#7],_.[5#7]_\ +[24#]_[61'#]_[24#]_[61'#]_[24#]_[61'#]__[6,1#]_.[61'#]_|[37]_[1#3]'_[37]_[1#3]'_[37]_[1#3]'_[37]_[1#3]'_\ +[14]#_[61'#]_[14]#_[61'#]_[14]#_[61'#]__[14]#__[14]#_[61'#]_|[14]#_[61'#]_[14]#_[61'#]_[14]#_[61'#]__[14]#__[14]#_[61'#]_\ +[14]#_[61'#]_[14]#_[61'#]_[14]#_[61'#]__[14]#__[14]#_[61'#]_|[14]#_[61'#]_[14]#_[61'#]_[14]#_[61'#]__[14]#__[14]#_[61'#]_\ +[14]#_[61'#]_[14]#_[61'#]_[14]#_[61'#]__[14]#__[14]#_[61'#]_|[14]#_[61'#]_[14]#_[61'#]_[14]#_[61'#]__[14]#__[14]#_[61'#]_\ +[14]#_[61'#]_[14]#_[61'#]_[14]#_[61'#]__[14]#__[14]#_[61'#]_|[14]#_[61'#]_[14]#_[61'#]_[14]#_[61'#]__[14]#__[14]#_[61'#]_\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +[46](1=)[61']---|[46](1=)[61']-[46](1=)[13]'-|[37](1=)[72']---|[37]_[72']_[36](2=)[72']-[37]_[72']_\ +[46](1=)[13]'---|[13]'(1=)[35]'---|[46](1=)[61']--0|[46](1=)[61']--0\ +[46](1=)[61']---|[46](1=)[61']-[46](1=)[13]'-|[37](1=)[72']---|[37]_[72']_[36](2=)[72']-[37]_[72']_\ +[46](1=)[13]'---|[13]'(1=)[35]'---|<120>[46](1=)[61']---|<60>[46]---|| + +<1=C><0.6>\ +[24#]'---|3'-6'-|[14]'#---|1'#--1'#_3'_\ +[24#]'--4'#_6'_|[37]'[41']'#[37]'3'|[14]'#---^|%---\ +[24#]'---|3'-6'-|[14]'#---|1'#--1'#_3'_\ +[24#]'--4'#_6'_|[37]'[41']'#[37]'3'|[14]'#---^|%---\ +0---|0---|0---|0---\ +0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|<120>0---|<60>0---|| + +<1=C><0.8>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +4'#---|3'-6'-|4'#---^|%--1'#_3'_\ +4'#--4'#_6'_|7'1''#7'3'|4'#---^|%---\ +0---|0---|0---|0---\ +0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +6'---|5'-1''-|6'---|7'--3'_5'_\ +6'--6'_1''_|2''3''2''5'|<120>6'---^|<60>%---|| + +<1=C,,><1.3>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|4#o`_[61'#]o`_5#o`_[61'#]o`_4#o`_[61'#]o`__4#o`__4#o`_[61'#]o`_|4#o`_[61'#]o`_5#o`_[61'#]o`_4#o`_[61'#]o`__4#o`__4#o`_[61'#]o`_\ +4#o`_[61'#]o`_5#o`_[61'#]o`_4#o`_[61'#]o`__4#o`__4#o`_[61'#]o`_|4#o`_[61'#]o`_5#o`_[61'#]o`_4#o`_[61'#]o`__4#o`__4#o`_[61'#]o`_\ +<1=C,>4#o`_[61'#]o`_5#o`_[61'#]o`_4#o`_[61'#]o`__4#o`__4#o`_[61'#]o`_|4#o`_[61'#]o`_5#o`_[61'#]o`_4#o`_[61'#]o`__4#o`__4#o`_[61'#]o`_\ +<1=C>4#p`_6p`_5#p`_6p`_4#p`_6p`__4#p`__4#p`_6p`_|4#p`_6p`_5#p`_6p`_4#p-\ +4,#o---|[35#]---|[26]--[261'#]|1#M--[5#6]\ +[37]-3o-|[24#]'-[27]2o|[1#3]'---|[74'#]-[15]'#-\ +[46]'---|[45]'-[41']'-|[7,36]'---|[73']--[73']_[35]'_\ +[46]'--[46]'_[41']'_|[52']'[53']'[52']'5o|6p---^|%---\ +[46]'---|[45]'-[41']'-|[7,36]'---|[73']--[73']_[35]'_\ +[46]'--[46]'_[41']'_|[52']'[53']'[52']'5o|<120>6p---^|<60>%---|| + +<1=C><0.4>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---\ +0_[4#6]__[35#]__[35#]_[4#6]_0_[4#6]_[35#]_[4#6]_|0_[5#7]__[35#]__[35#]_[5#7]_0_[35#]_[35#]_[5#7]_\ +0_[36]__[25#]__[25#]_[51']#_0_[36]_[25#]_[25#]_|0_[14]#__[14]#__[4#7]_[14]#_0_[14]#_[14]#_[4#7]_\ +7__3'__4'#__5'#__4'#__3'__4'#__1'#__3'__4'#__5'#__4'#__5'#__4'#__4'#__1'#__|3'__5'#__6'__5'#__6'__5'#__6'__6'__3'__1'#__1'#__5#__3__1#__1#__5,#__\ +7__3'__4'#__5'#__4'#__3'__7__3'__7__3'__4'#__3'__4'#__3'__7__3'__|3'__7__3'__7__3'__7__4'#__5'#__7__3'__4'#__3'__4'#__3'__4'#__5'#__\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|<120>0---|<60>0---|| + +<1=C,><0.6>\ +[24#]---^|%---|[5,1]#---^|%---\ +[6,2]---|[7,3]---|[14]#---^|%---\ +[24#]---^|%---|[5,1]#---^|%---\ +[6,2]---|[7,3]---|[14]#---^|%---\ +[45]#---^|[14]#---^|[45]#---^|[14]#---\ +[45]#---^|[14]#---\ +[14]#---|[7,3]---|[6,2]---|[5,1]#---\ +[7,3]---|[24#]---|[1#3]---|[24#]-[35]#-\ +[46]---^|%---^|[37],---^|%---\ +[46]---|[5,2][5,3][5,2]5,o|6,p---^|%---\ +[46]---^|%---^|[37],---^|%---\ +[46]---|[5,2][5,3][5,2]5,o|<120>6,p---|<60>0---|| + +<1=C,,><0.7>\ +[24#]-%0|0---|[5,1]#-%0|0--%\ +[6,2]--%|[7,3]`%`%`%`|[14]#-%0|0---\ +[24#]-%0|0---|[5,1]#-%0|0--%\ +[6,2]--%|[7,3]`%`%`%`|[14]#-%0|0---\ +[1#4#6]-%-|%-%-|%--%|%-%-\ +%--%|%---\ +[14]#`--%`|[7,3]`--%`|[6,2]`--%`|[5,1]#`--%`\ +[7,3]`-%`-|[24#]`--%`|[1#3]-%-|[24#]-[35]#-\ +[14].%.%|%---|[7,3].%.%|%---\ +[14].%.%|[25]`%`%`%`|[36]---|%--%\ +[14].%.%|%---|[7,3].%.%|%---\ +[14].%.%|[25]`%`%`%`|<120>[36]---^|<60>%---|| + +<1=C><0.2>\ +6-60|0-6_.2_.2,_|2,-20|6_.2_.2,_2,2,\ +6-60|0-6_.2_.2,_|2,-20|6_.2_.2,_2,2,\ +6-60|0-6_.2_.2,_|2,-20|6_.2_.2,_2,2,\ +6-60|0-6_.2_.2,_|2,-20|6_.2_.2,_2,2,\ +6-60|0-6_.2_.2,_|2,-20|6_.2_.2,_2,2,\ +6-60|66__6__6__6__6-\ +0---|0---|0---|0---\ +2,-2,-|0-6-|0.6.0|0.6.0\ +0.6.0|6.6.0|0.6.0|6.6.0\ +0.6.0|6.6.0|0.6.0|6.6.0\ +0---|0---|0---|0---\ +0---|0---|<120>0---|<60>0---|| + +<1=C><0.4>\ +xxx_.x__x|xx_.x__x_.x__x|xxx_.x__x|xx_.x__x_.x__x\ +xxx_.x__x|xx_.x__x_.x__x|xxx_.x__x|xx_.x__x_.x__x\ +xxx_.x__x|xx_.x__x_.x__x|xxx_.x__x|xx_.x__x_.x__x\ +xxx_.x__x|xx_.x__x_.x__x|xxx_.x__x|xx_.x__x_.x__x\ +xxx_.x__x|xx_.x__x_.x__x|xxx_.x__x|xx_.x__x_.x__x\ +xxx_.x__x|xx_.x__x_.x__x\ +xxx_.x__x|xx_.x__x_.x__x|xxx_.x__x|xx_.x__x_.x__x\ +xxx_.x__x|xx_.x__x_.x__x|xxx_.x__x|x__x__x__x__x__x__x__x__x__x__x__x__x__x__x__x__\ +xxxx|x_x__x__x_x__x__x_x__x__x_x__x__|xxxx|x_x__x__x_x__x__x_x__x__x_x__x__\ +xxxx|x_x__x__x_x__x__x_x__x__x_x__x__|xxxx|x_x__x__x_x__x__x_x__x__x_x__x__\ +x---|x---|x---|xx--\ +x---|xxxx|<120>0---|<60>0---|| + +<1=C><0.2>\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0x__x_.x_.x_.x_|0x__x_.xx__x__x_|0x__x_.x_.x_.x_|0x__x_.xx__x__x_\ +0---|0---|0---|0---\ +0---|0---|<120>0---|<60>0---|| + +<1=C><0.4>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|x_x_x_x_x__x__x__x__x__x__x__x__\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_|x_x_x_x_x_x_x_x_\ +0---|0---|0---|0---\ +0---|0---|<120>0---|<60>0---|| + +<1=C><0.2>\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx\ +0---|0---|0---|0---\ +0---|0---|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_|0_x_0_x_0_x_0_x_\ +0---|0---|0---|0---\ +0---|0---|<120>0---|<60>0---|| + +<1=C><0.2>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0---\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0-x-|0-x-|0-x-|0-x-\ +0-x-|0-x-|0-x-|0-x-\ +0-x-|0-x-|0-x-|0-x-\ +0-x-|xxxx|<120>x---|<60>0---|| + + \ No newline at end of file From 4829a601286e70c167967bb8fb7966571b06f507 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Wed, 17 Jan 2018 12:00:08 +0800 Subject: [PATCH 22/54] Optimize the qys tokenizer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 引入了对/标记和子音轨的支持。 2. 针对新的tokenizer语法规范做出了相应的更改。 3. 引入新函数Trace,功能将在未来实装。 --- library.wl | 17 ++- parser.wl | 122 ++++++++++++++++++++++ qysToken.wl | 296 ++++++++++++++++------------------------------------ 3 files changed, 225 insertions(+), 210 deletions(-) create mode 100644 parser.wl diff --git a/library.wl b/library.wl index 6a2ae13..8c348c6 100644 --- a/library.wl +++ b/library.wl @@ -27,6 +27,7 @@ If[!FileExistsQ[userPath<>"Image.json"],Export[userPath<>"Image.json",{}]]; imageData=Association/@Association@Import[userPath<>"image.json"]; +path=NotebookDirectory[]; instrData=Association@Import[path<>"instr.json"]; (* instruments *) colorData=Association@Import[path<>"color.json"]; (* colors *) styleColor=RGBColor/@Association@colorData[["StyleColor"]]; @@ -69,7 +70,10 @@ findMatch[score_,pos_]:=Module[ Return[i]; ]; textLength[string_]:=2StringLength[string]-StringCount[string,Alternatives@CharacterRange[32,127]]; -toArgument[str_]:=If[StringContainsQ[str,","],ToExpression/@StringSplit[str,","],ToExpression@str]; +toArgument[str_]:=If[StringContainsQ[str,","], + ToExpression/@StringSplit[str,","], + ToExpression@str +];(* this part will be deleted before ver 1.6 release *) toBase32[n_]:=StringDelete[ToString@BaseForm[n,32],"\n"~~__]; timeDisplay[t_]:=Module[ {sec=Floor[QuantityMagnitude[UnitConvert[t,"Seconds"]]]}, @@ -102,13 +106,22 @@ pitchDict=<|"1"->0,"2"->2,"3"->4,"4"->5,"5"->7,"6"->9,"7"->11|>; pitchOpDict=<| "#"->1,"b"->-1,"'"->12,","->-12,"M"->{0,4,7},"m"->{0,3,7}, "a"->{0,4,8},"d"->{0,3,6},"p"->{0,7,12},"o"->{0,12} +|>;(* this part will be deleted before ver 1.6 release *) +chordDict=<| + "M"->{0,4,7},"m"->{0,3,7},"a"->{0,4,8}, + "d"->{0,3,6},"p"->{0,7,12},"o"->{0,12} |>; pitchOpDefault={"SemitonesCount"->0,"OctavesCount"->0,"ChordSymbol"->""}; pitchOpList=Append[Keys[pitchOpDict],"$"]; +getArgument[string_,function_]:=Switch[function, + "Instr",{string}, + "Volume"|"Chord",ToExpression/@StringSplit[string,","], + _,ToExpression[string] +]; defaultParameter=<| "Volume"->1,"Speed"->90,"Key"->0,"Beat"->4,"Bar"->4,"Instr"->"Piano", "Dur"->0,"FadeIn"->0,"FadeOut"->0,"Stac"->1/2,"Appo"->1/4,"Oct"->0, - "Port"->6,"Spac"->0,"Chord"->{0,12} + "Port"->6,"Spac"->0,"Chord"->{0,12},"Trace"->1 |>; funcList=Keys@defaultParameter; diff --git a/parser.wl b/parser.wl new file mode 100644 index 0000000..2045981 --- /dev/null +++ b/parser.wl @@ -0,0 +1,122 @@ +(* ::Package:: *) + +beatCalc[operators_]:=Module[{beats=1,i=1}, + Do[ + Switch[operator, + "-",beats+=1, + "_",beats/=2, + _,beats*=2-2^(-StringLength@operator) + ], + {operator,StringCases[operators,{"-","_","."..}]}]; + Return[beats]; +]; + + +pitchDict=<|0->None,1->0,2->2,3->4,4->5,5->7,6->9,7->11|>; +pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol}, + If[KeyExistsQ[token,"Pitches"], + pitches=Flatten[pitchCalc[#,settings,previous]&/@Association/@token[["Pitches"]]], + pitches=Switch[token[["ScaleDegree"]], + -1,previous[[settings[["Trace"]]]], + _,Key[token[["ScaleDegree"]]]@pitchDict + ] + ]; + pitches+=settings[["Key"]]+12*settings[["Oct"]]; + If[KeyExistsQ[token,"SemitonesCount"],pitches+=token[["SemitonesCount"]]]; + If[KeyExistsQ[token,"OctavesCount"],pitches+=token[["OctavesCount"]]]; + If[KeyExistsQ[token,"ChordSymbol"], + chordSymbol=token[["ChordSymbol"]]; + Switch[chordSymbol, + "$",pitches+=settings[["Chord"]], + Except[""],pitches+=chordDict[[chordSymbol]] + ]; + ]; + Return[pitches]; +]; + + +(* ::Input:: *) +(*pitchCalc[Association[QYSTrackTokenize["3"][[1]]],defaultParameter,Array[None&,4]]*) + + +trackParse[tokens_,global_]:=Module[ + { + i,settings=global, + functionData, + pitches,percussion, + beatCount,duration, + barBeat, + + (* notations *) + appoggiatura={}, + tuplet=0,tupletTime, + previous=Array[None&,4], + + (* return value *) + soundData={},trackDuration=0, + messages={},instruments={} + }, + Do[ + Switch[token[["Type"]], + "FunctionToken", (* function *) + functionData=Association@token[["Argument"]]; + Do[ + settings[[function]]=functionData[[function]], + {function,Keys@functionData}], + "Appoggiatura", (* appoggiatura *) + appoggiatura=pitchCalc[token,settings,previous], + "Note", (* note *) + If[token, + pitches=pitchCalc[token,settings,previous]; + previous=Prepend[Drop[previous,-1],pitches]; + ]; + beatCount=beatCalc[token[["DurationOperators"]]]; + beatCount*=2^(-settings[["Dur"]]); + If[tuplet>0,beatCount*=tupletTime;tuplet--]; + barBeat+=beatCount; + duration=240/settings[["Speed"]]/settings[["Beat"]]*beatCount; + trackDuration+=duration; + ], + {token,Association/@tokens}]; + Return[<| + "SoundData"->soundData, + "Duration"->duration, + "Messages"->messages, + "Instruments"->instruments + |>] +]; + + +(* ::Input:: *) +(*trackParse[Association/@QYSTrackTokenize["13%#-"],defaultParameter]*) + + +parse[tokenizer_]:=Module[ + { + audio,settings, + functionData, + trackData + }, + settings=defaultParameter; + Do[ + Do[ + functionData=Association@token[["Argument"]]; + Do[ + settings[[function]]=functionData[[function]], + {function,Keys@functionData}], + {token,Association/@sectionToken[["GlobalSettings"]]}]; + Do[ + trackData=trackParse[trackToken,settings]; + Print[trackData], + {trackToken,sectionToken[["Tracks"]]}]; + , + {sectionToken,Association/@Association[tokenizer][["Sections"]]}]; + Return[]; +]; + + +(* ::Input:: *) +(*parse[QYSTokenize[path<>"Songs\\test.qys"]];*) + + + diff --git a/qysToken.wl b/qysToken.wl index 5871970..d5aaf9e 100644 --- a/qysToken.wl +++ b/qysToken.wl @@ -1,218 +1,92 @@ (* ::Package:: *) -getPitchOp[score_,pos_]:=Module[ - { - i=pos,char, - semitones=0,octaves=0,chordSymbol="" - }, - While[i<=StringLength@score && MemberQ[pitchOpList,StringPart[score,i]], - char=StringPart[score,i]; - Switch[char, - "#",semitones++, - "b",semitones--, - "'",octaves++, - ",",octaves--, - _,chordSymbol=char - ]; - i++; - ]; - Return[{{ - "SemitonesCount"->semitones, - "OctavesCount"->octaves, - "ChordSymbol"->chordSymbol - },i}]; -]; +(* ::Input:: *) +(*While[$Context!="Global`",End[]];*) -QYSTrackTokenize[score_]:=Module[ +(* Here is the beginning of context QYS` *) +Begin["QYS`"]; +Subtrack=Nest[(("{"~~#~~"}")|Except["}"])...&,Except["}"],8]; +InstrVolume=(LetterCharacter~~WordCharacter...~~(""|("("~~NumberString~~")"))); +PitOperator=Alternatives[Characters@"abdMmop#$,'"]...; +DurOperator=Alternatives[Characters@"-_.`"]...; +Pitch="%"|"x"|DigitCharacter~~PitOperator; +getInsVolToken[ivList_]:={ + "Instr"->StringDelete["("~~__~~")"]/@ivList, + If[Or@@StringContainsQ["("]/@ivList, + "Volume"->If[StringContainsQ[#,"("], + StringCases[#,"("~~vol__~~")":>ToExpression@vol][[1]], + 1.0]&/@ivList, + Nothing] +}; +getPitchToken[pitch_]:=StringCases[pitch, + pitSd:("%"|"x"|DigitCharacter)~~pitOp:PitOperator:> { - tokens={},i=1,j, - char,match,content, - function,argument,position, - notes,pitchOpData,pitches, - pitchOperators, - staccato,arpeggio, - semitones,octaves, - durOperators,chordSymbol - }, - While[i<=StringLength[score], - char=StringPart[score,i]; - Switch[char, - "|"|"\\", - AppendTo[tokens,{ - "Type"->"Barline", - "Newline"->(char=="\\") - }]; - i++, - "<", - match=Select[Transpose[StringPosition[score,">"]][[1]],#>i&][[1]]; - content=StringTake[score,{i+1,match-1}]; - Which[ - StringContainsQ[content,":"], (* function *) - position=StringPosition[content,":"][[1,1]]; - function=StringTake[content,position-1]; - argument=toArgument@StringDrop[content,position]; - AppendTo[tokens,{ - "Type"->"FunctionToken", - "Name"->function, - "Argument"->argument - }], - StringContainsQ[content,"="], (* key&oct *) - AppendTo[tokens,{ - "Type"->"FunctionSimplified", - "Argument"->{ - "Key"->tonalityDict[[StringDelete[StringTake[content,{3,StringLength@content}],","|"'"]]], - "Oct"->StringCount[content,"'"]-StringCount[content,","] - } - }], - StringContainsQ[content,"/"], (* bar&beat *) - position=StringPosition[content,"/"][[1,1]]; - AppendTo[tokens,{ - "Type"->"FunctionSimplified", - "Argument"->{ - "Bar"->ToExpression[StringTake[content,position-1]], - "Beat"->ToExpression[StringDrop[content,position]] - } - }], - StringContainsQ[content,"."], (* volume *) - AppendTo[tokens,{ - "Type"->"FunctionSimplified", - "Argument"->{"Volume"->ToExpression[content]} - }], - StringMatchQ[content,NumberString], (* speed *) - AppendTo[tokens,{ - "Type"->"FunctionSimplified", - "Argument"->{"Speed"->ToExpression[content]} - }], - True, (* instrument *) - AppendTo[tokens,{ - "Type"->"FunctionSimplified", - "Argument"->{"Instr"->content} - }] - ]; - i=match+1, - "(", - match=Select[Transpose[StringPosition[score,")"]][[1]],#>i&][[1]]; - content=StringTake[score,{i+1,match-2}]; - Switch[StringTake[score,{match-1}], - "~", (* tuplet *) - AppendTo[tokens,{ - "Type"->"Tuplet", - "NoteCount"->ToExpression[content] - }], - "-", (* single tremolo *) - AppendTo[tokens,{ - "Type"->"Tremolo1", - "StrokeCount"->ToExpression[content] - }], - "=", (* double tremolo *) - AppendTo[tokens,{ - "Type"->"Tremolo2", - "StrokeCount"->ToExpression[content] - }], - "^", (* appoggiatura *) - j=1; - pitches={}; - While[j<=StringLength[content] && DigitQ@StringPart[content,j], - pitchOpData=getPitchOp[content,j+1]; - pitchOperators=pitchOpData[[1]]; - AppendTo[pitches,Prepend[ - pitchOperators, - "ScaleDegree"->ToExpression@StringPart[content,j] - ]]; - j=pitchOpData[[2]]; - ]; - AppendTo[tokens,{ - "Type"->"Appoggiatura", - "Notes"->pitches - }] - ]; - i=match+1, - "~", (* portamento *) - AppendTo[tokens,{"Type"->"Portamento"}]; - i++, - "^", (* tie *) - AppendTo[tokens,{"Type"->"Tie"}]; - i++, - _, - arpeggio=False; - staccato=False; - If[char=="[", - (* a list of pitches *) - match=Select[Transpose[StringPosition[score,"]"]][[1]],#>i&][[1]]; - content=StringTake[score,{i+1,match-1}]; - arpeggio=StringContainsQ[content,"^"]; - content=StringDelete[content,"^"]; - j=1; - pitches={}; - While[j<=StringLength[content] && DigitQ@StringPart[content,j], - pitchOpData=getPitchOp[content,j+1]; - pitchOperators=pitchOpData[[1]]; - AppendTo[pitches,Prepend[pitchOperators,"ScaleDegree"->ToExpression@StringPart[content,j]]]; - j=pitchOpData[[2]]; - ]; - i=match+1; - pitchOpData=getPitchOp[score,i]; - pitchOperators=pitchOpData[[1]]; - i=pitchOpData[[2]], - (* one pitch *) - pitchOpData=getPitchOp[score,i+1]; - pitchOperators=pitchOpData[[1]]; - i=pitchOpData[[2]]; - pitches={Prepend[ - pitchOperators, - "ScaleDegree"->Switch[char, - "x",10, - "%",-1, - _,ToExpression@char - ] - ]}; - pitchOperators=pitchOpDefault; - ]; - durOperators={}; - While[i<=StringLength[score] && MemberQ[{"-","_",".","`"},StringPart[score,i]], - char=StringPart[score,i]; - If[char=="`", - staccato=True, - AppendTo[durOperators,char] - ]; - i++; - ]; - AppendTo[tokens,{ - "Type"->"Note", - "Pitches"->pitches, - pitchOperators[[1]], - pitchOperators[[2]], - "Staccato"->staccato, - "Arpeggio"->arpeggio, - "DurationOperators"->durOperators - }]; - ]; - ]; - Return[tokens]; + "ScaleDegree"->Switch[pitSd,"%",-1,"x",10,_,pitSd], + "SemitonesCount"->StringCount[pitOp,"#"]-StringCount[pitOp,"b"], + "OctavesCount"->StringCount[pitOp,"'"]-StringCount[pitOp,","], + "ChordSymbol"->StringDelete[pitOp,"#"|"b"|"'"|","] + } ]; +(* track tokenizer *) +getTrackToken[score_]:=StringCases[score,{ + "{"~~sub:Subtrack~~"}":>{"Type"->"Subtrack","Contents"->getTrackToken[sub]}, + bl:"\\"|"|"|"/":>{"Type"->"BarLine","Newline"->(bl=="\\"),"Volta"->(bl=="/")}, + "~":>{"Type"->"Portamento"}, + "^":>{"Type"->"Tie"}, + + (* functions *) + "<"~~func:LetterCharacter..~~":"~~arg:Except[">"]..~~">":> + {"Type"->"FunctionToken","Simplified"->False,"Argument"->{func->getArgument[arg,func]}}, + "<"~~vol:(DigitCharacter...~~"."~~DigitCharacter...)~~">":> + {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Volume"->{vol}}}, + "<"~~speed:DigitCharacter..~~">":> + {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Speed"->speed}}, + "<"~~bar:NumberString~~"/"~~beat:NumberString~~">":> + {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Bar"->bar,"Beat"->beat}}, + "<1="~~cont:(LetterCharacter|","|"'")..~~">":> + {"Type"->"FunctionToken","Simplified"->True,"Argument"->{ + "Key"->tonalityDict[[StringDelete[cont,","|"'"]]], + "Oct"->StringCount[cont,"'"]-StringCount[cont,","] + }}, + "<"~~cont:(InstrVolume..~~(","~~InstrVolume)...)~~">":> + {"Type"->"FunctionToken","Simplified"->True,"Argument"->getInsVolToken[StringSplit[cont,","]]}, + + (* temporary operators *) + "("~~ns:NumberString~~"~)":> + {"Type"->"Tuplet","NoteCount"->ToExpression[ns]}, + "("~~ns:NumberString~~"-)":> + {"Type"->"Tremolo1","StrokeCount"->ToExpression[ns]}, + "("~~ns:NumberString~~"=)":> + {"Type"->"Tremolo2","StrokeCount"->ToExpression[ns]}, + "("~~pitch:Pitch..~~"^)":> + {"Type"->"Appoggiatura","Pitches"->getPitchToken[pitch]}, + + pitch:Pitch|("["~~(Pitch|"^")..~~"]")~~pitOp:PitOperator~~durOp:DurOperator:>{ + "Type"->"Note", + "Pitches"->getPitchToken[StringDelete[pitch,"^"|"["|"]"]], + "SemitonesCount"->StringCount[pitOp,"#"]-StringCount[pitOp,"b"], + "OctavesCount"->StringCount[pitOp,"'"]-StringCount[pitOp,","], + "Staccato"->StringContainsQ[durOp,"`"], + "Arpeggio"->StringContainsQ[pitch,"^"], + "DurationOperators"->StringDelete[durOp,"`"] + } +}]; -(* ::Input:: *) -(*ExportString[QYSTrackTokenize["<90>"],"JSON"]*) - - -QYSTokenize[filename_]:=Module[ +(* tokenizer *) +Tokenize[filename_]:=Module[ { - i,data,tokenizer={}, - songComments={}, - comments={}, - sections={}, - sectionInfo={}, - tracks={}, - trackToken, - score="" + i,data,score="", + songComments={},sections={}, + sectionMeta={},comments={}, + tracks={},trackToken }, data=Import[filename,"Lines"]; Do[ Which[ line=="", - If[sectionInfo=={}&&songComments=={}, + If[sectionMeta=={}&&songComments=={}, songComments=comments; comments={} ], @@ -221,30 +95,36 @@ QYSTokenize[filename_]:=Module[ True, score=score<>line; If[StringPart[line,-1]=="\\",Continue[]]; - trackToken=QYSTrackTokenize[StringDelete[score,Whitespace]]; + trackToken=getTrackToken[StringDelete[score,Whitespace]]; If[MemberQ[Association[#][["Type"]]&/@trackToken,"Note"], (* empty track *) AppendTo[tracks,trackToken], - If[sectionInfo!={}, - AppendTo[sections,Append[sectionInfo,"Tracks"->tracks]]; + If[sectionMeta!={}, + AppendTo[sections,Append[sectionMeta,"Tracks"->tracks]]; tracks={}; ]; - sectionInfo={"Comments"->comments,"GlobalSettings"->trackToken}; + sectionMeta={"Comments"->comments,"GlobalSettings"->trackToken}; comments={}; ]; score="" ], {line,data}]; - If[sectionInfo!={},AppendTo[sections,Append[sectionInfo,"Tracks"->tracks]]]; + If[sectionMeta!={},AppendTo[sections,Append[sectionMeta,"Tracks"->tracks]]]; Return[{ "Comments"->songComments, "Sections"->sections }]; ]; +End[]; +(* Here is the end of context QYS` *) + + +(* ::Input:: *) +(*QYS`getTrackToken["(6,^)1M-"]//Column*) (* ::Input:: *) -(*Export["E:\\test-Tokenizer.json",QYSTokenize[path<>"Songs\\test.qys"]];*) +(*Export["E:\\test-Tokenizer.json",QYS`Tokenize[path<>"Songs\\test.qys"]];*) (* ::Input:: *) -(*ExportString[QYSTokenize[path<>"Songs\\test.qys"],"JSON"]*) +(*ExportString[QYS`Tokenize[NotebookDirectory[]<>"Songs\\test.qys"],"JSON"]*) From 1fed2fd1db4e11d3c9c23fefb5fcdb9825f97a25 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Wed, 17 Jan 2018 15:10:13 +0800 Subject: [PATCH 23/54] Complete Track Parser --- library.wl | 5 +- parser.wl | 166 ++++++++++++++++++++++++++++++++++++++++++++-------- qysToken.wl | 12 ++-- 3 files changed, 150 insertions(+), 33 deletions(-) diff --git a/library.wl b/library.wl index 8c348c6..7bbea7e 100644 --- a/library.wl +++ b/library.wl @@ -95,6 +95,7 @@ styleDict[[style]]]; (* parse related *) matchDict=<|"["->"]","("->")","{"->"}","<"->">"|>; +pitchDict=<|"1"->0,"2"->2,"3"->4,"4"->5,"5"->7,"6"->9,"7"->11|>; tonalityDict=<| "C"->0,"G"->7,"D"->2,"A"->-3,"E"->4, "B"->-1,"#F"->6,"#C"->1,"F"->5,"bB"->-2, @@ -102,7 +103,6 @@ tonalityDict=<| "F#"->6,"C#"->1,"Bb"->-2,"Gb"->6, "Eb"->3,"Ab"->-4,"Db"->1,"Cb"->-1 |>; -pitchDict=<|"1"->0,"2"->2,"3"->4,"4"->5,"5"->7,"6"->9,"7"->11|>; pitchOpDict=<| "#"->1,"b"->-1,"'"->12,","->-12,"M"->{0,4,7},"m"->{0,3,7}, "a"->{0,4,8},"d"->{0,3,6},"p"->{0,7,12},"o"->{0,12} @@ -119,11 +119,12 @@ getArgument[string_,function_]:=Switch[function, _,ToExpression[string] ]; defaultParameter=<| - "Volume"->1,"Speed"->90,"Key"->0,"Beat"->4,"Bar"->4,"Instr"->"Piano", + "Volume"->{1},"Speed"->90,"Key"->0,"Beat"->4,"Bar"->4,"Instr"->{"Piano"}, "Dur"->0,"FadeIn"->0,"FadeOut"->0,"Stac"->1/2,"Appo"->1/4,"Oct"->0, "Port"->6,"Spac"->0,"Chord"->{0,12},"Trace"->1 |>; funcList=Keys@defaultParameter; +metaSettings={"Instr","Volume","FadeIn","FadeOut"}; writeInfo[song_,info_]:=Export[ diff --git a/parser.wl b/parser.wl index 2045981..cde8227 100644 --- a/parser.wl +++ b/parser.wl @@ -10,10 +10,8 @@ beatCalc[operators_]:=Module[{beats=1,i=1}, {operator,StringCases[operators,{"-","_","."..}]}]; Return[beats]; ]; - - -pitchDict=<|0->None,1->0,2->2,3->4,4->5,5->7,6->9,7->11|>; -pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol}, +pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol,pitchDict}, + pitchDict=<|0->None,1->0,2->2,3->4,4->5,5->7,6->9,7->11,10->10|>; If[KeyExistsQ[token,"Pitches"], pitches=Flatten[pitchCalc[#,settings,previous]&/@Association/@token[["Pitches"]]], pitches=Switch[token[["ScaleDegree"]], @@ -36,59 +34,180 @@ pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol}, (* ::Input:: *) -(*pitchCalc[Association[QYSTrackTokenize["3"][[1]]],defaultParameter,Array[None&,4]]*) +(*pitchCalc[Association[QYS`getTrackToken["00"][[1]]],defaultParameter,Array[None&,4]]*) + + +restTemplate={"ScaleDegree"->0,"SemitonesCount"->0,"OctavesCount"->0,"ChordSymbol"->""}; +percTemplate={"ScaleDegree"->10,"SemitonesCount"->0,"OctavesCount"->0,"ChordSymbol"->""};(* of any use? *) trackParse[tokens_,global_]:=Module[ { - i,settings=global, - functionData, - pitches,percussion, - beatCount,duration, - barBeat, + i,k,settings=global, + functionData,pitches, + beatCount,duration=0, + barBeat=0,prevBeat, + barCount=0, (* notations *) appoggiatura={}, - tuplet=0,tupletTime, + tuplet=0,tupletRatio, + tremolo1=0,tremolo2=0, + tie=False,staccato, + portamento=False,portRate, previous=Array[None&,4], (* return value *) - soundData={},trackDuration=0, - messages={},instruments={} + soundData={},lastRepeat={}, + trackDuration=0,messages={} }, Do[ Switch[token[["Type"]], - "FunctionToken", (* function *) + "BarLine", + If[token[["Volta"]],lastRepeat=soundData]; + If[barBeat!=0, + barCount++; + If[barBeat!=settings[["Bar"]],AppendTo[messages,<| + "Type"->"BarLengthError", + "Info"->{barCount,settings[["Bar"]],barBeat} + |>]]; + barBeat=0; + ], + "FunctionToken", functionData=Association@token[["Argument"]]; Do[ settings[[function]]=functionData[[function]], {function,Keys@functionData}], - "Appoggiatura", (* appoggiatura *) + "Tuplet", + tuplet=token[["NotesCount"]]; + tupletRatio=(2^Floor[Log2[tuplet]])/tuplet, + "Tremolo1", + tremolo1=token[["StrokesCount"]], + "Tremolo2", + tremolo2=token[["StrokesCount"]]; + trackDuration-=duration, + "Appoggiatura", appoggiatura=pitchCalc[token,settings,previous], - "Note", (* note *) - If[token, - pitches=pitchCalc[token,settings,previous]; + "Tie", + tie=True, + "Portamento", + portamento=True; + trackDuration-=duration, + "Note", + pitches=pitchCalc[token,settings,previous]; + If[!MemberQ[token[["Pitches"]],restTemplate], previous=Prepend[Drop[previous,-1],pitches]; ]; beatCount=beatCalc[token[["DurationOperators"]]]; beatCount*=2^(-settings[["Dur"]]); - If[tuplet>0,beatCount*=tupletTime;tuplet--]; + If[tuplet>0,beatCount*=tupletRatio;tuplet--]; barBeat+=beatCount; duration=240/settings[["Speed"]]/settings[["Beat"]]*beatCount; trackDuration+=duration; + staccato=token[["Staccato"]]; + If[token[["Arpeggio"]], + appoggiatura=Flatten/@Array[Take[pitches,#]&,Length@pitches-1] + ]; + Which[ + MemberQ[instrData[["Percussion"]],settings[["Instr",1]]], + If[pitches==={None}, + AppendTo[soundData,{False,duration}], + AppendTo[soundData,{True,duration}] + ], + tie&&pitches==previous[[2]], + soundData[[-1,2]]+=duration; + prevBeat+=beatCount; + tie=False, + tremolo1!=0, + duration/=(beatCount*2^tremolo1); + Do[ + AppendTo[soundData,{pitches,duration}], + {k,beatCount*2^tremolo1}]; + tremolo1=0, + tremolo2!=0, + duration/=(beatCount*2^tremolo2); + barBeat-=prevBeat; + soundData=Drop[soundData,-1]; + Do[ + AppendTo[soundData,{previous[[2]],duration}]; + AppendTo[soundData,{pitches,duration}], + {k,beatCount*2^(tremolo2-1)}]; + tremolo2=0, + portamento, + portRate=(pitches-previous[[2]]+1)/beatCount/settings[["Port"]]; + duration/=(beatCount*settings[["Port"]]); + barBeat=barBeat-prevBeat; + soundData=Drop[soundData,-1]; + For[k=previous[[2,1]],ksoundData, - "Duration"->duration, + "Duration"->trackDuration, "Messages"->messages, - "Instruments"->instruments + "LastRepeat"->lastRepeat, + "MetaSettings"->settings[[metaSettings]] |>] ]; (* ::Input:: *) -(*trackParse[Association/@QYSTrackTokenize["13%#-"],defaultParameter]*) +(*trackParse[Association/@QYS`getTrackToken["xx_0_x"],defaultParameter]*) + + +(* ::Input:: *) +(*trackParse[Association/@QYS`getTrackToken["<60>10[%#5]-"],defaultParameter]*) + + +(* ::Input:: *) +(*AudioStop[];AudioPlay@integrate@{trackParse[Association/@QYS`getTrackToken["<160>xx_xx_x|xx_xx_x|"],defaultParameter]};*) + + +integrate[tracks_]:=Module[ + {audio=0,settings,instrCount,instrument,soundData,generate}, + Do[ + settings=trackData[["MetaSettings"]]; + instrCount=Length@settings[["Instr"]]; + If[Length@settings[["Volume"]]"Songs\\test.qys"]];*) - - - diff --git a/qysToken.wl b/qysToken.wl index d5aaf9e..c4c7b99 100644 --- a/qysToken.wl +++ b/qysToken.wl @@ -14,15 +14,15 @@ Pitch="%"|"x"|DigitCharacter~~PitOperator; getInsVolToken[ivList_]:={ "Instr"->StringDelete["("~~__~~")"]/@ivList, If[Or@@StringContainsQ["("]/@ivList, - "Volume"->If[StringContainsQ[#,"("], + "Volume"->(If[StringContainsQ[#,"("], StringCases[#,"("~~vol__~~")":>ToExpression@vol][[1]], - 1.0]&/@ivList, + 1.0]&)/@ivList, Nothing] }; getPitchToken[pitch_]:=StringCases[pitch, pitSd:("%"|"x"|DigitCharacter)~~pitOp:PitOperator:> { - "ScaleDegree"->Switch[pitSd,"%",-1,"x",10,_,pitSd], + "ScaleDegree"->Switch[pitSd,"%",-1,"x",10,_,ToExpression@pitSd], "SemitonesCount"->StringCount[pitOp,"#"]-StringCount[pitOp,"b"], "OctavesCount"->StringCount[pitOp,"'"]-StringCount[pitOp,","], "ChordSymbol"->StringDelete[pitOp,"#"|"b"|"'"|","] @@ -40,11 +40,11 @@ getTrackToken[score_]:=StringCases[score,{ "<"~~func:LetterCharacter..~~":"~~arg:Except[">"]..~~">":> {"Type"->"FunctionToken","Simplified"->False,"Argument"->{func->getArgument[arg,func]}}, "<"~~vol:(DigitCharacter...~~"."~~DigitCharacter...)~~">":> - {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Volume"->{vol}}}, + {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Volume"->{ToExpression@vol}}}, "<"~~speed:DigitCharacter..~~">":> - {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Speed"->speed}}, + {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Speed"->ToExpression@speed}}, "<"~~bar:NumberString~~"/"~~beat:NumberString~~">":> - {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Bar"->bar,"Beat"->beat}}, + {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Bar"->ToExpression@bar,"Beat"->ToExpression@beat}}, "<1="~~cont:(LetterCharacter|","|"'")..~~">":> {"Type"->"FunctionToken","Simplified"->True,"Argument"->{ "Key"->tonalityDict[[StringDelete[cont,","|"'"]]], From 3e4604cf96e337209623daa32c733bc024e6598d Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Wed, 17 Jan 2018 17:15:23 +0800 Subject: [PATCH 24/54] Basically finish all the parser work And really endless debugging process...... --- parser.wl | 109 +++++++++++++++++++++++++++------------------------- qysToken.wl | 10 ++--- 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/parser.wl b/parser.wl index cde8227..4eaa7e2 100644 --- a/parser.wl +++ b/parser.wl @@ -11,17 +11,17 @@ beatCalc[operators_]:=Module[{beats=1,i=1}, Return[beats]; ]; pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol,pitchDict}, - pitchDict=<|0->None,1->0,2->2,3->4,4->5,5->7,6->9,7->11,10->10|>; + pitchDict=<|1->0,2->2,3->4,4->5,5->7,6->9,7->11,10->10|>; If[KeyExistsQ[token,"Pitches"], pitches=Flatten[pitchCalc[#,settings,previous]&/@Association/@token[["Pitches"]]], pitches=Switch[token[["ScaleDegree"]], -1,previous[[settings[["Trace"]]]], - _,Key[token[["ScaleDegree"]]]@pitchDict + 0,None, + _,Key[token[["ScaleDegree"]]]@pitchDict+settings[["Key"]]+12*settings[["Oct"]] ] ]; - pitches+=settings[["Key"]]+12*settings[["Oct"]]; If[KeyExistsQ[token,"SemitonesCount"],pitches+=token[["SemitonesCount"]]]; - If[KeyExistsQ[token,"OctavesCount"],pitches+=token[["OctavesCount"]]]; + If[KeyExistsQ[token,"OctavesCount"],pitches+=12*token[["OctavesCount"]]]; If[KeyExistsQ[token,"ChordSymbol"], chordSymbol=token[["ChordSymbol"]]; Switch[chordSymbol, @@ -33,17 +33,13 @@ pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol,pitchDict}, ]; -(* ::Input:: *) -(*pitchCalc[Association[QYS`getTrackToken["00"][[1]]],defaultParameter,Array[None&,4]]*) - - restTemplate={"ScaleDegree"->0,"SemitonesCount"->0,"OctavesCount"->0,"ChordSymbol"->""}; percTemplate={"ScaleDegree"->10,"SemitonesCount"->0,"OctavesCount"->0,"ChordSymbol"->""};(* of any use? *) trackParse[tokens_,global_]:=Module[ { - i,k,settings=global, + i,settings=global, functionData,pitches, beatCount,duration=0, barBeat=0,prevBeat, @@ -111,7 +107,7 @@ trackParse[tokens_,global_]:=Module[ Which[ MemberQ[instrData[["Percussion"]],settings[["Instr",1]]], If[pitches==={None}, - AppendTo[soundData,{False,duration}], + AppendTo[soundData,{None,duration}], AppendTo[soundData,{True,duration}] ], tie&&pitches==previous[[2]], @@ -134,13 +130,13 @@ trackParse[tokens_,global_]:=Module[ {k,beatCount*2^(tremolo2-1)}]; tremolo2=0, portamento, - portRate=(pitches-previous[[2]]+1)/beatCount/settings[["Port"]]; + portRate=(pitches[[1]]-previous[[2,1]]+1)/beatCount/settings[["Port"]]; duration/=(beatCount*settings[["Port"]]); barBeat=barBeat-prevBeat; soundData=Drop[soundData,-1]; - For[k=previous[[2,1]],ksoundData, + "RealTracks"->{<|"SoundData"->soundData,"MetaSettings"->settings[[metaSettings]]|>}, "Duration"->trackDuration, "Messages"->messages, - "LastRepeat"->lastRepeat, - "MetaSettings"->settings[[metaSettings]] + "LastRepeat"->{{}} |>] ]; (* ::Input:: *) -(*trackParse[Association/@QYS`getTrackToken["xx_0_x"],defaultParameter]*) +(*QYS`getTrackToken["<0.6><1=bA,,>2_5o_%%#%|"]*) (* ::Input:: *) -(*trackParse[Association/@QYS`getTrackToken["<60>10[%#5]-"],defaultParameter]*) +(*tmp=trackParse[QYS`getTrackToken["<0.6><1=bA,,>2_5o_%%#%|"],defaultParameter]*) (* ::Input:: *) -(*AudioStop[];AudioPlay@integrate@{trackParse[Association/@QYS`getTrackToken["<160>xx_xx_x|xx_xx_x|"],defaultParameter]};*) - - -integrate[tracks_]:=Module[ - {audio=0,settings,instrCount,instrument,soundData,generate}, - Do[ - settings=trackData[["MetaSettings"]]; - instrCount=Length@settings[["Instr"]]; - If[Length@settings[["Volume"]]Prepend[#SoundData,{None,duration}], + "MetaSettings"->#MetaSettings + |>&/@trackData[["RealTracks"]]]; + sectionDuration=Max[sectionDuration,trackData[["Duration"]]], {trackToken,sectionToken[["Tracks"]]}]; - , + duration+=sectionDuration, {sectionToken,Association/@Association[tokenizer][["Sections"]]}]; - Return[]; + Return[realTracks]; ]; (* ::Input:: *) -(*parse[QYSTokenize[path<>"Songs\\test.qys"]];*) +(*parse[QYS`Tokenize[path<>"Songs\\Anima.qys"]][[1,"SoundData"]]//Column*) + + +(* ::Input:: *) +(*AudioStop[];AudioPlay@integrate[parse[QYS`Tokenize[path<>"Songs\\Touhou\\TH11-Chireiden\\Nuclear_Fusion.qys"]]];*) + + +integrate[tracks_]:=Module[ + {audio=0,settings,instrCount,instrument,soundData,generate}, + Do[ + settings=trackData[["MetaSettings"]]; + instrCount=Length@settings[["Instr"]]; + If[Length@settings[["Volume"]]"FunctionToken","Simplified"->True,"Argument"->{"Speed"->ToExpression@speed}}, "<"~~bar:NumberString~~"/"~~beat:NumberString~~">":> {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Bar"->ToExpression@bar,"Beat"->ToExpression@beat}}, - "<1="~~cont:(LetterCharacter|","|"'")..~~">":> + "<1="~~cont:(LetterCharacter|","|"'"|"#")..~~">":> {"Type"->"FunctionToken","Simplified"->True,"Argument"->{ "Key"->tonalityDict[[StringDelete[cont,","|"'"]]], "Oct"->StringCount[cont,"'"]-StringCount[cont,","] @@ -55,11 +55,11 @@ getTrackToken[score_]:=StringCases[score,{ (* temporary operators *) "("~~ns:NumberString~~"~)":> - {"Type"->"Tuplet","NoteCount"->ToExpression[ns]}, + {"Type"->"Tuplet","NotesCount"->ToExpression[ns]}, "("~~ns:NumberString~~"-)":> - {"Type"->"Tremolo1","StrokeCount"->ToExpression[ns]}, + {"Type"->"Tremolo1","StrokesCount"->ToExpression[ns]}, "("~~ns:NumberString~~"=)":> - {"Type"->"Tremolo2","StrokeCount"->ToExpression[ns]}, + {"Type"->"Tremolo2","StrokesCount"->ToExpression[ns]}, "("~~pitch:Pitch..~~"^)":> {"Type"->"Appoggiatura","Pitches"->getPitchToken[pitch]}, @@ -90,7 +90,7 @@ Tokenize[filename_]:=Module[ songComments=comments; comments={} ], - StringTake[line,2]=="//", + StringLength@line>2&&StringTake[line,2]=="//", AppendTo[comments,StringDrop[line,2]], True, score=score<>line; From 51e67281eb35a1e727475bbf70ee96f0e709b9a5 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Thu, 18 Jan 2018 09:16:17 +0800 Subject: [PATCH 25/54] Add support for repeat in QYS tokenizer --- QYMP.wl | 3 ++ library.wl | 16 +++++++--- parser.wl | 16 ++++------ qysParse.wl | 8 ++--- qysToken.wl | 92 ++++++++++++++++++++++++++++++----------------------- 5 files changed, 77 insertions(+), 58 deletions(-) diff --git a/QYMP.wl b/QYMP.wl index 669054c..6a5b403 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -10,6 +10,9 @@ path=NotebookDirectory[]; <<(path<>"interface.wl") <<(path<>"qysParse.wl") <<(path<>"qymParse.wl") +<<(path<>"qysToken.wl") +<<(path<>"qymToken.wl") +<<(path<>"parser.wl") refresh:=Module[ diff --git a/library.wl b/library.wl index 7bbea7e..97ea034 100644 --- a/library.wl +++ b/library.wl @@ -1,5 +1,6 @@ (* ::Package:: *) +(* user data *) version=201; userPath=$HomeDirectory<>"\\AppData\\Local\\QYMP\\"; cloudPath="http://www.qymp.tk/assets/"; @@ -27,6 +28,7 @@ If[!FileExistsQ[userPath<>"Image.json"],Export[userPath<>"Image.json",{}]]; imageData=Association/@Association@Import[userPath<>"image.json"]; +(* local data *) path=NotebookDirectory[]; instrData=Association@Import[path<>"instr.json"]; (* instruments *) colorData=Association@Import[path<>"color.json"]; (* colors *) @@ -68,7 +70,7 @@ findMatch[score_,pos_]:=Module[ i++ ]; Return[i]; -]; +];(* this part will be deleted before ver 1.6 release *) textLength[string_]:=2StringLength[string]-StringCount[string,Alternatives@CharacterRange[32,127]]; toArgument[str_]:=If[StringContainsQ[str,","], ToExpression/@StringSplit[str,","], @@ -84,7 +86,7 @@ completeText[raw_,arg_]:=StringReplace[raw,Flatten@Array[{ "$"<>ToString[#]->arg[[#]], "#"<>ToString[#]->StringRiffle[ToString[#,FormatType->InputForm]&/@arg[[#]],", "] }&,Length@arg]]; -generateMessage[tag_,arg_]:=completeText[errorDict[[tag]],arg]; +generateMessage[tag_,arg_]:=completeText[errorDict[[tag]],arg];(* this part will be deleted before ver 1.6 release *) caption[string_,style_]:=caption[string,style,{}]; caption[string_,style_,argument_]:=Style[ completeText[ @@ -94,8 +96,12 @@ styleDict[[style]]]; (* parse related *) -matchDict=<|"["->"]","("->")","{"->"}","<"->">"|>; -pitchDict=<|"1"->0,"2"->2,"3"->4,"4"->5,"5"->7,"6"->9,"7"->11|>; +rep=#~~(","~~#)...&; +int=DigitCharacter..; +name=LetterCharacter~~WordCharacter...; +real=DigitCharacter...~~"."~~DigitCharacter...; +matchDict=<|"["->"]","("->")","{"->"}","<"->">"|>;(* this part will be deleted before ver 1.6 release *) +pitchDict=<|"1"->0,"2"->2,"3"->4,"4"->5,"5"->7,"6"->9,"7"->11|>;(* this part will be deleted before ver 1.6 release *) tonalityDict=<| "C"->0,"G"->7,"D"->2,"A"->-3,"E"->4, "B"->-1,"#F"->6,"#C"->1,"F"->5,"bB"->-2, @@ -112,7 +118,7 @@ chordDict=<| "d"->{0,3,6},"p"->{0,7,12},"o"->{0,12} |>; pitchOpDefault={"SemitonesCount"->0,"OctavesCount"->0,"ChordSymbol"->""}; -pitchOpList=Append[Keys[pitchOpDict],"$"]; +pitchOpList=Append[Keys[pitchOpDict],"$"];(* this part will be deleted before ver 1.6 release *) getArgument[string_,function_]:=Switch[function, "Instr",{string}, "Volume"|"Chord",ToExpression/@StringSplit[string,","], diff --git a/parser.wl b/parser.wl index 4eaa7e2..bde8bc6 100644 --- a/parser.wl +++ b/parser.wl @@ -15,8 +15,8 @@ pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol,pitchDict}, If[KeyExistsQ[token,"Pitches"], pitches=Flatten[pitchCalc[#,settings,previous]&/@Association/@token[["Pitches"]]], pitches=Switch[token[["ScaleDegree"]], - -1,previous[[settings[["Trace"]]]], 0,None, + -1,previous[[settings[["Trace"]]]], _,Key[token[["ScaleDegree"]]]@pitchDict+settings[["Key"]]+12*settings[["Oct"]] ] ]; @@ -33,10 +33,6 @@ pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol,pitchDict}, ]; -restTemplate={"ScaleDegree"->0,"SemitonesCount"->0,"OctavesCount"->0,"ChordSymbol"->""}; -percTemplate={"ScaleDegree"->10,"SemitonesCount"->0,"OctavesCount"->0,"ChordSymbol"->""};(* of any use? *) - - trackParse[tokens_,global_]:=Module[ { i,settings=global, @@ -91,9 +87,7 @@ trackParse[tokens_,global_]:=Module[ trackDuration-=duration, "Note", pitches=pitchCalc[token,settings,previous]; - If[!MemberQ[token[["Pitches"]],restTemplate], - previous=Prepend[Drop[previous,-1],pitches]; - ]; + If[!pitches==={None},previous=Prepend[Drop[previous,-1],pitches]]; beatCount=beatCalc[token[["DurationOperators"]]]; beatCount*=2^(-settings[["Dur"]]); If[tuplet>0,beatCount*=tupletRatio;tuplet--]; @@ -156,6 +150,8 @@ trackParse[tokens_,global_]:=Module[ AppendTo[soundData,{pitches,duration}]; ]; ]; + "Subtrack", + ], {token,Association/@tokens}]; Return[<| @@ -168,11 +164,11 @@ trackParse[tokens_,global_]:=Module[ (* ::Input:: *) -(*QYS`getTrackToken["<0.6><1=bA,,>2_5o_%%#%|"]*) +(*QYS`getTrackToken["<0.6><1=bA,,>2030|"]*) (* ::Input:: *) -(*tmp=trackParse[QYS`getTrackToken["<0.6><1=bA,,>2_5o_%%#%|"],defaultParameter]*) +(*tmp=trackParse[QYS`getTrackToken["<0.6><1=bA,,>20%0|"],defaultParameter]*) (* ::Input:: *) diff --git a/qysParse.wl b/qysParse.wl index 1d68a3c..401de9d 100644 --- a/qysParse.wl +++ b/qysParse.wl @@ -5,13 +5,13 @@ (*<<(path<>"initial.wl")*) -getPitch[score_,pos_,para_]:=Module[ +getPitch2[score_,pos_,para_]:=Module[ {i=pos,note,pitch,pitchData}, If[StringPart[score,i]=="[", i++; pitch={}; While[i<=StringLength[score] && StringPart[score,i]!="]", - pitchData=getPitch[score,i,para]; + pitchData=getPitch2[score,i,para]; AppendTo[pitch,pitchData[[1]]]; i=pitchData[[2]]; ], @@ -133,7 +133,7 @@ track[score_,global_,location_]:=Module[ "^", (* appoggiatura *) k=1; While[k<=StringLength@content, - pitchData=getPitch[content,k,parameter]; + pitchData=getPitch2[content,k,parameter]; AppendTo[appoggiatura,pitchData[[1]]]; k=pitchData[[2]]; ]; @@ -162,7 +162,7 @@ track[score_,global_,location_]:=Module[ char=="[", match=findMatch[score,j-1]; content=StringTake[score,{j-1,match}]; - pitch=getPitch[content,1,parameter][[1]]; + pitch=getPitch2[content,1,parameter][[1]]; j=match+1; If[StringContainsQ[content,"^"],appoggiatura=Flatten/@Array[Take[pitch,#]&,Length@pitch-1]]; pitch=Flatten@pitch, diff --git a/qysToken.wl b/qysToken.wl index 43733eb..9c99ba7 100644 --- a/qysToken.wl +++ b/qysToken.wl @@ -6,21 +6,19 @@ (* Here is the beginning of context QYS` *) Begin["QYS`"]; -Subtrack=Nest[(("{"~~#~~"}")|Except["}"])...&,Except["}"],8]; -InstrVolume=(LetterCharacter~~WordCharacter...~~(""|("("~~NumberString~~")"))); -PitOperator=Alternatives[Characters@"abdMmop#$,'"]...; -DurOperator=Alternatives[Characters@"-_.`"]...; -Pitch="%"|"x"|DigitCharacter~~PitOperator; -getInsVolToken[ivList_]:={ - "Instr"->StringDelete["("~~__~~")"]/@ivList, - If[Or@@StringContainsQ["("]/@ivList, - "Volume"->(If[StringContainsQ[#,"("], - StringCases[#,"("~~vol__~~")":>ToExpression@vol][[1]], - 1.0]&)/@ivList, - Nothing] -}; -getPitchToken[pitch_]:=StringCases[pitch, - pitSd:("%"|"x"|DigitCharacter)~~pitOp:PitOperator:> + +subtrack=Nest[(("{"~~#~~"}")|Except["}"])...&,Except["}"]...,8]; +pitOp=Alternatives[Characters@"abdMmop#$,'"]...; +durOp=Alternatives[Characters@"-_.`"]...; +pitch="%"|"x"|DigitCharacter~~pitOp; +index=rep[int~~""|(".."~~int)]; + +getIndex[index_]:=Union@@StringCases[index,{ + n:int~~".."~~m:int:>Range[ToExpression@n,ToExpression@m], + n:int:>{ToExpression@n} +}]; +getPitch[pitches_]:=StringCases[pitches, + pitSd:("%"|"x"|DigitCharacter)~~pitOp:pitOp:> { "ScaleDegree"->Switch[pitSd,"%",-1,"x",10,_,ToExpression@pitSd], "SemitonesCount"->StringCount[pitOp,"#"]-StringCount[pitOp,"b"], @@ -30,46 +28,62 @@ getPitchToken[pitch_]:=StringCases[pitch, ]; (* track tokenizer *) -getTrackToken[score_]:=StringCases[score,{ - "{"~~sub:Subtrack~~"}":>{"Type"->"Subtrack","Contents"->getTrackToken[sub]}, - bl:"\\"|"|"|"/":>{"Type"->"BarLine","Newline"->(bl=="\\"),"Volta"->(bl=="/")}, - "~":>{"Type"->"Portamento"}, - "^":>{"Type"->"Tie"}, +getTrack[score_]:=StringCases[score,{ + "{"~~n:int~~"*"~~sub:subtrack~~"}":> + {"Type"->"subtrack","Contents"->getTrack[sub],"Repeat"->-n}, + "{"~~sub:subtrack~~"}":> + {"Type"->"subtrack","Contents"->getTrack[sub],"Repeat"->Max[0, + StringCases[sub,"\\"|"/"~~i:index~~":":>getIndex[i]] + ]}, + bl:"\\"|"/"~~i:index~~":":> + {"Type"->"Volta","Newline"->(bl=="\\"),"Index"->getIndex[i]}, + bl:"\\"|"|"|"/":> + {"Type"->"BarLine","Newline"->(bl=="\\"),"Coda"->(bl=="/")}, (* functions *) - "<"~~func:LetterCharacter..~~":"~~arg:Except[">"]..~~">":> + "<"~~func:name~~":"~~arg:Except[">"]..~~">":> {"Type"->"FunctionToken","Simplified"->False,"Argument"->{func->getArgument[arg,func]}}, - "<"~~vol:(DigitCharacter...~~"."~~DigitCharacter...)~~">":> + "<"~~vol:real~~">":> {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Volume"->{ToExpression@vol}}}, - "<"~~speed:DigitCharacter..~~">":> + "<"~~speed:int~~">":> {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Speed"->ToExpression@speed}}, - "<"~~bar:NumberString~~"/"~~beat:NumberString~~">":> + "<"~~bar:int~~"/"~~beat:int~~">":> {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Bar"->ToExpression@bar,"Beat"->ToExpression@beat}}, "<1="~~cont:(LetterCharacter|","|"'"|"#")..~~">":> {"Type"->"FunctionToken","Simplified"->True,"Argument"->{ "Key"->tonalityDict[[StringDelete[cont,","|"'"]]], "Oct"->StringCount[cont,"'"]-StringCount[cont,","] }}, - "<"~~cont:(InstrVolume..~~(","~~InstrVolume)...)~~">":> - {"Type"->"FunctionToken","Simplified"->True,"Argument"->getInsVolToken[StringSplit[cont,","]]}, + "<"~~cont:rep[name~~""|("("~~real~~")")]~~">":> + {"Type"->"FunctionToken","Simplified"->True,"Argument"->Module[{ivList=StringSplit[cont,","]},{ + "Instr"->StringDelete["("~~__~~")"]/@ivList, + If[Or@@StringContainsQ["("]/@ivList, + "Volume"->(If[StringContainsQ[#,"("], + StringCases[#,"("~~vol__~~")":>ToExpression@vol][[1]], + 1.0]&)/@ivList, + Nothing] + }]}, (* temporary operators *) - "("~~ns:NumberString~~"~)":> - {"Type"->"Tuplet","NotesCount"->ToExpression[ns]}, - "("~~ns:NumberString~~"-)":> - {"Type"->"Tremolo1","StrokesCount"->ToExpression[ns]}, - "("~~ns:NumberString~~"=)":> - {"Type"->"Tremolo2","StrokesCount"->ToExpression[ns]}, - "("~~pitch:Pitch..~~"^)":> - {"Type"->"Appoggiatura","Pitches"->getPitchToken[pitch]}, + "("~~n:int~~"~)":> + {"Type"->"Tuplet","NotesCount"->ToExpression[n]}, + "("~~n:int~~"-)":> + {"Type"->"Tremolo1","StrokesCount"->ToExpression[n]}, + "("~~n:int~~"=)":> + {"Type"->"Tremolo2","StrokesCount"->ToExpression[n]}, + "("~~pitches:pitch..~~"^)":> + {"Type"->"Appoggiatura","Pitches"->getPitch[pitches]}, - pitch:Pitch|("["~~(Pitch|"^")..~~"]")~~pitOp:PitOperator~~durOp:DurOperator:>{ + (* note related *) + "~":>{"Type"->"Portamento"}, + "^":>{"Type"->"Tie"}, + pitches:pitch|("["~~(pitch|"^")..~~"]")~~pitOp:pitOp~~durOp:durOp:>{ "Type"->"Note", - "Pitches"->getPitchToken[StringDelete[pitch,"^"|"["|"]"]], + "Pitches"->getPitch[StringDelete[pitches,"^"|"["|"]"]], "SemitonesCount"->StringCount[pitOp,"#"]-StringCount[pitOp,"b"], "OctavesCount"->StringCount[pitOp,"'"]-StringCount[pitOp,","], "Staccato"->StringContainsQ[durOp,"`"], - "Arpeggio"->StringContainsQ[pitch,"^"], + "Arpeggio"->StringContainsQ[pitches,"^"], "DurationOperators"->StringDelete[durOp,"`"] } }]; @@ -95,7 +109,7 @@ Tokenize[filename_]:=Module[ True, score=score<>line; If[StringPart[line,-1]=="\\",Continue[]]; - trackToken=getTrackToken[StringDelete[score,Whitespace]]; + trackToken=getTrack[StringDelete[score,Whitespace]]; If[MemberQ[Association[#][["Type"]]&/@trackToken,"Note"], (* empty track *) AppendTo[tracks,trackToken], If[sectionMeta!={}, @@ -119,7 +133,7 @@ End[]; (* ::Input:: *) -(*QYS`getTrackToken["(6,^)1M-"]//Column*) +(*QYS`getTrack["{2*1{/2..5,8:}}"]*) (* ::Input:: *) From 83a6de05080dec6ce9d814bafba9ac65d09b51eb Mon Sep 17 00:00:00 2001 From: NN708 Date: Thu, 18 Jan 2018 20:47:16 +0800 Subject: [PATCH 26/54] qymToken Part 2 --- qymToken.wl | 51 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/qymToken.wl b/qymToken.wl index 2b2bf49..f13c803 100644 --- a/qymToken.wl +++ b/qymToken.wl @@ -1,13 +1,49 @@ (* ::Package:: *) -qymTrackTokenizer[track_]:=Module[ +Begin["qym`"]; +trackTokenizer[track_]:=Block[ { - + match, + notations, + argument }, + notations={}; + While[track!="", + Switch[track[[1]], + "<", + Which[ + (match=StringCases[track[[1]],RegularExpression["^<1=[#b]?[A-G]>"],1])!={}, + argument=keyAndOctTokenizer[match[[1]]], + (match=StringCases[track[[1]],RegularExpression["^<\\d+/\\d+>"],1])!={}, + argument=barAndBeatTokenizer[match[[1]]], + (match=StringCases[track[[1]],RegularExpression["^<\\d+>"],1])!={}, + argument={"Speed"->ToExpression[StringTake[match[[1]],{2,StringLength[match[[1]]]-1}]]}, + True, + MessageDialog[TextCell["Undefined token found at "<>track],WindowTitle->"Error"]; + Return[False]; + ]; + AppendTo[notations,{ + "Type"->"FunctionToken", + "Simplified"->True, + "Argument"->argument + }]; + , + "{", + , + "(", + , + "[", + , + _, + + ]; + track=StringDrop[track,StringLength[match[[1]]]]; + ]; + Return[{}]; ]; -qymTokenizer[filename_]:=Module[ +tokenizer[filename_]:=Block[ { (* Define variables *) i, @@ -18,7 +54,7 @@ qymTokenizer[filename_]:=Module[ (* Read file *) If[!FileExistsQ[filename], MessageDialog[TextCell["File not found!"],WindowTitle->"Error"]; - Return[]; + Return[False]; ]; content=Import[filename,"Lines"]; (* Global comments *) @@ -44,13 +80,13 @@ qymTokenizer[filename_]:=Module[ (* Global settings *) globalsettings={}; If[i<=Length[content] && content[[i]]!="" && StringTake[content[[i]],-1]==">", - globalsettings=qymTrackTokenizer[content[[i]]]; + globalsettings=trackTokenizer[content[[i]]]; i++; ]; (* Tracks *) tracks={}; While[i<=Length[content] && content[[i]]!="" && (StringLength[content[[i]]]<2 || StringTake[content[[i]],2]!="//"), - AppendTo[tracks,qymTrackTokenizer[content[[i]]]]; + AppendTo[tracks,trackTokenizer[content[[i]]]]; i++; ]; (* Construct section *) @@ -68,7 +104,8 @@ qymTokenizer[filename_]:=Module[ "Sections"->sections }]; ]; +End[]; (* ::Input:: *) -(*ExportString[qymTokenizer[NotebookDirectory[]<>"Songs\\Frozen\\Let_It_Go.qym"],"JSON"]*) +(*ExportString[qym`tokenizer[NotebookDirectory[]<>"Songs\\Frozen\\Let_It_Go.qym"],"JSON"]*) From d32e43040c1b990962d59f424397eed3a16d9813 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Thu, 18 Jan 2018 20:48:47 +0800 Subject: [PATCH 27/54] Complete parser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 一次巨大的更新……出了任何情况务必立即找我…… --- QYMP.wl | 6 +- Songs/El_Pollito_Pio.qys | 60 ++- Songs/Lonely_Night.qys | 10 +- Songs/Nyan_Cat.qys | 21 +- Songs/Oriental_Pearl.qys | 2 +- Songs/Rainbow.qys | 4 +- Songs/Shionari.qys | 2 +- Songs/Touhou/Dark_Side_of_Fate.qys | 98 +++-- Songs/Touhou/Necro_Fantasia.qys | 16 +- .../Hartmann_No_Youkai_Otome.qys | 108 ++--- library.wl | 46 +- parser.wl | 194 ++++++--- qymParse.wl | 3 + qysParse.wl | 406 ------------------ qysToken.wl | 49 ++- 15 files changed, 343 insertions(+), 682 deletions(-) delete mode 100644 qysParse.wl diff --git a/QYMP.wl b/QYMP.wl index 6a5b403..fa05746 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -8,13 +8,17 @@ path=NotebookDirectory[]; <<(path<>"library.wl") <<(path<>"assets.wl") <<(path<>"interface.wl") -<<(path<>"qysParse.wl") <<(path<>"qymParse.wl") <<(path<>"qysToken.wl") <<(path<>"qymToken.wl") <<(path<>"parser.wl") +(* temporary function *) +QYMParse[filename_]:=QYMparse`QYMParse[filename]; +QYSParse[filename_]:=integrate[parse[QYS`Tokenize[filename]]]; + + refresh:=Module[ { metaTree,songsClassified, diff --git a/Songs/El_Pollito_Pio.qys b/Songs/El_Pollito_Pio.qys index 958e3de..8489013 100644 --- a/Songs/El_Pollito_Pio.qys +++ b/Songs/El_Pollito_Pio.qys @@ -4,57 +4,53 @@ <1.0><120>\ 01$0%0%0%|0%0%0%0%|0%0%0%0%|0%0%%-3-\ -:66661'1'656---0---|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---\ - 66661'1'656---0---|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---:\ +{4*66661'1'656---0---|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---}\ <128>\ -:66661'1'656---6-6'-|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%\ - 7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---:\ +{2*66661'1'656---6-6'-|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%\ + 7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---}\ <132>\ -:66661'1'656---6-[16]'-|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%\ - 7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---:\ +{2*66661'1'656---6-[16]'-|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%\ + 7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---}\ <138>\ -:66661'1'6566666666|66661'1'6566666633|(2-)2'(2-)1'|(2-)7(2-)1'\ - (2-)7(2-)1'|(2-)7(2-)1'|(2-)7(2-)1'|7-%-%%%%6---[23]---:\ +{2*:66661'1'6566666666|66661'1'6566666633\ + (2-)2'(2-)1'{4*(2-)7(2-)1'}|7-%-%%%%6---[23]---}\ <144>\ -:66661'1'6566666666|66661'1'6566666633|(2-)2'(2-)1'|(2-)7(2-)1'\ - (2-)7(2-)1'|(2-)7(2-)1'|(2-)7(2-)1'|(2-)7(2-)1'|7-%-%%%%6---[23]---:\ +{2*66661'1'6566666666|66661'1'6566666633\ + (2-)2'(2-)1'{5*(2-)7(2-)1'}|7-%-%%%%6---[23]---}\ 66661'1'656---0---|66661'1'656-3'-%-%-|2'%%%1'%%%|7771'66[16]'-|| <1.0><120>\ 0---|0---|0---|0---\ -:1316,|1313|6-3-|5#-3-|5#-6m,5#,\ - 1316,|1313|6-3-|5#-3-|5#-6m,5#,:\ +{4*1316,|1313|6-3-|5#-3-|5#-6m,5#,}\ <128>\ -:1316,|1313|6236|5#7,36|5#-3-|5#-6m,5#,:\ +{2*1316,|1313|6236|5#7,36|5#-3-|5#-6m,5#,}\ <132>\ -:1316,|1313|6236|5#7,36|5#7,36|5#-3-|5#-6m,5#,:\ +{2*1316,|1313|6236|5#7,36|5#7,36|5#-3-|5#-6m,5#,}\ <138>\ -:1316,|1313|6236|5#7,36|5#7,36|5#7,36|5#-3-|5#-6m,5#,:\ +{2*1316,|1313|6236|5#7,36|5#7,36|5#7,36|5#-3-|5#-6m,5#,}\ <144>\ -:[13][36][13]6,|[13][36][13]3|[26][26][36][36]|[35#]7,[36]6\ - [35#]7,[36]6|[35#]-[36]-|[35#]7,[36]6|[35#]-[36]-|5#-6m,5#,:\ +{2*[13][36][13]6,|[13][36][13]3|[26][26][36][36]|[35#]7,[36]6\ + [35#]7,[36]6|[35#]-[36]-|[35#]7,[36]6|[35#]-[36]-|5#-6m,5#,}\ 1316,|1313|6-3-|5#-3-|| <1.0><120>\ 6o,03'5'6o,03'5'|6o,03'5'6o,03'5'|6o,03'5'6o,03'5'|6o,03'5'6o,06o,,-\ -:6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ - 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-\ - 6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ - 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-:\ +{4*6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-}\ <128>\ -:6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ - 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-:\ +{2*6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-}\ <132>\ -:6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ - 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'\ - 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-:\ +{2*6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-}\ <138>\ -:6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ - 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'\ - 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-:\ +{2*6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-}\ <144>\ -:6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ - 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'\ - 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-:\ +{2*6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'\ + 3o,3M'5#[75#']6o,1$'3[16]'|3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-}\ 6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ 3o,3M'5#[75#']6o,1$'6o,-|| diff --git a/Songs/Lonely_Night.qys b/Songs/Lonely_Night.qys index f1dac38..d828c8a 100644 --- a/Songs/Lonely_Night.qys +++ b/Songs/Lonely_Night.qys @@ -8,11 +8,11 @@ 1_2_3_6,_1-|1_2_3_6,_6.1'_|7_5_2-.^|2---\ 0_2_3_6,_1-|1_2_3_6,_1.1_|7,_1_2_5_^2.7,_|2_1_7,_3,_5,-\ 0_2_3_6,_^%-|6,_7,_1.1_2_1_|2_4_3-5#,_7,_|3_4#_(7,34#^)5#-(4#5#7^)3'\ -\ +{\ 1_2_3_6,_1-|1_2_3_6,_6.1'_|7_5_2_3_3-|0-7,_1_2_3_\ 1_2_3_6,_1-|1_2_3_6,_6.1'_|7_5_2-.|2---\ 0_2_3_6,_1-|1_2_3_6,_1.1_|7,_1_2_5_2.7,_|2_1_7,_3,_5,.2_\ -3_6,_6,-6,_1_|7,_2_5-3_4_|3_6,_6,-6,_1_|7,_1_5.4_3_2_\ +3_6,_6,-6,_1_|7,_2_5-3_4_|3_6,_6,-6,_1_|7,_1_5.4_3_2_}\ \ 6,_3_2_6_^%-|[23^6]'---|5,_2_1_5_^%-|[1'2'^5']---\ 6,_3_2_6_^%-|[1'2'^6']-..1''_|7'_5'_2'_1'_^%-^|%---\ @@ -30,11 +30,11 @@ 04,_^1_^5_^6.^|%4,_^1_^5_^6.^|%3,_^7,_4#_^5.^|%3,_^7,_^4#_^5_^6^\ %2,_^6,_^3_^4.^|%2,_^6,_^3_^4.^|%1,_^5,_^2_^3.^|%1,_^5,_^2_^3.^\ %2,_^6,_^3_^4.^|%4,_^1_^5_^6.^|%3,_^7,_^3_^4#_0|0---\ -<1=D,><2/2>\ +{<1=D,><2/2>\ 0-[36]1[36]1[36]1|[36]1[36]1[36]1[36]1|[36]1[25]7,[25]7,[25]7,|[25]7,[25]7,[25]7,[25]7,\ [25]7,[36]1[36]1[36]1|[36]1[36]1[36]1[36]1|[36]1[25]7,[25]7,[25]7,|[25]7,[25]7,[25]7,[25]7,\ [25]7,[46]2[46]2[46]2|[46]2[46]2[46]2[46]2|[46]2[25]7,[25]7,[25]7,|[25]7,[25]7,[25]7,[25]7,\ -[46]2[46]2[46]2[46]2|[25]7,[25]7,[25]7,[25]7,|[46]2[46]2[46]2[46]2|[25]7,[25]7,[25]7,[25]7,\ +[46]2[46]2[46]2[46]2|[25]7,[25]7,[25]7,[25]7,|[46]2[46]2[46]2[46]2|[25]7,[25]7,[25]7,[25]7,}\ <1=D><4/4>\ 4,_1_5_6_^%-^|%---|3,_1_3_5_^%-^|%---\ 4,_1_5_6_^%-^|%---|6,_3_7_1'_^%-^|%---\ @@ -52,5 +52,5 @@ 0---|0---|0---|0---|0---|0---|0---|0---\ 0---|0---|0--0_2'_|5'_1'_71'2'|3'0--|0---|0--0_2'_|5'_1'_71'2'\ 3'0--|0---|0---|0---|0---|0---|0---|0---\ -3---^|3---|| +{3---^|3---}|| diff --git a/Songs/Nyan_Cat.qys b/Songs/Nyan_Cat.qys index 3207bce..42aa4dc 100644 --- a/Songs/Nyan_Cat.qys +++ b/Songs/Nyan_Cat.qys @@ -4,22 +4,11 @@ <1.0><1=B''>\ 34501'43451'3'4'3'71'0|5034501'02'71'2'4'3'4'2'<1=B'>\ -:5-6-3b3-23b21-1-2-|3b-3b2123563523121|3-5-6352313b33b212|3b-123523b212-1-2-\ - 5-6-3b3-23b21-1-2-|3b-3b2123563523121|3-5-6352313b33b212|3b-123523b212-1-2-\ - 1-5,6,1-5,6,12324345|1-1-5,6,15,43214,3,4,5,|1-5,6,1-5,6,112315,6,5,|1-17,15,6,143451-7,-\ - 1-5,6,1-5,6,12324345|1-1-5,6,15,43214,3,4,5,|1-5,6,1-5,6,112315,6,5,|1-17,15,6,143451-7,-:\ -:5-6-3b3-23b21-1-2-|3b-3b2123563523121|3-5-6352313b33b212|3b-123523b212-1-2-\ - 5-6-3b3-23b21-1-2-|3b-3b2123563523121|3-5-6352313b33b212|3b-123523b212-1-2-\ - 1-5,6,1-5,6,12324345|1-1-5,6,15,43214,3,4,5,|1-5,6,1-5,6,112315,6,5,|1-17,15,6,143451-7,-\ - 1-5,6,1-5,6,12324345|1-1-5,6,15,43214,3,4,5,|1-5,6,1-5,6,112315,6,5,|1-17,15,6,143451-7,-:| +{4*\ + {2*5-6-3b3-23b21-1-2-|3b-3b2123563523121|3-5-6352313b33b212|3b-123523b212-1-2-}\ + {2*1-5,6,1-5,6,12324345|1-1-5,6,15,43214,3,4,5,|1-5,6,1-5,6,112315,6,5,|1-17,15,6,143451-7,-}\ +} <0.8><1=B,,>\ 0---|0---\ -:44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ - 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ - 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ - 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123:\ -:44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ - 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ - 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123\ - 44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123:| +{16*44'55'33'66'|22'55'1_1'_123|44'55'33'66'|22'55'1_1'_123} diff --git a/Songs/Oriental_Pearl.qys b/Songs/Oriental_Pearl.qys index 24e8252..815fef9 100644 --- a/Songs/Oriental_Pearl.qys +++ b/Songs/Oriental_Pearl.qys @@ -1,4 +1,4 @@ -//֮ +//东方之珠 <4/4> diff --git a/Songs/Rainbow.qys b/Songs/Rainbow.qys index 84b71c3..ae6982a 100644 --- a/Songs/Rainbow.qys +++ b/Songs/Rainbow.qys @@ -1,5 +1,5 @@ -//ʺ -//ܽ +//彩虹 +//周杰伦 <1=C><80><4/4> diff --git a/Songs/Shionari.qys b/Songs/Shionari.qys index 59fade4..747e25a 100644 --- a/Songs/Shionari.qys +++ b/Songs/Shionari.qys @@ -1,4 +1,4 @@ -//Q +//潮鸣 <1=C><78><4/4> diff --git a/Songs/Touhou/Dark_Side_of_Fate.qys b/Songs/Touhou/Dark_Side_of_Fate.qys index 4fcce78..6de9045 100644 --- a/Songs/Touhou/Dark_Side_of_Fate.qys +++ b/Songs/Touhou/Dark_Side_of_Fate.qys @@ -1,76 +1,82 @@ -//\Υ` +//運命のダークサイド //ZUN +//-------------------- Section A -------------------- <168><4/4> <1=bD><1.0>\ 3.3_4.4_|4#.%_5.5_|[33']_%_%_%_[44']_%%_|[44']#_%_%_%_[55']_%%_| <1=bD,><0.4>\ -:[3,6,3].%_[4,6,4].%_|[4#,6,4#].%_[5,6,5].%_:| +{2*[3,6,3].%_[4,6,4].%_|[4#,6,4#].%_[5,6,5].%_} +//-------------------- Section B -------------------- <168><4/4> <1=E><1.0>\ -[16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']\ -[61']--%[46]--5_4_|[7,2].%.%3_4_3_4_[7,3]-\ -[16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']\ -[61']--%[46]-05_4_|[7,2].%.%3_4_3_4_[7,3].1_\ -:6,_7,_1_2_12_3_3_6_7_1'_[72']1'_2'_|[36]_%_[13]'_%_[36]_%_[13]'_%_[36]--3_1_\ -6,_7,_1_2_12_3_3_6_7_1'_[72']3'_5'_|6'_3'_2'_1'_6_3_2_1_6,---:\ -<1=bD>\ -[16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']\ -[61']--%[46]--5_4_|[7,2].%.%3_4_3_4_[7,3]-\ -[16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']\ -[61']--%[46]--5_4_|[7,2].%.%3_4_3_4_[7,3]3_1_\ -:6,_7,_1_2_[13]2_3_3_6_7_1'_[72']1'_2'_|[36]_%_[13]'_%_[36]_%_[13]'_%_[36]--3_1_\ -6,_7,_1_2_[13]2_3_3_6_7_1'_[72']3'_5'_|6'_3'_2'_1'_6_3_2_1_6,---:| +{ [16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']|[61']--%[46]--5_4_\ + 1:[7,2].%.%3_4_3_4_[7,3]-\ + 2:[7,2].%.%3_4_3_4_[7,3].1_\ +}\ +{2* 6,_7,_1_2_12_3_3_6_7_1'_[72']1'_2'_|[36]_%_[13]'_%_[36]_%_[13]'_%_[36]--3_1_\ + 6,_7,_1_2_12_3_3_6_7_1'_[72']3'_5'_|6'_3'_2'_1'_6_3_2_1_6,---} <1=E,,><0.4>\ -:6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]:\ -:6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]:\ -:4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]:\ -:4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]:\ -<1=bD,,>\ -:6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]:\ -:6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]:\ -:4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]:\ -:4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]:| +{4*6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]}\ +{4*4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]} + +//-------------------- Section B' -------------------- +<168><4/4> + +<1=bD>\ +{ [16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']|[61']--%[46]--5_4_\ + 1: [7,2].%.%3_4_3_4_[7,3]-\ + 2: [7,2].%.%3_4_3_4_[7,3]3_1_\ +}\ +{2* 6,_7,_1_2_[13]2_3_3_6_7_1'_[72']1'_2'_|[36]_%_[13]'_%_[36]_%_[13]'_%_[36]--3_1_\ + 6,_7,_1_2_[13]2_3_3_6_7_1'_[72']3'_5'_|6'_3'_2'_1'_6_3_2_1_6,---} + +<1=bD,,><0.4>\ +{4*6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]}\ +{4*4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]} +//-------------------- Section A -------------------- <168><4/4> <1=bD><1.0>\ 3.3_4.4_|4#.%_5.5_|[33']_%_%_%_[44']_%%_|[44']#_%_%_%_[55']_%%_| <1=bD,><0.4>\ -:3,[6,3]3,[6,3]4,[6,4]4,[6,4]|4#,[6,4#]4#,[6,4#]5,[6,5]5,[6,5]:| +{2*3,[6,3]3,[6,3]4,[6,4]4,[6,4]|4#,[6,4#]4#,[6,4#]5,[6,5]5,[6,5]} +//-------------------- Section B -------------------- <168><4/4> <1=E><1.0>\ -[16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']\ -[61']--%[46]--5_4_|[7,2].%.%3_4_3_4_[7,3]-\ -[16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']\ -[61']--%[46]-05_4_|[7,2].%.%3_4_3_4_[7,3]3_1_\ -:6,_7,_1_2_12_3_3_6_7_1'_[72']1'_2'_|[36]_%_[13]'_%_[36]_%_[13]'_%_[36]--3_1_\ -6,_7,_1_2_12_3_3_6_7_1'_[72']3'_5'_|6'_3'_2'_1'_6_3_2_1_6,---:\ -<1=G>\ -[16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']\ -[61']--%[46]--5_4_|[7,2].%.%3_4_3_4_[7,3]-\ -[16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']\ -[61']--%[46]--5_4_|[7,2].%.%3_4_3_4_[7,3]3_1_\ -:6,_7,_1_2_[13]2_3_3_6_7_1'_[72']1'_2'_|[36]_%_[13]'_%_[36]_%_[13]'_%_[36]--3_1_\ -6,_7,_1_2_[13]2_3_3_6_7_1'_[72']3'_5'_|6'_3'_2'_1'_6_3_2_1_6,---:| +{ [16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']|[61']--%[46]--5_4_\ + 1: [7,2].%.%3_4_3_4_[7,3]-\ + 2: [7,2].%.%3_4_3_4_[7,3]3_1_\ +}\ +{2* 6,_7,_1_2_[13]2_3_3_6_7_1'_[72']1'_2'_|[36]_%_[13]'_%_[36]_%_[13]'_%_[36]--3_1_\ + 6,_7,_1_2_[13]2_3_3_6_7_1'_[72']3'_5'_|6'_3'_2'_1'_6_3_2_1_6,---} <1=E,,><0.4>\ -:6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]:\ -:6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]:\ -:4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]:\ -:4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]:\ +{4*6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]}\ +{4*4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]} + +//-------------------- Section B'' -------------------- +<168><4/4> + +<1=G>\ +{ [16]3_6_7_1'_[72'][46]--%|[57]6_7_7_1'_7_5_[7,3].[7,6b].[6b3']|[61']--%[46]--5_4_\ + 1: [7,2].%.%3_4_3_4_[7,3]-\ + 2: [7,2].%.%3_4_3_4_[7,3]3_1_\ +}\ +{2* 6,_7,_1_2_[13]2_3_3_6_7_1'_[72']1'_2'_|[36]_%_[13]'_%_[36]_%_[13]'_%_[36]--3_1_\ + 6,_7,_1_2_[13]2_3_3_6_7_1'_[72']3'_5'_|6'_3'_2'_1'_6_3_2_1_6,---} + <1=G,,>\ -:6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]:\ -:6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]:\ -:4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]:\ -:4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]:| +{4*6,[36]6,[36]4,[14]4,[14]|5,[25]5,[25]3,[7,3]3,[7,3]}\ +{4*4,[14]5,[25]6,[36]6,[36]|4,[14]5,[25]6,[36]6,[36]} \ No newline at end of file diff --git a/Songs/Touhou/Necro_Fantasia.qys b/Songs/Touhou/Necro_Fantasia.qys index 97e9797..5ab1e32 100644 --- a/Songs/Touhou/Necro_Fantasia.qys +++ b/Songs/Touhou/Necro_Fantasia.qys @@ -70,12 +70,12 @@ [6,136],.[5,7,35],3,_[57],_[4#,6,24#],_^|%_4#,,_[6,2],_[4,6,24],4,,_6,,_2,,_|[2,4,6,2],.[3,5#,7,3],-[4,6,14],_^|%_4,,_6,,[5,7,25],5,,\ [6,136],.[5,7,35],3,_7,_[4#,6,24#],_^|%_4#,,_[6,2],_4,,_[4,6,24],.2,,_|[2,4,6,2],.[3,5#,7,3],3,,[4,6,14],_^|%_4,,_[14],_[5,7,25],5,,_7,,\ <1=bD>\ -:2,,6,,2,6,,2,6,,2,6,,3,,7,,3,7,,3,7,,3,7,,|4,,1,4,1,4,1,4,1,5,,2,5,2,5,2,5,2,:\ -:2,,6,,2,6,,2,6,,2,6,,3,,7,,3,7,,3,7,,3,7,,|4,,1,4,1,4,1,4,1,5,,2,5,2,5,2,5,2,:\ -:2,,6,,2,6,,2,6,,2,6,,3,,7,,3,7,,3,7,,3,7,,|4,,1,4,1,4,1,4,1,5,,2,5,2,5,2,5,2,:\ -2,,6,,2,6,,2,6,,2,6,,3,,7,,3,7,,3,7,,3,7,,|4,,1,4,1,4,1,4,1,5,,2,5,2,5,2,5,2,\ -2,,6,,2,6,,2,6,,2,6,,3,,7,,3,7,,3,7,,3,7,,|[3,7,3],-4#,,~1#-\ -<1=D>\ +{\ + 2,,6,,2,6,,2,6,,2,6,,3,,7,,3,7,,3,7,,3,7,,\ + : 4,,1,4,1,4,1,4,1,5,,2,5,2,5,2,5,2,\ + 8: [3,7,3],-4#,,~1#-\ +}\ +<1=D>\ 4,,__5,,__6,,__1,__4,__5,__6,__1__0_[61']_%|5,,__6,,__7,__2,__5,__6,__7,__2__0_[72']_[73']\ [31'].[257].2,__5b,__6,__2__|0--0_4,,_^\ %1__6,__1__2__0_[46]_%|[5,5],-[57]_%_%_3,,_\ @@ -85,14 +85,14 @@ %1__6,__1__2__0_[46]_%|[5,5],-[57]_%_%_3,,_\ 3,[35#7]_%%_%_3,,_|[3,3],.[35#7],.[3,5#,7,3],^|%-4#,,,~1#-\ <1=C>\ -:4,,6,,1,4,6,,1,4,6,16,4,1,6,4,1,6,,|5,,7,,2,5,7,,2,5,7,27,5,2,7,5,2,7,,\ +{2*4,,6,,1,4,6,,1,4,6,16,4,1,6,4,1,6,,|5,,7,,2,5,7,,2,5,7,27,5,2,7,5,2,7,,\ 6,,1,3,6,1,3,6,1316,3,16,3,1|6,,1,3,6,1,3,6,1316,3,16,3,1\ 4,,6,,1,4,6,,1,4,6,16,4,1,6,4,1,6,,|5,,7,,2,5,7,,2,5,7,27,5,2,7,5,2,7,,\ 3,,5,,7,,3,5,,7,,3,5,7,5,3,7,,5,3,7,5,,|3,,5,,7,,3,5,,7,,3,5,7,5,3,7,,5,3,7,5,,\ 4,,6,,1,4,6,,1,4,6,16,4,1,6,4,1,6,,|5,,7,,2,5,7,,2,5,7,27,5,2,7,5,2,7,,\ 6,,1,3,6,1,3,6,1316,3,16,3,1|6,,1,3,6,1,3,6,1316,3,16,3,1\ 4,,6,,1,4,6,,1,4,6,16,4,1,6,4,1,6,,|5,,7,,2,5,7,,2,5,7,27,5,2,7,5,2,7,,\ -6,,1#,3,6,1#,3,6,1#31#6,3,1#6,3,1#|3,6,1#31#6,3,6,1#31#6,3-0-:\ +6,,1#,3,6,1#,3,6,1#31#6,3,1#6,3,1#|3,6,1#31#6,3,6,1#31#6,3-0-}\ <1=B>\ 4,,6,,1,4,6,,1,4,6,16,4,1,6,4,1,6,,|5,,7,,2,5,7,,2,5,7,27,5,2,7,5,2,7,,\ 6,,1,3,6,1,3,6,1316,3,16,3,1|6,,1,3,6,1,3,6,1316,3,16,3,1\ diff --git a/Songs/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.qys b/Songs/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.qys index bfa0a66..b93f4dd 100644 --- a/Songs/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.qys +++ b/Songs/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.qys @@ -4,19 +4,19 @@ <1=C><160><7/4> \ -:7532'.1'.2'7537b53b7b:\ -:5317.6.75315b3b1b5b:\ -:[57][35][7,3][72'].[61'].[72'][57][35][7,3][57b][3b5][7,3]b[57b]:\ -:[35][13][5,1][57].[4#6].[57][35][13][5,1][35]b[13]b[5,1]b[35]b:\ +{2*7532'.1'.2'7537b53b7b}\ +{2*5317.6.75315b3b1b5b}\ +{2*[57][35][7,3][72'].[61'].[72'][57][35][7,3][57b][3b5][7,3]b[57b]}\ +{2*[35][13][5,1][57].[4#6].[57][35][13][5,1][35]b[13]b[5,1]b[35]b}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|5#1#'5#'-62'6'-| <0.6>\ -:[373'].[41'4']-[373'].[3b73b']-:\ -:[151'].[262']-[151'].[1b51b']-:\ -:[373'].[41'4']-[373'].[3b73b']-:\ -:[151'].[262']-[151'].[1b51b']-:\ +{2*[373'].[41'4']-[373'].[3b73b']-}\ +{2*[151'].[262']-[151'].[1b51b']-}\ +{2*[373'].[41'4']-[373'].[3b73b']-}\ +{2*[151'].[262']-[151'].[1b51b']-}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 3[73']3[73']4[74']4[74']|3[73']3[73']4[74']4[74']|4#[14]#'4#[14]#'5[1#5]'5[1#5]'|5#[15]#'5#[15]#'6[26]'6[26]'| @@ -24,8 +24,8 @@ <0.2>\ 0------|0------\ 0------|0------\ -:375[46][61'][14]'[61']375[3b5][57b][73']b[57b]:\ -:[35]'[13]'[51'][57][4#6][57][73'][35][13][51'][73']b[35]b'[57]b'[35]b':\ +{2*375[46][61'][14]'[61']375[3b5][57b][73']b[57b]}\ +{2*[35]'[13]'[51'][57][4#6][57][73'][35][13][51'][73']b[35]b'[57]b'[35]b'}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|5#1#'5#'-62'6'-| @@ -33,8 +33,8 @@ <0.4>\ 0------|0------\ 0------|0.----[151']b%%\ -:[373']%%[41'4'].%.%[373']%%%b%%%:\ -:[151']%%[262'].%.%[151']%%%b%%%:\ +{2*[373']%%[41'4'].%.%[373']%%%b%%%}\ +{2*[151']%%[262'].%.%[151']%%%b%%%}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|5#1#'5#'-62'6'-| @@ -43,23 +43,23 @@ <1=bC><160><7/4> \ -:7532'.1'.2'7537b53b7b:\ -:5317.6.75315b3b1b5b:\ -:[57][35][7,3][72'].[61'].[72'][57][35][7,3][57b][3b5][7,3]b[57b]:\ -:[35][13][5,1][57].[4#6].[57][35][13][5,1][35]b[13]b[5,1]b[35]b:\ -:[577'][355'][7,33'][72'2''].[61'1''].[72'2''][577'][355'][7,33'][57b7b'][3b55'][7,33']b[57b7b']:\ -:[355'][133'][5,11'][577'].[4#66'].[577'][355'][133'][5,11'][355']b[133']b[5,11']b[355']b:\ +{2*7532'.1'.2'7537b53b7b}\ +{2*5317.6.75315b3b1b5b}\ +{2*[57][35][7,3][72'].[61'].[72'][57][35][7,3][57b][3b5][7,3]b[57b]}\ +{2*[35][13][5,1][57].[4#6].[57][35][13][5,1][35]b[13]b[5,1]b[35]b}\ +{2*[577'][355'][7,33'][72'2''].[61'1''].[72'2''][577'][355'][7,33'][57b7b'][3b55'][7,33']b[57b7b']}\ +{2*[355'][133'][5,11'][577'].[4#66'].[577'][355'][133'][5,11'][355']b[133']b[5,11']b[355']b}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|5#1#'5#'-62'6'-| <0.6>\ -:[373'].[41'4']-[373'].%b-:\ -:[151'].[262']-[151'].%b-:\ -:[373'].[41'4']-[373'].%b-:\ -:[151'].[262']-[151'].%b-:\ -:[373'].[41'4']-[373'].%b-:\ -:[151'].[262']-[151'].%b-:\ +{2*[373'].[41'4']-[373'].%b-}\ +{2*[151'].[262']-[151'].%b-}\ +{2*[373'].[41'4']-[373'].%b-}\ +{2*[151'].[262']-[151'].%b-}\ +{2*[373'].[41'4']-[373'].%b-}\ +{2*[151'].[262']-[151'].%b-}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 3[73']3[73']4[74']4[74']|3[73']3[73']4[74']4[74']|4#[14]#'4#[14]#'5[1#5]'5[1#5]'|5#[15]#'5#[15]#'6[26]'6[26]'| @@ -67,31 +67,31 @@ <0.2>\ 0------|0------\ 0------|0------\ -:375[46][61'][14]'[61']375[3b5][57b][73']b[57b]:\ -:[35]'[13]'[51'][57][4#6][57][73'][35][13][51'][73']b[35]b'[57]b'[35]b':\ -:375[46][61'][14]'[61']375[3b5][57b][73']b[57b]:\ -:[35]'[13]'[51'][57][4#6][57][73'][35][13][51'][73']b[35]b'[57]b'[35]b':\ +{2*375[46][61'][14]'[61']375[3b5][57b][73']b[57b]}\ +{2*[35]'[13]'[51'][57][4#6][57][73'][35][13][51'][73']b[35]b'[57]b'[35]b'}\ +{2*375[46][61'][14]'[61']375[3b5][57b][73']b[57b]}\ +{2*[35]'[13]'[51'][57][4#6][57][73'][35][13][51'][73']b[35]b'[57]b'[35]b'}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|5#1#'5#'-62'6'-| <0.1>\ -:[373']----%b-:\ -:[151']----%b-:\ -:[373']----%b-:\ -:[151']----%b-:\ -:[373']----%b-:\ -:[151']----%b-:\ +{2*[373']----%b-}\ +{2*[151']----%b-}\ +{2*[373']----%b-}\ +{2*[151']----%b-}\ +{2*[373']----%b-}\ +{2*[151']----%b-}\ <4/4>0---|0---|0---|0---\ 0---|0---|0---|0---| <0.4>\ -:[373']----%b-:\ -:[151']----%b-:|\ -:[373']%%[41'4'].%.%[373']%%%b%%%:\ -:[151']%%[262'].%.%[151']%%%b%%%:\ -:[373']%%[41'4'].%.%[373']%%%b%%%:\ -:[151']%%[262'].%.%[151']%%%b%%%:\ +{2*[373']----%b-}\ +{2*[151']----%b-}|\ +{2*[373']%%[41'4'].%.%[373']%%%b%%%}\ +{2*[151']%%[262'].%.%[151']%%%b%%%}\ +{2*[373']%%[41'4'].%.%[373']%%%b%%%}\ +{2*[151']%%[262'].%.%[151']%%%b%%%}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|5#1#'5#'-62'6'-| @@ -184,19 +184,19 @@ <1=C><160><7/4> \ -:7532'.1'.2'7537b53b7b:\ -:5317.6.75315b3b1b5b:\ -:[57][35][7,3][72'].[61'].[72'][57][35][7,3][57b][3b5][7,3]b[57b]:\ -:[35][13][5,1][57].[4#6].[57][35][13][5,1][35]b[13]b[5,1]b[35]b:\ +{2*7532'.1'.2'7537b53b7b}\ +{2*5317.6.75315b3b1b5b}\ +{2*[57][35][7,3][72'].[61'].[72'][57][35][7,3][57b][3b5][7,3]b[57b]}\ +{2*[35][13][5,1][57].[4#6].[57][35][13][5,1][35]b[13]b[5,1]b[35]b}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|5#1#'5#'-62'6'-| <0.3>\ -:[373'].[41'4']-[373'].[3b73b']-:\ -:[151'].[262']-[151'].[1b51b']-:\ -:[373'].[41'4']-[373'].[3b73b']-:\ -:[151'].[262']-[151'].[1b51b']-:\ +{2*[373'].[41'4']-[373'].[3b73b']-}\ +{2*[151'].[262']-[151'].[1b51b']-}\ +{2*[373'].[41'4']-[373'].[3b73b']-}\ +{2*[151'].[262']-[151'].[1b51b']-}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 3[73']3[73']4[74']4[74']|3[73']3[73']4[74']4[74']|4#[14]#'4#[14]#'5[1#5]'5[1#5]'|5#[15]#'5#[15]#'6[26]'6[26]'| @@ -204,8 +204,8 @@ <0.8>\ 0------|0------\ 0------|0------\ -:375[46][61'][14]'[61']375[3b5][57b][73']b[57b]:\ -:[35]'[13]'[51'][57][4#6][57][73'][35][13][51'][73']b[35]b'[57]b'[35]b':\ +{2*375[46][61'][14]'[61']375[3b5][57b][73']b[57b]}\ +{2*[35]'[13]'[51'][57][4#6][57][73'][35][13][51'][73']b[35]b'[57]b'[35]b'}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|5#1#'5#'-62'6'-| @@ -213,15 +213,15 @@ <0.5>\ 0------|0------\ 0------|0.----[151']b%%\ -:[373']%%[41'4'].%.%[373']%%%b%%%:\ -:[151']%%[262'].%.%[151']%%%b%%%:\ +{2*[373']%%[41'4'].%.%[373']%%%b%%%}\ +{2*[151']%%[262'].%.%[151']%%%b%%%}\ <4/4>\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|4#1#'4#'-51#'5'-\ 373'-474'-|373'-474'-|4#1#'4#'-51#'5'-|5#1#'5#'-62'6'-| <0.1>\ -:[373']----%b-:\ -:[151']----%b-:\ +{2*[373']----%b-}\ +{2*[151']----%b-}\ 0------|0------\ 0------|0------\ <4/4>\ diff --git a/library.wl b/library.wl index 97ea034..2ea134c 100644 --- a/library.wl +++ b/library.wl @@ -58,24 +58,7 @@ aboutTags={"Version","Producer","Website"}; (* some functions *) -findMatch[score_,pos_]:=Module[ - {i=pos+1,left,right,stack=1}, - left=StringPart[score,pos]; - right=matchDict[[left]]; - While[i<=StringLength[score], - Switch[StringPart[score,i], - left,stack++, - right,stack--;If[stack==0,Break[]]; - ]; - i++ - ]; - Return[i]; -];(* this part will be deleted before ver 1.6 release *) textLength[string_]:=2StringLength[string]-StringCount[string,Alternatives@CharacterRange[32,127]]; -toArgument[str_]:=If[StringContainsQ[str,","], - ToExpression/@StringSplit[str,","], - ToExpression@str -];(* this part will be deleted before ver 1.6 release *) toBase32[n_]:=StringDelete[ToString@BaseForm[n,32],"\n"~~__]; timeDisplay[t_]:=Module[ {sec=Floor[QuantityMagnitude[UnitConvert[t,"Seconds"]]]}, @@ -86,22 +69,18 @@ completeText[raw_,arg_]:=StringReplace[raw,Flatten@Array[{ "$"<>ToString[#]->arg[[#]], "#"<>ToString[#]->StringRiffle[ToString[#,FormatType->InputForm]&/@arg[[#]],", "] }&,Length@arg]]; -generateMessage[tag_,arg_]:=completeText[errorDict[[tag]],arg];(* this part will be deleted before ver 1.6 release *) caption[string_,style_]:=caption[string,style,{}]; -caption[string_,style_,argument_]:=Style[ - completeText[ +caption[string_,style_,argument_]:=Style[completeText[ If[StringLength@string>0&&StringPart[string,1]=="_",text[[StringDrop[string,1]]],string], - argument], -styleDict[[style]]]; +argument],styleDict[[style]]]; -(* parse related *) +(* tokenizer related *) rep=#~~(","~~#)...&; int=DigitCharacter..; +expr=Except["("|")"]..; name=LetterCharacter~~WordCharacter...; real=DigitCharacter...~~"."~~DigitCharacter...; -matchDict=<|"["->"]","("->")","{"->"}","<"->">"|>;(* this part will be deleted before ver 1.6 release *) -pitchDict=<|"1"->0,"2"->2,"3"->4,"4"->5,"5"->7,"6"->9,"7"->11|>;(* this part will be deleted before ver 1.6 release *) tonalityDict=<| "C"->0,"G"->7,"D"->2,"A"->-3,"E"->4, "B"->-1,"#F"->6,"#C"->1,"F"->5,"bB"->-2, @@ -109,28 +88,11 @@ tonalityDict=<| "F#"->6,"C#"->1,"Bb"->-2,"Gb"->6, "Eb"->3,"Ab"->-4,"Db"->1,"Cb"->-1 |>; -pitchOpDict=<| - "#"->1,"b"->-1,"'"->12,","->-12,"M"->{0,4,7},"m"->{0,3,7}, - "a"->{0,4,8},"d"->{0,3,6},"p"->{0,7,12},"o"->{0,12} -|>;(* this part will be deleted before ver 1.6 release *) -chordDict=<| - "M"->{0,4,7},"m"->{0,3,7},"a"->{0,4,8}, - "d"->{0,3,6},"p"->{0,7,12},"o"->{0,12} -|>; -pitchOpDefault={"SemitonesCount"->0,"OctavesCount"->0,"ChordSymbol"->""}; -pitchOpList=Append[Keys[pitchOpDict],"$"];(* this part will be deleted before ver 1.6 release *) getArgument[string_,function_]:=Switch[function, "Instr",{string}, "Volume"|"Chord",ToExpression/@StringSplit[string,","], _,ToExpression[string] ]; -defaultParameter=<| - "Volume"->{1},"Speed"->90,"Key"->0,"Beat"->4,"Bar"->4,"Instr"->{"Piano"}, - "Dur"->0,"FadeIn"->0,"FadeOut"->0,"Stac"->1/2,"Appo"->1/4,"Oct"->0, - "Port"->6,"Spac"->0,"Chord"->{0,12},"Trace"->1 -|>; -funcList=Keys@defaultParameter; -metaSettings={"Instr","Volume","FadeIn","FadeOut"}; writeInfo[song_,info_]:=Export[ diff --git a/parser.wl b/parser.wl index bde8bc6..f925e85 100644 --- a/parser.wl +++ b/parser.wl @@ -1,5 +1,15 @@ (* ::Package:: *) +defaultSettings=<| + "Volume"->{1},"Speed"->90,"Key"->0,"Beat"->4,"Bar"->4,"Instr"->{"Piano"}, + "Dur"->0,"FadeIn"->0,"FadeOut"->0,"Stac"->1/2,"Appo"->1/4,"Oct"->0, + "Port"->6,"Spac"->0,"Chord"->{0,12},"Trace"->1 +|>; +funcList=Keys@defaultSettings; +metaSettingTag={"Instr","Volume","FadeIn","FadeOut"}; +effectSettingTag={"FadeIn","FadeOut"}; + + beatCalc[operators_]:=Module[{beats=1,i=1}, Do[ Switch[operator, @@ -10,8 +20,12 @@ beatCalc[operators_]:=Module[{beats=1,i=1}, {operator,StringCases[operators,{"-","_","."..}]}]; Return[beats]; ]; -pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol,pitchDict}, +pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol,pitchDict,chordDict}, pitchDict=<|1->0,2->2,3->4,4->5,5->7,6->9,7->11,10->10|>; + chordDict=<| + "M"->{0,4,7},"m"->{0,3,7},"a"->{0,4,8}, + "d"->{0,3,6},"p"->{0,7,12},"o"->{0,12} + |>; If[KeyExistsQ[token,"Pitches"], pitches=Flatten[pitchCalc[#,settings,previous]&/@Association/@token[["Pitches"]]], pitches=Switch[token[["ScaleDegree"]], @@ -33,9 +47,11 @@ pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol,pitchDict}, ]; -trackParse[tokens_,global_]:=Module[ +trackParse[tokenizer_,global_]:=Module[ { - i,settings=global, + tokens=Association/@tokenizer[["Contents"]], + repeat=tokenizer[["Repeat"]], + settings=global, functionData,pitches, beatCount,duration=0, barBeat=0,prevBeat, @@ -49,22 +65,23 @@ trackParse[tokens_,global_]:=Module[ portamento=False,portRate, previous=Array[None&,4], + voltaData,voltaSettings, + voltaDefault,volta={}, + master,lastRepeat=<||>, + soundData={},durCount=0, + trackData, (* return value *) - soundData={},lastRepeat={}, - trackDuration=0,messages={} + trackDuration,MusicClips,messages={} }, + MusicClips=<|"Main"->Null,"Accent"->Nothing,"Subtracks"->{}|>; + If[repeat>0, + voltaData=ConstantArray[<||>,repeat]; + voltaDefault=Complement[Range@repeat,Union@@Cases[tokens, + v:<|"Type"->"Volta",__|>:>v[["Order"]] + ]] + ]; Do[ Switch[token[["Type"]], - "BarLine", - If[token[["Volta"]],lastRepeat=soundData]; - If[barBeat!=0, - barCount++; - If[barBeat!=settings[["Bar"]],AppendTo[messages,<| - "Type"->"BarLengthError", - "Info"->{barCount,settings[["Bar"]],barBeat} - |>]]; - barBeat=0; - ], "FunctionToken", functionData=Association@token[["Argument"]]; Do[ @@ -77,14 +94,14 @@ trackParse[tokens_,global_]:=Module[ tremolo1=token[["StrokesCount"]], "Tremolo2", tremolo2=token[["StrokesCount"]]; - trackDuration-=duration, + durCount-=duration, "Appoggiatura", appoggiatura=pitchCalc[token,settings,previous], "Tie", tie=True, "Portamento", portamento=True; - trackDuration-=duration, + durCount-=duration, "Note", pitches=pitchCalc[token,settings,previous]; If[!pitches==={None},previous=Prepend[Drop[previous,-1],pitches]]; @@ -93,7 +110,7 @@ trackParse[tokens_,global_]:=Module[ If[tuplet>0,beatCount*=tupletRatio;tuplet--]; barBeat+=beatCount; duration=240/settings[["Speed"]]/settings[["Beat"]]*beatCount; - trackDuration+=duration; + durCount+=duration; staccato=token[["Staccato"]]; If[token[["Arpeggio"]], appoggiatura=Flatten/@Array[Take[pitches,#]&,Length@pitches-1] @@ -149,42 +166,82 @@ trackParse[tokens_,global_]:=Module[ staccato=False, AppendTo[soundData,{pitches,duration}]; ]; + ], + "BarLine", + If[token[["Skip"]],lastRepeat=<|"SoundData"->soundData,"Duration"->durCount|>]; + If[barBeat!=0, + barCount++; + If[barBeat!=settings[["Bar"]],AppendTo[messages,<| + "Type"->"BarLengthError", + "Info"->{barCount,settings[["Bar"]],barBeat} + |>]]; + barBeat=0; + ], + "Volta", + If[volta=={}, + voltaSettings=settings; + master=<|"SoundData"->soundData,"Duration"->durCount|>, + voltaData[[volta]]=<|"SoundData"->soundData,"Duration"->durCount|>; ]; - "Subtrack", - + volta=If[#Index=={},voltaDefault,#Index]&[token]; + settings=voltaSettings; + soundData={};durCount=0, + "Track", + trackData=trackParse[token,settings]; + Do[ + If[musicClip[["MetaSettings"]]==settings[[metaSettingTag]], + soundData=Join[soundData,musicClip[["SoundData"]]], + soundData=AppendTo[soundData,{None,trackData[["Duration"]]}]; + AppendTo[MusicClips[["Subtracks"]],<| + "SoundData"->musicClip[["SoundData"]], + "Beginning"->musicClip[["Beginning"]]+durCount, + "Duration"->musicClip[["Duration"]], + "MetaSettings"->musicClip[["MetaSettings"]] + |>] + ], + {musicClip,trackData[["MusicClips"]]}]; + durCount+=trackData[["Duration"]]; ], {token,Association/@tokens}]; + (* build main music clip *) + Switch[repeat, + _?Positive, + voltaData[[volta]]=<|"SoundData"->soundData,"Duration"->durCount|>; + trackDuration=repeat*master[["Duration"]]+Total[#Duration&/@voltaData]; + MusicClips[["Main"]]=<| + "SoundData"->Flatten[Join[master[["SoundData"]],#SoundData]&/@voltaData,1], + "Beginning"->0,"Duration"->trackDuration,"MetaSettings"->settings[[metaSettingTag]] + |>, + _?Negative, + If[lastRepeat==<||>,lastRepeat=<|"SoundData"->soundData,"Duration"->durCount|>]; + trackDuration=(-repeat-1)*durCount+lastRepeat[["Duration"]]; + MusicClips[["Main"]]=<| + "SoundData"->Flatten[Append[ConstantArray[soundData,(-repeat-1)],lastRepeat[["SoundData"]]],1], + "Beginning"->0,"Duration"->trackDuration,"MetaSettings"->settings[[metaSettingTag]] + |>, + _, + trackDuration=durCount; + MusicClips[["Main"]]=<| + "SoundData"->soundData,"Beginning"->0, + "Duration"->trackDuration,"MetaSettings"->settings[[metaSettingTag]] + |> + ]; Return[<| - "RealTracks"->{<|"SoundData"->soundData,"MetaSettings"->settings[[metaSettings]]|>}, + "MusicClips"->Join[{#Main,#Accent},#Subtracks]&[MusicClips], "Duration"->trackDuration, - "Messages"->messages, - "LastRepeat"->{{}} + "Messages"->messages |>] ]; -(* ::Input:: *) -(*QYS`getTrackToken["<0.6><1=bA,,>2030|"]*) - - -(* ::Input:: *) -(*tmp=trackParse[QYS`getTrackToken["<0.6><1=bA,,>20%0|"],defaultParameter]*) - - -(* ::Input:: *) -(*AudioStop[];AudioPlay@integrate@tmp[["RealTracks"]];*) - - parse[tokenizer_]:=Module[ { - audio,settings, - functionData, - trackData, - realTracks={}, - sectionDuration, - duration=0 + settings,functionData, + trackData,MusicClips={}, + sectionDuration,duration=0, + messages={},effects }, - settings=defaultParameter; + settings=defaultSettings; Do[ sectionDuration=0; Do[ @@ -195,24 +252,32 @@ parse[tokenizer_]:=Module[ {token,Association/@sectionToken[["GlobalSettings"]]}]; Do[ trackData=trackParse[trackToken,settings]; - realTracks=Join[realTracks,<| - "SoundData"->Prepend[#SoundData,{None,duration}], + MusicClips=Join[MusicClips,<| + "SoundData"->Prepend[#SoundData,{None,duration+#Beginning}], "MetaSettings"->#MetaSettings - |>&/@trackData[["RealTracks"]]]; + |>&/@trackData[["MusicClips"]]]; sectionDuration=Max[sectionDuration,trackData[["Duration"]]], {trackToken,sectionToken[["Tracks"]]}]; duration+=sectionDuration, {sectionToken,Association/@Association[tokenizer][["Sections"]]}]; - Return[realTracks]; + Return[MusicClips]; ]; (* ::Input:: *) -(*parse[QYS`Tokenize[path<>"Songs\\Anima.qys"]][[1,"SoundData"]]//Column*) +(*Export["E:\\1.mp3",AudioPad[QYSParse[path<>"Songs\\test.qys"],{1,3}]];*) (* ::Input:: *) -(*AudioStop[];AudioPlay@integrate[parse[QYS`Tokenize[path<>"Songs\\Touhou\\TH11-Chireiden\\Nuclear_Fusion.qys"]]];*) +(*AudioStop[];AudioPlay[#[[2]]]&@*) +(*EchoFunction["time: ",#[[1]]&]@*) +(*Timing[QYSParse[path<>"Songs\\test.qys"]];*) + + +(* ::Input:: *) +(*AudioStop[];AudioPlay[#[[2]]]&@*) +(*EchoFunction["time: ",#[[1]]&]@*) +(*Timing[QYSParse[path<>"Songs\\Touhou\\TH11-Chireiden\\Hartmann_No_Youkai_Otome.qys"]];*) integrate[tracks_]:=Module[ @@ -237,3 +302,36 @@ integrate[tracks_]:=Module[ {trackData,tracks}]; Return[audio]; ]; + + +(* ::Input:: *) +(*AudioStop[];AudioPlay@QYSParse[path<>"Songs\\TouHou\\TH11-Chireiden\\Nuclear_Fusion.qys"];*) + + +(* ::Input:: *) +(*AudioStop[];*) + + +(* ::Input:: *) +(*EmitSound@Sound@SoundNote[12,1,"SopranoSax"]*) + + +(* ::Input:: *) +(*EmitSound@Sound@SoundNote["HighTom",1]*) + + +(* ::Input:: *) +(*Export["E:\\1.mp3",QYSParse[path<>"Songs\\temp.qys"]];*) + + +(* ::Input:: *) +(*AudioStop[];AudioPlay@QYSParse[path<>"Songs\\Gate_of_Steiner.qys"];*) + + +(* ::Text:: *) +(*ElectricSnare, BassDrum, Shaker, RideCymbal, Snare, CrashCymbal, HiHatPedal, HiHatClosed*) +(*Ocarina, Oboe, Clarinet, Recorder, BrassSection, Harpsichord, BrightPiano, Organ, DrawbarOrgan, FretlessBass*) + + +(* ::Input:: *) +(*pitchDict[["2"]]+tonalityDict[["bE"]]+36*) diff --git a/qymParse.wl b/qymParse.wl index 29e3c58..614ca17 100644 --- a/qymParse.wl +++ b/qymParse.wl @@ -1,5 +1,7 @@ (* ::Package:: *) +Begin["QYMparse`"]; +pitchDict=<|"1"->0,"2"->2,"3"->4,"4"->5,"5"->7,"6"->9,"7"->11|>;(* this part will be deleted before ver 1.6 release *) getPitch1[dataString_,position_,tonality_]:=Module[ { note,pitch,i @@ -246,3 +248,4 @@ QYMParse[filename_]:=Module[ "Instruments"->instrumentList |>]]; ] +End[]; diff --git a/qysParse.wl b/qysParse.wl deleted file mode 100644 index 401de9d..0000000 --- a/qysParse.wl +++ /dev/null @@ -1,406 +0,0 @@ -(* ::Package:: *) - -(* ::Input:: *) -(*path=NotebookDirectory[];*) -(*<<(path<>"initial.wl")*) - - -getPitch2[score_,pos_,para_]:=Module[ - {i=pos,note,pitch,pitchData}, - If[StringPart[score,i]=="[", - i++; - pitch={}; - While[i<=StringLength[score] && StringPart[score,i]!="]", - pitchData=getPitch2[score,i,para]; - AppendTo[pitch,pitchData[[1]]]; - i=pitchData[[2]]; - ], - note=ToExpression@StringPart[score,i]; - pitch=If[note==0,None,pitchDict[[note]]+12*para[["Oct"]]+para[["Key"]]] - ]; - i++; - While[i<=StringLength@score && MemberQ[pitchOpList,StringPart[score,i]], - If[StringPart[score,i]=="$", - pitch+=para[["Chord"]], - pitch+=pitchOpDict[[StringPart[score,i]]] - ]; - i++; - ]; - If[i<=StringLength@score && StringPart[score,i]=="^",i++]; - Return[{pitch,i}]; -]; - - -track[score_,global_,location_]:=Module[ - { - i,j,k,char, (* loop related *) - content,match,position, (* operators *) - function,argument, (* functions *) - soundData={},audio, (* soundnotes *) - instrList={},messages={}, (* metainformation *) - parameter=global, - pitchData, - - percussion=False, (* percussion *) - tercet,tercetTime, (* tercet *) - portamento=False,portaRate, (* portamento *) - tremolo1=0,tremolo2=0, (* tremolo *) - appoggiatura={}, (* appoggiatura *) - staccato,fermata, (* duration related *) - beam=False,extend, (* extend a note *) - - note,pitch,tonality, (* pitch *) - beatCount,timeDot, (* number of beats *) - duration,trackDuration=0, (* duration *) - barCount,barBeat, (* trans-note *) - lastPitch,lastBeat - }, - j=1; - barBeat=0; - barCount=0; - beam=False; - staccato=False; - lastPitch=Null; - (* local variables *) - While[j<=StringLength[score], - char=StringPart[score,j]; - Switch[char, - "|", - If[barBeat!=0, - barCount++; - If[barBeat!=parameter[["Bar"]] && barBeat*parameter[["Bar"]]!=16, - AppendTo[messages,generateMessage["BarLengthError",Join[location,{barCount,parameter[["Bar"]],barBeat}]]]; - ]; - barBeat=0; - ]; - j++; - Continue[], - "<", - match=Select[Transpose[StringPosition[score,">"]][[1]],#>j&][[1]]; - content=StringTake[score,{j+1,match-1}]; - Which[ - StringContainsQ[content,":"], (* function *) - position=StringPosition[content,":"][[1,1]]; - function=StringTake[content,position-1]; - argument=toArgument@StringDrop[content,position]; - If[MemberQ[funcList,function], - parameter[[function]]=argument, - AppendTo[messages,generateMessage["InvalidFunction",Join[location,{barCount+1,function}]]] - ], - StringContainsQ[content,"="], (* key *) - parameter[["Oct"]]=StringCount[content,"'"]-StringCount[content,","]; - tonality=StringDelete[StringTake[content,{3,StringLength@content}],","|"'"]; - If[KeyExistsQ[tonalityDict,tonality], - parameter[["Key"]]=tonalityDict[[tonality]], - AppendTo[messages,generateMessage["InvalidTonality",Join[location,{barCount+1,content}]]]; - ], - StringContainsQ[content,"/"], (* beat *) - position=StringPosition[content,"/"][[1,1]]; - parameter[["Beat"]]=ToExpression[StringDrop[content,position]]; - parameter[["Bar"]]=ToExpression[StringTake[content,position-1]], - StringContainsQ[content,"."], (* volume *) - parameter[["Volume"]]=ToExpression[content], - StringMatchQ[content,NumberString], (* speed *) - parameter[["Speed"]]=ToExpression[content], - True, (* instrument *) - Which[ - MemberQ[instrData[["Style"]],content], - parameter[["Instr"]]=content; - instrList=Union[instrList,{parameter[["Instr"]]}]; - percussion=False, - MemberQ[instrData[["Percussion"]],content], - parameter[["Instr"]]=content; - instrList=Union[instrList,{parameter[["Instr"]]}]; - percussion=True, - _, - AppendTo[messages,generateMessage["InvalidInstrument",Join[location,{barCount+1,content}]]]; - ]; - ]; - j=match+1; - Continue[], - "(", - match=Select[Transpose[StringPosition[score,")"]][[1]],#>j&][[1]]; - content=StringTake[score,{j+1,match-2}]; - Switch[StringTake[score,{match-1}], - "~", (* tercet *) - tercet=ToExpression[content]; - tercetTime=(2^Floor[Log2[tercet]])/tercet, - "-", (* single tremolo *) - tremolo1=ToExpression[content], - "=", (* double tremolo *) - tremolo2=ToExpression[content]; - trackDuration-=duration, - "^", (* appoggiatura *) - k=1; - While[k<=StringLength@content, - pitchData=getPitch2[content,k,parameter]; - AppendTo[appoggiatura,pitchData[[1]]]; - k=pitchData[[2]]; - ]; - ]; - j=match+1; - Continue[], - "~", (* portamento *) - portamento=True; - j++; - Continue[]; - ]; - (* find out the pitch *) - j++; - extend=False; - Which[ - char=="x"||char=="X", - pitch=0, - char=="%", (* the same as the last pitch *) - pitch=lastPitch; - If[lastPitch===Null, - AppendTo[messages,generateMessage["NoFormerPitch",Join[location,{barCount+1}]]] - ], - DigitQ[char], - note=ToExpression@char; - pitch=If[note==0,None,pitchDict[[note]]+12*parameter[["Oct"]]+parameter[["Key"]]], - char=="[", - match=findMatch[score,j-1]; - content=StringTake[score,{j-1,match}]; - pitch=getPitch2[content,1,parameter][[1]]; - j=match+1; - If[StringContainsQ[content,"^"],appoggiatura=Flatten/@Array[Take[pitch,#]&,Length@pitch-1]]; - pitch=Flatten@pitch, - True, - AppendTo[messages,generateMessage["InvalidCharacter",Join[location,{barCount+1,char}]]]; - pitch=None; - ]; - While[j<=StringLength@score && MemberQ[pitchOpList,StringPart[score,j]], - If[StringPart[score,j]=="$", - pitch+=parameter[["Chord"]], - pitch+=pitchOpDict[[StringPart[score,j]]] - ]; - j++; - ]; - If[lastPitch==pitch && beam==True,extend=True]; - (* find out the duration *) - beatCount=1; - beam=False; - While[j<=StringLength[score] && MemberQ[{"-","_",".","^","`"},StringPart[score,j]], - char=StringPart[score,j]; - Switch[char, - "-",beatCount+=1, - "_",beatCount/=2, - ".", - timeDot=1/2; - While[j<=StringLength[score] && StringPart[score,j+1]==".", - timeDot/=2; - j++; - ]; - beatCount*=(2-timeDot), - "^",beam=True, - "`",staccato=True - ]; - j++; - ]; - If[tercet>0,beatCount*=tercetTime;tercet--]; - beatCount*=2^(-parameter[["Dur"]]); - barBeat+=beatCount; - duration=240/parameter[["Speed"]]*beatCount/parameter[["Beat"]]; - trackDuration+=duration; - Which[ - percussion, - If[pitch===None, - AppendTo[soundData,{None,duration}], - AppendTo[soundData,{parameter[["Instr"]],duration}] - ], - extend, - soundData[[-1,2]]+=duration; - lastBeat+=beatCount, - tremolo1!=0, - duration/=(beatCount*2^tremolo1); - Do[ - AppendTo[soundData,{pitch,duration,parameter[["Instr"]]}], - {k,beatCount*2^tremolo1}]; - tremolo1=0, - tremolo2!=0, - duration/=(beatCount*2^tremolo2); - barBeat=barBeat-lastBeat; - soundData=Drop[soundData,-1]; - Do[ - AppendTo[soundData,{lastPitch,duration,parameter[["Instr"]]}]; - AppendTo[soundData,{pitch,duration,parameter[["Instr"]]}], - {k,beatCount*2^(tremolo2-1)}]; - tremolo2=0, - portamento, - portaRate=(pitch-lastPitch+1)/beatCount/parameter[["Port"]]; - duration/=(beatCount*parameter[["Port"]]); - barBeat=barBeat-lastBeat; - soundData=Drop[soundData,-1]; - Do[ - AppendTo[soundData,{Floor[k],duration,parameter[["Instr"]]}], - {k,lastPitch,pitch,portaRate}]; - portamento=False, - True, - If[appoggiatura!={}, - If[Length@appoggiatura<4, - beatCount-=Length@appoggiatura*parameter[["Appo"]]/4; - duration=240/parameter[["Speed"]]*parameter[["Appo"]]/4/parameter[["Beat"]]; - Do[ - AppendTo[soundData,{appoggiatura[[k]],duration,parameter[["Instr"]]}], - {k,Length@appoggiatura}], - beatCount-=parameter[["Appo"]]; - duration=240/parameter[["Speed"]]*parameter[["Appo"]]/Length@appoggiatura/parameter[["Beat"]]; - Do[ - AppendTo[soundData,{appoggiatura[[k]],duration,parameter[["Instr"]]}], - {k,Length@appoggiatura}]; - ]; - appoggiatura={}; - duration=240/parameter[["Speed"]]*beatCount/parameter[["Beat"]]; - ]; - lastBeat=beatCount; - If[!pitch===None,lastPitch=pitch]; - If[staccato, - AppendTo[soundData,{pitch,duration*(1-parameter[["Stac"]]),parameter[["Instr"]]}]; - AppendTo[soundData,{None,duration*parameter[["Stac"]]}]; - staccato=False, - AppendTo[soundData,{pitch,duration,parameter[["Instr"]]}]; - ]; - ]; - ]; - (*Print[soundData];*) - Return[<| - "Audio"->If[soundData=={},0, (* empty track *) - If[StringPart[score,j-1]!="|", - AppendTo[messages,generateMessage["TerminatorAbsent",location]] - ]; - parameter[["Volume"]]*AudioFade[Sound[ - SoundNote@@#&/@soundData - ],{parameter[["FadeIn"]],parameter[["FadeOut"]]}] - ], - "Local"->parameter, - "Messages"->messages, - "Duration"->trackDuration, - "Instruments"->instrList - |>]; -]; - - -QYSParse[filename_]:=Module[ - { - i,j, - data1,data2,score,join,repeatL,repeatR, - parameter=defaultParameter, - messages={},instrList={}, - trackCount=0,trackData, - sectionCount=0,sections={}, - audio=0,duration=0, - sectionDuration={} - }, - If[!FileExistsQ[filename], - AppendTo[messages,generateMessage["FileNotFound",{filename}]]; - ]; - data1=StringJoin/@Import[filename,"Table"]; (* delete the spacings *) - data1=Select[data1,!StringContainsQ[#,"//"]&]; (* delete the comments *) - data1=Cases[data1,Except[""]]; (* delete the blank lines *) - data2={};j=0;join=False; (* join multiple lines of music scores together *) - Do[ - If[join, - join=False;data2[[j]]=data2[[j]]<>"|"<>data1[[i]], - j++;AppendTo[data2,data1[[i]]] - ]; - If[StringPart[data1[[i]],-1]=="\\",join=True], - {i,Length@data1}]; - data2=StringDelete[#,"\\"]&/@data2; (* delete the joint marks *) - score=Array[""&,Length@data2]; - Do[ - If[StringPosition[data2[[i]],"|:"]=={},score[[i]]=data2[[i]], - repeatL=Transpose[StringPosition[data2[[i]],"|:"]][[1]]; (* repeat *) - repeatR=Transpose[StringPosition[data2[[i]],":|"]][[1]]; - If[Length@repeatL!=Length@repeatR, - AppendTo[messages,generateMessage["RepeatError",{score}]]; - Continue[]; - ]; - score[[i]]=StringTake[data2[[i]],repeatL[[1]]-1]<>"|"; - Do[ - score[[i]]=score[[i]]<>StringTake[data2[[i]],{repeatL[[j]]+2,repeatR[[j]]-1}]<>"|"; - score[[i]]=score[[i]]<>StringTake[data2[[i]],{repeatL[[j]]+2,repeatR[[j]]-1}]<>"|"; - If[repeatR[[j]]+2StringTake[data2[[i]],{repeatR[[j]]+2,repeatL[[j+1]]-1}]<>"|" - ], - {j,Length@repeatL-1}]; - score[[i]]=score[[i]]<>StringTake[data2[[i]],{repeatL[[-1]]+2,repeatR[[-1]]-1}]<>"|"; - score[[i]]=score[[i]]<>StringTake[data2[[i]],{repeatL[[-1]]+2,repeatR[[-1]]-1}]<>"|"; - If[repeatR[[-1]]+1StringTake[data2[[i]],{repeatR[[-1]]+2,StringLength@data2[[i]]}] - ]; - ], - {i,Length@data2}]; - Do[ - trackCount++; - trackData=track[score[[i]],parameter,{sectionCount,trackCount}]; - instrList=Union[instrList,trackData[["Instruments"]]]; - messages=Join[messages,trackData[["Messages"]]]; - If[trackData[["Duration"]]==0, - (* empty soundtrack *) - parameter=trackData[["Local"]]; - If[sectionDuration!={},duration+=Max@sectionDuration]; - sectionCount++; - If[!SameQ@@sectionDuration, - AppendTo[messages,generateMessage["DiffDuration",{sectionCount,sectionDuration}]]; - ]; - sectionDuration={}; - trackCount=0; - AppendTo[sections,0], - (* real soundtrack *) - trackCount++; - If[sectionCount==0,sectionCount++;AppendTo[sections,0]]; - AppendTo[sectionDuration,trackData[["Duration"]]]; - sections[[sectionCount]]+=trackData[["Audio"]]; - ], - {i,Length[score]}]; - If[sectionDuration!={},duration+=Max@sectionDuration]; - If[!SameQ@@sectionDuration, - AppendTo[messages,generateMessage["DiffDuration",{sectionCount,sectionDuration}]]; - ]; - audio=AudioJoin@Cases[sections,Except[0]]; - If[parameter[["FadeIn"]]+parameter[["FadeOut"]]>0, - audio=AudioFade[audio,{parameter[["FadeIn"]],parameter[["FadeOut"]]}] - ]; - If[messages!={},Print[Column@messages]]; - Return[Audio[audio,MetaInformation-><| - "Format"->"qys", - "TrackCount"->trackCount, - "Duration"->duration, - "Instruments"->instrList, - "Messages"->messages - |>]]; -]; - - -(* ::Input:: *) -(*AudioStop[];AudioPlay@QYSParse[path<>"Songs\\TouHou\\TH11-Chireiden\\Nuclear_Fusion.qys"];*) - - -(* ::Input:: *) -(*AudioStop[];*) - - -(* ::Input:: *) -(*EmitSound@Sound@SoundNote[12,1,"SopranoSax"]*) - - -(* ::Input:: *) -(*EmitSound@Sound@SoundNote["HighTom",1]*) - - -(* ::Input:: *) -(*Export["E:\\1.mp3",QYSParse[path<>"Songs\\temp.qys"]];*) - - -(* ::Input:: *) -(*AudioStop[];AudioPlay@QYSParse[path<>"Songs\\Gate_of_Steiner.qys"];*) - - -(* ::Text:: *) -(*ElectricSnare, BassDrum, Shaker, RideCymbal, Snare, CrashCymbal, HiHatPedal, HiHatClosed*) -(*Ocarina, Oboe, Clarinet, Recorder, BrassSection, Harpsichord, BrightPiano, Organ, DrawbarOrgan, FretlessBass*) - - -(* ::Input:: *) -(*pitchDict[["2"]]+tonalityDict[["bE"]]+36*) diff --git a/qysToken.wl b/qysToken.wl index 9c99ba7..8ded1a0 100644 --- a/qysToken.wl +++ b/qysToken.wl @@ -11,9 +11,9 @@ subtrack=Nest[(("{"~~#~~"}")|Except["}"])...&,Except["}"]...,8]; pitOp=Alternatives[Characters@"abdMmop#$,'"]...; durOp=Alternatives[Characters@"-_.`"]...; pitch="%"|"x"|DigitCharacter~~pitOp; -index=rep[int~~""|(".."~~int)]; +order=""|rep[int~~""|(".."~~int)]; -getIndex[index_]:=Union@@StringCases[index,{ +getOrder[ord_]:=Union@@StringCases[ord,{ n:int~~".."~~m:int:>Range[ToExpression@n,ToExpression@m], n:int:>{ToExpression@n} }]; @@ -30,21 +30,21 @@ getPitch[pitches_]:=StringCases[pitches, (* track tokenizer *) getTrack[score_]:=StringCases[score,{ "{"~~n:int~~"*"~~sub:subtrack~~"}":> - {"Type"->"subtrack","Contents"->getTrack[sub],"Repeat"->-n}, + {"Type"->"Track","Contents"->getTrack[sub],"Repeat"->-ToExpression@n}, "{"~~sub:subtrack~~"}":> - {"Type"->"subtrack","Contents"->getTrack[sub],"Repeat"->Max[0, - StringCases[sub,"\\"|"/"~~i:index~~":":>getIndex[i]] + {"Type"->"Track","Contents"->getTrack[sub],"Repeat"->Max[0, + StringCases[sub,"\\"|"/"~~i:order~~":":>getOrder[i]] ]}, - bl:"\\"|"/"~~i:index~~":":> - {"Type"->"Volta","Newline"->(bl=="\\"),"Index"->getIndex[i]}, + bl:"\\"|"/"~~i:order~~":":> + {"Type"->"Volta","Newline"->(bl=="\\"),"Order"->getOrder[i]}, bl:"\\"|"|"|"/":> - {"Type"->"BarLine","Newline"->(bl=="\\"),"Coda"->(bl=="/")}, + {"Type"->"BarLine","Newline"->(bl=="\\"),"Skip"->(bl=="/")}, (* functions *) "<"~~func:name~~":"~~arg:Except[">"]..~~">":> {"Type"->"FunctionToken","Simplified"->False,"Argument"->{func->getArgument[arg,func]}}, - "<"~~vol:real~~">":> - {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Volume"->{ToExpression@vol}}}, + "<"~~vol:rep[real]~~">":> + {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Volume"->ToExpression/@StringSplit[vol,","]}}, "<"~~speed:int~~">":> {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Speed"->ToExpression@speed}}, "<"~~bar:int~~"/"~~beat:int~~">":> @@ -59,7 +59,7 @@ getTrack[score_]:=StringCases[score,{ "Instr"->StringDelete["("~~__~~")"]/@ivList, If[Or@@StringContainsQ["("]/@ivList, "Volume"->(If[StringContainsQ[#,"("], - StringCases[#,"("~~vol__~~")":>ToExpression@vol][[1]], + StringCases[#,"("~~volume__~~")":>ToExpression@volume][[1]], 1.0]&)/@ivList, Nothing] }]}, @@ -67,9 +67,9 @@ getTrack[score_]:=StringCases[score,{ (* temporary operators *) "("~~n:int~~"~)":> {"Type"->"Tuplet","NotesCount"->ToExpression[n]}, - "("~~n:int~~"-)":> + "("~~n:expr~~"-)":> {"Type"->"Tremolo1","StrokesCount"->ToExpression[n]}, - "("~~n:int~~"=)":> + "("~~n:expr~~"=)":> {"Type"->"Tremolo2","StrokesCount"->ToExpression[n]}, "("~~pitches:pitch..~~"^)":> {"Type"->"Appoggiatura","Pitches"->getPitch[pitches]}, @@ -85,7 +85,8 @@ getTrack[score_]:=StringCases[score,{ "Staccato"->StringContainsQ[durOp,"`"], "Arpeggio"->StringContainsQ[pitches,"^"], "DurationOperators"->StringDelete[durOp,"`"] - } + }, + undef__:>{"Type"->"Undefined","Content"->undef} }]; (* tokenizer *) @@ -110,14 +111,18 @@ Tokenize[filename_]:=Module[ score=score<>line; If[StringPart[line,-1]=="\\",Continue[]]; trackToken=getTrack[StringDelete[score,Whitespace]]; - If[MemberQ[Association[#][["Type"]]&/@trackToken,"Note"], (* empty track *) - AppendTo[tracks,trackToken], - If[sectionMeta!={}, + If[ContainsOnly[Association[#][["Type"]]&/@trackToken,{"FunctionToken"}], + If[sectionMeta!={}, (* empty track *) AppendTo[sections,Append[sectionMeta,"Tracks"->tracks]]; tracks={}; ]; sectionMeta={"Comments"->comments,"GlobalSettings"->trackToken}; - comments={}; + comments={}, + AppendTo[tracks,<| (* real track *) + "Type"->"Track", + "Contents"->trackToken, + "Repeat"->0 + |>] ]; score="" ], @@ -133,7 +138,7 @@ End[]; (* ::Input:: *) -(*QYS`getTrack["{2*1{/2..5,8:}}"]*) +(*QYS`getTrack["<1=bE'>3(Log[2,12]=)3'---|"]*) (* ::Input:: *) @@ -141,4 +146,8 @@ End[]; (* ::Input:: *) -(*ExportString[QYS`Tokenize[NotebookDirectory[]<>"Songs\\test.qys"],"JSON"]*) +(*ExportString[QYS`Tokenize[path<>"Songs\\test.qys"],"JSON"]*) + + +(* ::Input:: *) +(*QYS`Tokenize[path<>"Songs\\test.qys"]*) From 65d2635a3ba4615d647505ab9b876b41b07bce8b Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Thu, 18 Jan 2018 22:24:46 +0800 Subject: [PATCH 28/54] Some final adjustments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复了反复跳跃的一个bug 2. 将反复跳跃记号合并入BarLine 3. 加入了对整个歌曲的FadeOut的支持 --- QYMP.wl | 3 +-- parser.wl | 36 ++++++++++++++++++++++++------------ qysToken.wl | 4 ++-- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/QYMP.wl b/QYMP.wl index fa05746..dee6e00 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -10,13 +10,12 @@ path=NotebookDirectory[]; <<(path<>"interface.wl") <<(path<>"qymParse.wl") <<(path<>"qysToken.wl") -<<(path<>"qymToken.wl") <<(path<>"parser.wl") (* temporary function *) QYMParse[filename_]:=QYMparse`QYMParse[filename]; -QYSParse[filename_]:=integrate[parse[QYS`Tokenize[filename]]]; +QYSParse[filename_]:=integrate[#MusicClips,#Effects]&@parse[QYS`Tokenize[filename]]; refresh:=Module[ diff --git a/parser.wl b/parser.wl index f925e85..33e1194 100644 --- a/parser.wl +++ b/parser.wl @@ -169,6 +169,16 @@ trackParse[tokenizer_,global_]:=Module[ ], "BarLine", If[token[["Skip"]],lastRepeat=<|"SoundData"->soundData,"Duration"->durCount|>]; + If[token[["Order"]]!={0}, + If[volta=={}, + voltaSettings=settings; + master=<|"SoundData"->soundData,"Duration"->durCount|>, + voltaData[[volta]]=<|"SoundData"->soundData,"Duration"->durCount|>; + ]; + volta=If[#Order=={},voltaDefault,#Order]&[token]; + settings=voltaSettings; + soundData={};durCount=0 + ]; If[barBeat!=0, barCount++; If[barBeat!=settings[["Bar"]],AppendTo[messages,<| @@ -177,15 +187,6 @@ trackParse[tokenizer_,global_]:=Module[ |>]]; barBeat=0; ], - "Volta", - If[volta=={}, - voltaSettings=settings; - master=<|"SoundData"->soundData,"Duration"->durCount|>, - voltaData[[volta]]=<|"SoundData"->soundData,"Duration"->durCount|>; - ]; - volta=If[#Index=={},voltaDefault,#Index]&[token]; - settings=voltaSettings; - soundData={};durCount=0, "Track", trackData=trackParse[token,settings]; Do[ @@ -242,6 +243,7 @@ parse[tokenizer_]:=Module[ messages={},effects }, settings=defaultSettings; + effects=settings[[effectSettingTag]]; Do[ sectionDuration=0; Do[ @@ -250,6 +252,7 @@ parse[tokenizer_]:=Module[ settings[[function]]=functionData[[function]], {function,Keys@functionData}], {token,Association/@sectionToken[["GlobalSettings"]]}]; + If[Length@sectionToken[["Tracks"]]==0,effects=settings[[effectSettingTag]]]; Do[ trackData=trackParse[trackToken,settings]; MusicClips=Join[MusicClips,<| @@ -260,7 +263,12 @@ parse[tokenizer_]:=Module[ {trackToken,sectionToken[["Tracks"]]}]; duration+=sectionDuration, {sectionToken,Association/@Association[tokenizer][["Sections"]]}]; - Return[MusicClips]; + Return[<| + "Infomation"-><|"Duration"->duration|>, + "MusicClips"->MusicClips, + "Messages"->messages, + "Effects"->effects + |>]; ]; @@ -277,10 +285,11 @@ parse[tokenizer_]:=Module[ (* ::Input:: *) (*AudioStop[];AudioPlay[#[[2]]]&@*) (*EchoFunction["time: ",#[[1]]&]@*) -(*Timing[QYSParse[path<>"Songs\\Touhou\\TH11-Chireiden\\Hartmann_No_Youkai_Otome.qys"]];*) +(*Timing[QYSParse[path<>"Songs\\Touhou\\Dark_Side_of_Fate.qys"]];*) -integrate[tracks_]:=Module[ +integrate[tracks_]:=integrate[tracks,defaultSettings[[effectSettingTag]]]; +integrate[tracks_,effects_]:=Module[ {audio=0,settings,instrCount,instrument,soundData,generate}, Do[ settings=trackData[["MetaSettings"]]; @@ -300,6 +309,9 @@ integrate[tracks_]:=Module[ {settings[["FadeIn"]],settings[["FadeOut"]]}], {i,instrCount}], {trackData,tracks}]; + If[effects[["FadeIn"]]+effects[["FadeOut"]]>0, + audio=AudioFade[audio,{effects[["FadeIn"]],effects[["FadeOut"]]}] + ]; Return[audio]; ]; diff --git a/qysToken.wl b/qysToken.wl index 8ded1a0..190bf2c 100644 --- a/qysToken.wl +++ b/qysToken.wl @@ -36,9 +36,9 @@ getTrack[score_]:=StringCases[score,{ StringCases[sub,"\\"|"/"~~i:order~~":":>getOrder[i]] ]}, bl:"\\"|"/"~~i:order~~":":> - {"Type"->"Volta","Newline"->(bl=="\\"),"Order"->getOrder[i]}, + {"Type"->"BarLine","Newline"->(bl=="\\"),"Skip"->False,"Order"->getOrder[i]}, bl:"\\"|"|"|"/":> - {"Type"->"BarLine","Newline"->(bl=="\\"),"Skip"->(bl=="/")}, + {"Type"->"BarLine","Newline"->(bl=="\\"),"Skip"->(bl=="/"),"Order"->{0}}, (* functions *) "<"~~func:name~~":"~~arg:Except[">"]..~~">":> From b1247126f422acb33c503e43db258096a80273e3 Mon Sep 17 00:00:00 2001 From: NN708 Date: Fri, 19 Jan 2018 16:20:42 +0800 Subject: [PATCH 29/54] qymToken Almost done MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 除了反复都做好了 --- qymToken.wl | 143 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 101 insertions(+), 42 deletions(-) diff --git a/qymToken.wl b/qymToken.wl index f13c803..f06486a 100644 --- a/qymToken.wl +++ b/qymToken.wl @@ -1,49 +1,108 @@ (* ::Package:: *) Begin["qym`"]; -trackTokenizer[track_]:=Block[ - { - match, - notations, - argument - }, - notations={}; - While[track!="", - Switch[track[[1]], - "<", - Which[ - (match=StringCases[track[[1]],RegularExpression["^<1=[#b]?[A-G]>"],1])!={}, - argument=keyAndOctTokenizer[match[[1]]], - (match=StringCases[track[[1]],RegularExpression["^<\\d+/\\d+>"],1])!={}, - argument=barAndBeatTokenizer[match[[1]]], - (match=StringCases[track[[1]],RegularExpression["^<\\d+>"],1])!={}, - argument={"Speed"->ToExpression[StringTake[match[[1]],{2,StringLength[match[[1]]]-1}]]}, - True, - MessageDialog[TextCell["Undefined token found at "<>track],WindowTitle->"Error"]; - Return[False]; - ]; - AppendTo[notations,{ - "Type"->"FunctionToken", - "Simplified"->True, - "Argument"->argument - }]; - , - "{", - , - "(", - , - "[", - , - _, - - ]; - track=StringDrop[track,StringLength[match[[1]]]]; - ]; - - Return[{}]; +simitoneOp=Alternatives[Characters["b#"]]...; +pitOp=Alternatives[Characters["adMmop$,'"]]...; +durOp=Alternatives[Characters["-_."]]...; +pitch=simitoneOp~~"x"|DigitCharacter~~pitOp; + +getPitch[pitches_]:=StringCases[pitches, + simitoneOps:simitoneOp~~pitSd:("x"|DigitCharacter)~~pitOps:pitOp:>{ + "ScaleDegree"->Switch[pitSd, + "x", + 10, + _, + ToExpression[pitSd] + ], + "SemitonesCount"->StringCount[simitoneOps,"#"]-StringCount[simitoneOps,"b"], + "OctavesCount"->StringCount[pitOps,"'"]-StringCount[pitOps,","], + "ChordSymbol"->StringDelete[pitOps,"'"|","] + } ]; -tokenizer[filename_]:=Block[ +trackTokenizer[track_]:=StringCases[track,{ + (* Function Token *) + "<1="~~tonality:(LetterCharacter|","|"'"|"#")..~~">":>{ + "Type"->"FunctionToken", + "Simplified"->True, + "Argument"->{ + "Key"->tonalityDict[[StringDelete[tonality,","|"'"]]], + "Oct"->StringCount[tonality,"'"]-StringCount[tonality,","] + } + }, + "<"~~bar:int~~"/"~~beat:int~~">":>{ + "Type"->"FunctionToken", + "Simplified"->True, + "Argument"->{ + "Bar"->ToExpression[bar], + "Beat"->ToExpression[beat] + } + }, + "<"~~speed:int~~">":>{ + "Type"->"FunctionToken", + "Simplified"->True, + "Argument"->{ + "Speed"->ToExpression[speed] + } + }, + "<"~~volume:int~~"%>":>{ + "Type"->"FunctionToken", + "Simplified"->True, + "Argument"->{ + "Volume"->ToExpression[volume] + } + }, + (* Instrument *) + "{"~~instr:WordCharacter..~~"}":>{ + "Type"->"FunctionToken", + "Simplified"->True, + "Argument"->{ + "Instr"->instr + } + }, + (* Tuplet *) + "("~~n:int~~"~)":>{ + "Type"->"Tuplet", + "NotesCount"->ToExpression[n] + }, + (* Appoggiatura *) + "("~~pitches:pitch..~~"^)":>{ + "Type"->"Appoggiatura", + "Pitches"->getPitch[pitches] + }, + (* Portamento *) + "~":>{ + "Type"->"Portamento" + }, + (* Tie *) + "^":>{ + "Type"->"Tie" + }, + (* Note *) + pitches:(pitch~~"&")...~~pitch~~durOp:durOp:>{ + "Type"->"Note", + "Pitches"->getPitch[StringDelete[pitches,"&"]], + "SemitonesCount"->0, + "OctavesCount"->0, + "Staccato"->False, + "Arpeggio"->False, + "DurationOperators"->durOp + }, + (* Barline *) + "|":>{ + "Type"->"BarLine", + "Newline"->False + }, + (* Space *) + " "..:>Nothing, + (* Undefined *) + undef__:>{ + "Type"->"Undefined", + "Content"->undef + } +}]; + +tokenizer[filename_]:=Module[ { (* Define variables *) i, @@ -108,4 +167,4 @@ End[]; (* ::Input:: *) -(*ExportString[qym`tokenizer[NotebookDirectory[]<>"Songs\\Frozen\\Let_It_Go.qym"],"JSON"]*) +(*ExportString[tokenizer[NotebookDirectory[]<>"Songs\\Frozen\\Let_It_Go.qym"],"JSON"]*) From 522d3681da340d3e081f83c332adc5786a922138 Mon Sep 17 00:00:00 2001 From: NN708 Date: Fri, 19 Jan 2018 18:14:18 +0800 Subject: [PATCH 30/54] Complete qymToken MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 也修了不少 bug(估计还有不少) --- QYMP.wl | 4 +- qymParse.wl | 251 ---------------------------------------------------- qymToken.wl | 55 ++++++++++-- 3 files changed, 49 insertions(+), 261 deletions(-) delete mode 100644 qymParse.wl diff --git a/QYMP.wl b/QYMP.wl index dee6e00..8876bed 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -8,13 +8,13 @@ path=NotebookDirectory[]; <<(path<>"library.wl") <<(path<>"assets.wl") <<(path<>"interface.wl") -<<(path<>"qymParse.wl") +<<(path<>"qymToken.wl") <<(path<>"qysToken.wl") <<(path<>"parser.wl") (* temporary function *) -QYMParse[filename_]:=QYMparse`QYMParse[filename]; +QYMParse[filename_]:=integrate[#MusicClips,#Effects]&@parse[qym`tokenizer[filename]]; QYSParse[filename_]:=integrate[#MusicClips,#Effects]&@parse[QYS`Tokenize[filename]]; diff --git a/qymParse.wl b/qymParse.wl deleted file mode 100644 index 614ca17..0000000 --- a/qymParse.wl +++ /dev/null @@ -1,251 +0,0 @@ -(* ::Package:: *) - -Begin["QYMparse`"]; -pitchDict=<|"1"->0,"2"->2,"3"->4,"4"->5,"5"->7,"6"->9,"7"->11|>;(* this part will be deleted before ver 1.6 release *) -getPitch1[dataString_,position_,tonality_]:=Module[ - { - note,pitch,i - }, - note=ToExpression@StringTake[dataString,{position}]; - pitch=If[note==0,None,pitchDict[[note]]+tonality]; - i=position-1; - While[i>=1, - Switch[StringTake[dataString,{i}], - "#", - pitch++, - "b", - pitch--, - _, - Break[] - ]; - i--; - ]; - i=position+1; - While[i<=StringLength[dataString], - Switch[StringTake[dataString,{i}], - "'", - pitch+=12, - ",", - pitch-=12, - _, - Break[] - ]; - i++; - ]; - Return[{pitch,i}]; -]; -QYMParse[filename_]:=Module[ - { - i,j,k, - filedata,midchar, - music,musicrepeat,musicclip,voicepart, - track,sections, - instrument="Piano",instrumentList={}, - tonality=0,beat=1,speed=88,volume=1, - pitch,time,space,tercet=0,tercetTime, - repeatTime,chord=False,lastPitch,lastSpace, - comment,match,timeDot,duration,frequency, - getPitchResult,appoggiatura={},delay=False - }, - If[!FileExistsQ[filename], - MessageDialog[TextCell["File not found!"],WindowTitle->"Error"]; - Return[]; - ]; - filedata=StringJoin/@Map[ToString,Import[filename,"Table"],{2}]; - Do[ - match=StringPosition[filedata[[i]],"//",1]; - If[match!={}, - If[match[[1,1]]==1, - filedata[[i]]="", - filedata[[i]]=StringTake[filedata[[i]],match[[1,1]]-1]; - ]; - ]; - ,{i,Length[filedata]}]; - While[Length[filedata]>0 && filedata[[1]]=="", - filedata=Delete[filedata,1]; - ]; - - If[Length[filedata]>0 && StringTake[filedata[[1]],-1]==">", - midchar=filedata[[1]]; - filedata=Delete[filedata,1]; - Do[ - If[filedata[[i]]!="", - filedata[[i]]=StringJoin[midchar,filedata[[i]]]; - ] - ,{i,Length[filedata]}]; - ]; - sections={}; - track={}; - Do[ - If[StringLength[filedata[[i]]]==0, - If[track!={},AppendTo[sections,AudioOverlay@track]]; - track={}, - j=1; - voicepart={}; - musicrepeat={}; - musicclip={}; - While[j<=StringLength[filedata[[i]]], - midchar=StringTake[filedata[[i]],{j}]; - If[MemberQ[{"0","1","2","3","4","5","6","7"},midchar], - getPitchResult=getPitch1[filedata[[i]],j,tonality]; - If[chord, - AppendTo[pitch,getPitchResult[[1]]]; - chord=False, - pitch=getPitchResult[[1]]; - lastSpace=space; - space=True; - ]; - j=getPitchResult[[2]]; - time=1; - midchar=StringTake[filedata[[i]],{j}]; - While[j<=StringLength[filedata[[i]]] && MemberQ[{"-","_",".","^","&"},midchar], - Switch[midchar, - "-", - time+=1, - "_", - time/=2, - ".", - timeDot=1/2; - While[j<=StringLength[filedata[[i]]] && StringTake[filedata[[i]],{j+1}]==".", - timeDot/=2; - j++; - ]; - time*=(2-timeDot), - "^", - space=False, - "&", - chord=True; - If[!ListQ[pitch],pitch={pitch}] - ]; - j++; - midchar=StringTake[filedata[[i]],{j}]; - ]; - If[!chord, - If[tercet>0, - time*=tercetTime; - tercet--; - ]; - If[delay, - time*=2; - delay=False; - ]; - duration=60/speed*time*beat; - If[appoggiatura!={}, - If[Length@appoggiatura<4, - time-=Length@appoggiatura*1/12; - duration=60/speed*1/12*beat; - Do[ - AppendTo[musicclip,{appoggiatura[[k]],duration,instrument}], - {k,Length@appoggiatura}], - time-=1/3; - duration=60/speed/Length@appoggiatura/2*beat; - Do[ - AppendTo[musicclip,{appoggiatura[[k]],duration,instrument}], - {k,Length@appoggiatura}]; - ]; - appoggiatura={}; - duration=60/speed*time*beat; - ]; - If[lastPitch==pitch && !lastSpace, - If[space, - musicclip[[-1,2]]+=duration*7/8; - AppendTo[musicclip,{None,duration/8}], - musicclip[[-1,2]]+=duration; - ], - If[space, - AppendTo[musicclip,{pitch,duration*7/8,instrument}]; - AppendTo[musicclip,{None,duration/8}], - AppendTo[musicclip,{pitch,duration,instrument}]; - ]; - ]; - lastPitch=pitch; - ], - Switch[midchar, - "<", - match=Select[Transpose[StringPosition[filedata[[i]],">"]][[1]],#>j&][[1]]; - comment=StringTake[filedata[[i]],{j+1,match-1}]; - Switch[StringTake[comment,{2}], - "=", - tonality=(StringCount[comment,"'"]-StringCount[comment,","])*12; - tonality+=tonalityDict[StringDelete[StringTake[comment,{3,StringLength@comment}],","|"'"]], - "/", - beat=ToExpression[StringTake[comment,{3}]]/4, - _, - If[StringTake[comment,-1]=="%", - volume=ToExpression[StringTake[comment,StringLength[comment]-1]]/100, - speed=ToExpression[comment]; - ]; - ]; - j=match, - "(", - match=Select[Transpose[StringPosition[filedata[[i]],")"]][[1]],#>j&][[1]]; - Switch[StringTake[filedata[[i]],{match-1}], - "^", - k=1; - comment=StringTake[filedata[[i]],{j+1,match-2}]; - While[k<=StringLength@comment, - If[MemberQ[{"0","1","2","3","4","5","6","7"},StringTake[comment,{k}]], - getPitchResult=getPitch1[comment,k,tonality]; - AppendTo[appoggiatura,getPitchResult[[1]]]; - k=getPitchResult[[2]]-1; - ]; - k++; - ], - ".", - delay=True, - _, - comment=StringTake[filedata[[i]],{j+1,match-1}]; - tercet=ToExpression[comment]; - tercetTime=(2^Floor[Log2[tercet]])/tercet - ]; - j=match, - "{", - match=Select[Transpose[StringPosition[filedata[[i]],"}"]][[1]],#>j&][[1]]; - instrument=StringTake[filedata[[i]],{j+1,match-1}]; - instrumentList=Union[instrumentList,{instrument}]; - j=match, - ":", - If[StringTake[filedata[[i]],{j+1}]=="|", - If[musicrepeat=={}, - voicepart=Join[voicepart,musicclip]; - voicepart=Join[voicepart,musicclip]; - musicclip={}, - Do[ - voicepart=Join[voicepart,musicclip]; - voicepart=Join[voicepart,musicrepeat]; - ,{k,repeatTime}]; - repeatTime=0; - musicclip={} - ], - voicepart=Join[voicepart,musicclip]; - musicclip={}; - musicrepeat={} - ], - "[", - match=Select[Transpose[StringPosition[filedata[[i]],"]"]][[1]],#>j&][[1]]; - repeatTime=StringCount[StringTake[filedata[[i]],{j+1,match-1}],"."]; - If[StringTake[filedata[[i]],{j+1,j+2}]=="1.", - voicepart=Join[voicepart,musicclip]; - musicrepeat=musicclip; - musicclip={}; - ]; - j=match - ]; - j++; - ]; - ]; - voicepart=Join[voicepart,musicclip]; - If[voicepart!={},AppendTo[track,volume*Audio[Sound[SoundNote@@#&/@voicepart]]]] - ], - {i,Length[filedata]}]; - If[track!={},AppendTo[sections,AudioOverlay@track]]; - music=AudioJoin@sections; - Return[Audio[music,MetaInformation-><| - "Format"->"qym", - "TrackCount"->0, - "Messages"->{}, - "Duration"->QuantityMagnitude@UnitConvert[Duration@music,"Seconds"], - "Instruments"->instrumentList - |>]]; -] -End[]; diff --git a/qymToken.wl b/qymToken.wl index f06486a..0b1bf38 100644 --- a/qymToken.wl +++ b/qymToken.wl @@ -5,6 +5,18 @@ simitoneOp=Alternatives[Characters["b#"]]...; pitOp=Alternatives[Characters["adMmop$,'"]]...; durOp=Alternatives[Characters["-_."]]...; pitch=simitoneOp~~"x"|DigitCharacter~~pitOp; +repeatcount=0; + +getOrder[ord_]:=Block[ + { + order + }, + order=StringCases[ord,{ + n:int~~".":>ToExpression@n + }]; + repeatcount=Max[repeatcount,order]; + Return[order]; +]; getPitch[pitches_]:=StringCases[pitches, simitoneOps:simitoneOp~~pitSd:("x"|DigitCharacter)~~pitOps:pitOp:>{ @@ -21,6 +33,36 @@ getPitch[pitches_]:=StringCases[pitches, ]; trackTokenizer[track_]:=StringCases[track,{ + (* Repeat *) + (StartOfString|"||:")~~subtrack_/;(!StringContainsQ[subtrack,":||"])~~":||":>{ + "Type"->"Track", + "Contents"->trackTokenizer[subtrack], + "Repeat"->repeatcount + }, + StartOfString~~subtrack_/;(!StringContainsQ[subtrack,"*||"])~~"*||":>{ + "Type"->"Track", + "Contents"->trackTokenizer[subtrack], + "Repeat"->-2 + }, + "|["~~order:(int~~".")..~~"]":>{ + "Type"->"BarLine", + "Newline"->False, + "Skip"->False, + "Order"->getOrder[order] + }, + "|*":>{ + "Type"->"BarLine", + "Newline"->False, + "Skip"->True, + "Order"->{0} + }, + (* Barline *) + "|":>{ + "Type"->"BarLine", + "Newline"->False, + "Skip"->False, + "Order"->{0} + }, (* Function Token *) "<1="~~tonality:(LetterCharacter|","|"'"|"#")..~~">":>{ "Type"->"FunctionToken", @@ -79,7 +121,7 @@ trackTokenizer[track_]:=StringCases[track,{ "Type"->"Tie" }, (* Note *) - pitches:(pitch~~"&")...~~pitch~~durOp:durOp:>{ + pitches:((pitch~~"&")...~~pitch)~~durOp:durOp:>{ "Type"->"Note", "Pitches"->getPitch[StringDelete[pitches,"&"]], "SemitonesCount"->0, @@ -88,11 +130,6 @@ trackTokenizer[track_]:=StringCases[track,{ "Arpeggio"->False, "DurationOperators"->durOp }, - (* Barline *) - "|":>{ - "Type"->"BarLine", - "Newline"->False - }, (* Space *) " "..:>Nothing, (* Undefined *) @@ -102,7 +139,7 @@ trackTokenizer[track_]:=StringCases[track,{ } }]; -tokenizer[filename_]:=Module[ +tokenizer[filename_]:=Block[ { (* Define variables *) i, @@ -116,6 +153,8 @@ tokenizer[filename_]:=Module[ Return[False]; ]; content=Import[filename,"Lines"]; + (* Initialization *) + repeatcount=0; (* Global comments *) i=1; globalcomments={}; @@ -167,4 +206,4 @@ End[]; (* ::Input:: *) -(*ExportString[tokenizer[NotebookDirectory[]<>"Songs\\Frozen\\Let_It_Go.qym"],"JSON"]*) +(*ExportString[tokenizer[NotebookDirectory[]<>"Songs\\Bracing_the_Chill.qym"],"JSON"]*) From e36563e81910a8fa8bda8a6ff1500bfcfc3a8a01 Mon Sep 17 00:00:00 2001 From: NN708 Date: Fri, 19 Jan 2018 22:37:21 +0800 Subject: [PATCH 31/54] fix repeat --- qymToken.wl | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/qymToken.wl b/qymToken.wl index 0b1bf38..f61a280 100644 --- a/qymToken.wl +++ b/qymToken.wl @@ -34,12 +34,17 @@ getPitch[pitches_]:=StringCases[pitches, trackTokenizer[track_]:=StringCases[track,{ (* Repeat *) - (StartOfString|"||:")~~subtrack_/;(!StringContainsQ[subtrack,":||"])~~":||":>{ + (StartOfString|"|:")~~(subtrack__/;!StringContainsQ[subtrack,"|:"])~~lastvolta:(":||["~~(int~~".")..~~"]"):>{ "Type"->"Track", - "Contents"->trackTokenizer[subtrack], - "Repeat"->repeatcount + "Contents"->trackTokenizer[StringDelete[subtrack<>lastvolta,":|"]], + "Repeat"->If[repeatcount==0,2,repeatcount] + }, + (StartOfString|"|:")~~(subtrack__/;!StringContainsQ[subtrack,"|:"])~~":|":>{ + "Type"->"Track", + "Contents"->trackTokenizer[StringDelete[subtrack,":|"]], + "Repeat"->If[repeatcount==0,2,repeatcount] }, - StartOfString~~subtrack_/;(!StringContainsQ[subtrack,"*||"])~~"*||":>{ + StartOfString~~(subtrack__/;!StringContainsQ[subtrack,"*|"])~~"*|":>{ "Type"->"Track", "Contents"->trackTokenizer[subtrack], "Repeat"->-2 @@ -103,10 +108,24 @@ trackTokenizer[track_]:=StringCases[track,{ } }, (* Tuplet *) - "("~~n:int~~"~)":>{ + "("~~n:int~~")":>{ "Type"->"Tuplet", "NotesCount"->ToExpression[n] }, + (* Tremolo *) + "("~~n:expr~~"-)":>{ + "Type"->"Tremolo1", + "StrokesCount"->ToExpression[n] + }, + "("~~n:expr~~"=)":>{ + "Type"->"Tremolo2", + "StrokesCount"->ToExpression[n] + }, + (* Fermata *) + "(.)":>{ + "Type"->"Fermata", + "Ratio"->2 + }, (* Appoggiatura *) "("~~pitches:pitch..~~"^)":>{ "Type"->"Appoggiatura", @@ -206,4 +225,4 @@ End[]; (* ::Input:: *) -(*ExportString[tokenizer[NotebookDirectory[]<>"Songs\\Bracing_the_Chill.qym"],"JSON"]*) +(*ExportString[tokenizer[NotebookDirectory[]<>"Songs\\Sunny_Light.qym"],"JSON"]*) From bb2d3355d4f2bb5451801611f38b81015b78e939 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Fri, 19 Jan 2018 23:58:26 +0800 Subject: [PATCH 32/54] New Feature: Integration Simplifier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 加入了对音轨整合前的优化 --- Songs/Touhou/Hana_ni_Kaze.qys | 88 +++++++++++++++++++++++++++++++++++ parser.wl | 85 ++++++++++++++++++++++++--------- 2 files changed, 152 insertions(+), 21 deletions(-) create mode 100644 Songs/Touhou/Hana_ni_Kaze.qys diff --git a/Songs/Touhou/Hana_ni_Kaze.qys b/Songs/Touhou/Hana_ni_Kaze.qys new file mode 100644 index 0000000..8caf34a --- /dev/null +++ b/Songs/Touhou/Hana_ni_Kaze.qys @@ -0,0 +1,88 @@ +//月に叢雲華に風 +//原曲:ラストリモート + +//-------------------- Section A -------------------- +<2/4><80><1=bB> + +<1.0>0-56\ +7b-7b2'|(3~)1'7b6^%-|1'-(3~)1'2'3b'\ +(3~)2'1'7b^%6|7b.2'1'_7b_6_|4_1_4.56_|5---^|5---`| + +<0.2>0-\ +[57b]7b,3[57b]-%23b|[47b]144[46]146|[61']14#1[13b]'14#1|[7b2']255'-2'7b5\ +[57b]7b,3[7b2']7b,3b[57b]-|[46]14[46]--[61']-|3bM--555.4''_[51'']_7'_|4'6'| + +<0.1>0-\ +3bo-|4o-|4#o-|5o-|3bo-|4o-|5o-|0-| + +<0.3>0-\ +0-|0-|0-|0-|5$-|4M-|5$-^|%-`| + +<0.5>0-\ +0-|0-|0-|0-|0-|0-|0-|03b__4__5#_| + +<0.4>0-\ +0-|0-|0-|0-|[7b,2]-`|[6,1]-`|[5,3b]-^|%-`| + +<0.1>0-\ +0-|0-|0-|0-|0-|0-|0-|03b,| + +//-------------------- Section B -------------------- +<1=bG> + +<0.4>\ +1'o-^|%2'o|5o-^|%1'o[35]'7o[35]'\ +1'o351'-351'|351'3[57']7--|1'o357o-3[51'']1'|2'o75#3'o----| + +<0.2>\ +1.7,.1^|%_22_17,|1.7,.1^|%_2.[13]_2_[7,2]_1_\ +1.7,.1^|%_22_17,|1.7,.1^|%_2.17,| + +<0.6>\ +1o-^|%2o|5,o-^|%{1o[35]7,o[35]}\ +1o-^|%7,o|1o_.7,o_.6,__5#,__^|%-`| + +<0.7>\ +23_5.3_2_^|%-..5_^|%_4_3_2_(3~)7,15,^|%-2_3_5_3_\ +5.6.-^|%.1'7_6_5_|5--6_5#_^|%---`| + +<0.4>\ +6.6.6-666|6.6.6-666|6.6.6-666|6.6.61'373\ +4.4.4-444|4.4.4-444|5.5.5-555|5#.%.%-%%%| + +<0.1>\ +6.6.6-666|6.6.6-666|6.6.6-666|6.6.61'575\ +4.4.4-444|4.4.4-444|5.5.5-555|5#.%.%-%%%| + +//-------------------- Section C -------------------- +<1=bE> + +<1.0>\ +6,-3-|7,--6,_7,_|1.2.7,|1--3_5_\ +6.5.4|51'75|(2^)3---^|%---`\ +3-5-|2.-5#6_|7_5_3_1'_5_3_2'|1'71'6_7_\ +1'_7_6_5_6.1'_^|1'_7_6_5_6_7_3_5_|6---^|%---`| + +<0.4>\ +6---[63']1'--|[5#7]--3'[5#7]'---|[51']351'351'3'|[4#2']--3'[36]'---\ +[41']14[51']1'4'[46]'-|[25]--5[57]---|[67]36[37]-[31']3'-|[13]'3[72']3[61']3[57]3\ +3o3535o353|2o35#35#35#3|535351o3o5o|4#o34#[4#6]'-4#'[62']3\ +4141451o[35]'|5,o7,[25]7,[25]7,5,o[37],|2o3,6,2-3,6,2|1o3,6,[13]----| + +<0.2>\ +6-|5#-|5-|4#-|4-|5-|6-|6-\ +6'60%0%0%|5#'5#0%0%0%|5'50%0%0%|4#'4#0%0%0%\ +4'40%0%0%|5'50%0%0%|6'60%0%0%|060%0%0%| + +<0.3>\ +0-|0-|0-|0-|0-|0-|0-|3o-`\ +0-|0-|0-|0-|0-|0-|2o-|[13]'-`| + +<0.4>\ +0-|0-|0-|0-|0-|0-|0-|0-\ +6-`|5#-`|5-`|4#-`|4-`|5-`|[26]'-|1'o-`| + +<0.1>\ +0-|0-|0-|0-|0-|0-|0-|0-\ +060%0%0%|05#0%0%0%|050%0%0%|04#0%0%0%\ +040%0%0%|050%0%0%|060%0%0%|060%0%0%| diff --git a/parser.wl b/parser.wl index 33e1194..1e2caec 100644 --- a/parser.wl +++ b/parser.wl @@ -5,7 +5,7 @@ defaultSettings=<| "Dur"->0,"FadeIn"->0,"FadeOut"->0,"Stac"->1/2,"Appo"->1/4,"Oct"->0, "Port"->6,"Spac"->0,"Chord"->{0,12},"Trace"->1 |>; -funcList=Keys@defaultSettings; +functionList=Keys@defaultSettings; metaSettingTag={"Instr","Volume","FadeIn","FadeOut"}; effectSettingTag={"FadeIn","FadeOut"}; @@ -235,16 +235,28 @@ trackParse[tokenizer_,global_]:=Module[ ]; -parse[tokenizer_]:=Module[ +parse[tokenizer_]:=parse[tokenizer,All]; +parse[tokenizer_,sections_]:=Module[ { settings,functionData, + tokenData,sectionToken, trackData,MusicClips={}, sectionDuration,duration=0, - messages={},effects + messages={},effects, + sectionCount, + startSection,endSection }, settings=defaultSettings; effects=settings[[effectSettingTag]]; + tokenData=Association[tokenizer][["Sections"]]; + sectionCount=Length[tokenData]; + Switch[sections, + _?ListQ,{startSection,endSection}=sections, + _?NumberQ,{startSection,endSection}={sections,sections}, + _,{startSection,endSection}={1,sectionCount} + ]; Do[ + sectionToken=Association@tokenData[[i]]; sectionDuration=0; Do[ functionData=Association@token[["Argument"]]; @@ -253,16 +265,19 @@ parse[tokenizer_]:=Module[ {function,Keys@functionData}], {token,Association/@sectionToken[["GlobalSettings"]]}]; If[Length@sectionToken[["Tracks"]]==0,effects=settings[[effectSettingTag]]]; + If[iendSection,Continue[]]; Do[ trackData=trackParse[trackToken,settings]; MusicClips=Join[MusicClips,<| - "SoundData"->Prepend[#SoundData,{None,duration+#Beginning}], + "SoundData"->#SoundData, + "Beginning"->duration+#Beginning, + "End"->duration+#Beginning+#Duration, "MetaSettings"->#MetaSettings |>&/@trackData[["MusicClips"]]]; sectionDuration=Max[sectionDuration,trackData[["Duration"]]], {trackToken,sectionToken[["Tracks"]]}]; duration+=sectionDuration, - {sectionToken,Association/@Association[tokenizer][["Sections"]]}]; + {i,sectionCount}]; Return[<| "Infomation"-><|"Duration"->duration|>, "MusicClips"->MusicClips, @@ -273,7 +288,7 @@ parse[tokenizer_]:=Module[ (* ::Input:: *) -(*Export["E:\\1.mp3",AudioPad[QYSParse[path<>"Songs\\test.qys"],{1,3}]];*) +(*AudioStop[];*) (* ::Input:: *) @@ -285,12 +300,19 @@ parse[tokenizer_]:=Module[ (* ::Input:: *) (*AudioStop[];AudioPlay[#[[2]]]&@*) (*EchoFunction["time: ",#[[1]]&]@*) -(*Timing[QYSParse[path<>"Songs\\Touhou\\Dark_Side_of_Fate.qys"]];*) +(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\Touhou\\Hana_ni_Kaze.qys"],All]]];*) integrate[tracks_]:=integrate[tracks,defaultSettings[[effectSettingTag]]]; integrate[tracks_,effects_]:=Module[ - {audio=0,settings,instrCount,instrument,soundData,generate}, + { + j, + settings,instrCount, + instrument,final={}, + generate,audio=0 + }, + + (* simplify *) Do[ settings=trackData[["MetaSettings"]]; instrCount=Length@settings[["Instr"]]; @@ -298,17 +320,42 @@ integrate[tracks_,effects_]:=Module[ settings[["Volume"]]=Array[settings[["Volume",1]]&,instrCount]; ]; Do[ - instrument=settings[["Instr",i]]; - soundData=trackData[["SoundData"]]; - If[MemberQ[instrData[["Style"]],instrument], - generate=SoundNote[#[[1]],#[[2]],instrument]&, - generate=SoundNote[If[TrueQ@#[[1]],instrument,None],#[[2]]]& - ]; - audio+=settings[["Volume",i]]*AudioFade[ - Sound[generate/@soundData], - {settings[["FadeIn"]],settings[["FadeOut"]]}], + j=LengthWhile[final,Or[ + #Instr!=settings[["Instr",i]], + #Volume!=settings[["Volume",i]], + #Duration>trackData[["Beginning"]], + #FadeOut!=0, + settings[["FadeIn"]]!=0 + ]&]+1; + If[j>Length@final, + AppendTo[final,<| + "SoundData"->Prepend[trackData[["SoundData"]],{None,trackData[["Beginning"]]}], + "Duration"->trackData[["End"]], + "Instr"->settings[["Instr",i]], + "Volume"->settings[["Volume",i]], + "FadeIn"->settings[["FadeIn"]], + "FadeOut"->settings[["FadeOut"]] + |>], + AppendTo[final[[j,"SoundData"]],{None,trackData[["Beginning"]]-final[[j,"Duration"]]}]; + final[[j,"SoundData"]]=Join[final[[j,"SoundData"]],trackData[["SoundData"]]]; + final[[j,"Duration"]]=trackData[["End"]]; + ], {i,instrCount}], {trackData,tracks}]; + + (* integrate *) + Do[ + instrument=data[["Instr"]]; + If[MemberQ[instrData[["Style"]],instrument], + generate=SoundNote[#[[1]],#[[2]],instrument]&, + generate=SoundNote[If[TrueQ@#[[1]],instrument,None],#[[2]]]& + ]; + audio+=data[["Volume"]]*AudioFade[ + Sound[generate/@data[["SoundData"]]], + {data[["FadeIn"]],data[["FadeOut"]]}], + {data,final}]; + + (* add effects *) If[effects[["FadeIn"]]+effects[["FadeOut"]]>0, audio=AudioFade[audio,{effects[["FadeIn"]],effects[["FadeOut"]]}] ]; @@ -343,7 +390,3 @@ integrate[tracks_,effects_]:=Module[ (* ::Text:: *) (*ElectricSnare, BassDrum, Shaker, RideCymbal, Snare, CrashCymbal, HiHatPedal, HiHatClosed*) (*Ocarina, Oboe, Clarinet, Recorder, BrassSection, Harpsichord, BrightPiano, Organ, DrawbarOrgan, FretlessBass*) - - -(* ::Input:: *) -(*pitchDict[["2"]]+tonalityDict[["bE"]]+36*) From 31a1f7937e39a22f023d2360e9a7341816e1f480 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sat, 20 Jan 2018 10:43:04 +0800 Subject: [PATCH 33/54] Add some adjustments --- QYMP.wl | 2 +- Songs/Touhou/Hana_ni_Kaze.qys | 30 +++++++++++++++++++++--------- library.wl | 5 +++-- parser.wl | 17 ++++++++++------- qymToken.wl | 2 +- qysToken.wl | 14 ++++++-------- 6 files changed, 42 insertions(+), 28 deletions(-) diff --git a/QYMP.wl b/QYMP.wl index 8876bed..756f59c 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -14,7 +14,7 @@ path=NotebookDirectory[]; (* temporary function *) -QYMParse[filename_]:=integrate[#MusicClips,#Effects]&@parse[qym`tokenizer[filename]]; +QYMParse[filename_]:=integrate[#MusicClips,#Effects]&@parse[QYM`tokenizer[filename]]; QYSParse[filename_]:=integrate[#MusicClips,#Effects]&@parse[QYS`Tokenize[filename]]; diff --git a/Songs/Touhou/Hana_ni_Kaze.qys b/Songs/Touhou/Hana_ni_Kaze.qys index 8caf34a..30421c4 100644 --- a/Songs/Touhou/Hana_ni_Kaze.qys +++ b/Songs/Touhou/Hana_ni_Kaze.qys @@ -22,7 +22,7 @@ 0-|0-|0-|0-|0-|0-|0-|03b__4__5#_| <0.4>0-\ -0-|0-|0-|0-|[7b,2]-`|[6,1]-`|[5,3b]-^|%-`| +0-|0-|0-|0-|[7b,2]-|[6,1]-|[5,3b]-^|%-`| <0.1>0-\ 0-|0-|0-|0-|0-|0-|0-|03b,| @@ -39,7 +39,7 @@ 1.7,.1^|%_22_17,|1.7,.1^|%_2.17,| <0.6>\ -1o-^|%2o|5,o-^|%{1o[35]7,o[35]}\ +1o-^|%2o|5,o-^|%1o__[35]__7,o__[35]__\ 1o-^|%7,o|1o_.7,o_.6,__5#,__^|%-`| <0.7>\ @@ -61,28 +61,40 @@ 6,-3-|7,--6,_7,_|1.2.7,|1--3_5_\ 6.5.4|51'75|(2^)3---^|%---`\ 3-5-|2.-5#6_|7_5_3_1'_5_3_2'|1'71'6_7_\ -1'_7_6_5_6.1'_^|1'_7_6_5_6_7_3_5_|6---^|%---`| +1'_7_6_5_6.1'_^|1'_7_6_5_6_7_3_5_|6---^|%---`\ +1-02-023b^|%-05-43b4|1#-03b-04-^|%-05-43b1#\ +1-02-023b^|%-03b-23b5|4.5.5#7b.5#.7b|5---^|%-`23| <0.4>\ 6---[63']1'--|[5#7]--3'[5#7]'---|[51']351'351'3'|[4#2']--3'[36]'---\ [41']14[51']1'4'[46]'-|[25]--5[57]---|[67]36[37]-[31']3'-|[13]'3[72']3[61']3[57]3\ 3o3535o353|2o35#35#35#3|535351o3o5o|4#o34#[4#6]'-4#'[62']3\ -4141451o[35]'|5,o7,[25]7,[25]7,5,o[37],|2o3,6,2-3,6,2|1o3,6,[13]----| +4141451o[35]'|5,o7,[25]7,[25]7,5,o[37],|2o3,6,2-3,6,2|1o3,6,[13]----\ +[1M,1]0-[25m],0-%[3,5,13]|0---3b'o05'o0|[1#m,1]0-[3bp5#],0-4o'0|0[4,5#,14]0-5o'01#o'0\ +{1'(3=)5}|5_3b_1_3b_1_5,_1_5,_3bo05o0|4o01#o0|1'0_2o0_5o|6o---| -<0.2>\ +<0.4>\ 6-|5#-|5-|4#-|4-|5-|6-|6-\ 6'60%0%0%|5#'5#0%0%0%|5'50%0%0%|4#'4#0%0%0%\ -4'40%0%0%|5'50%0%0%|6'60%0%0%|060%0%0%| +4'40%0%0%|5'50%0%0%|6'60%0%0%|060%0%0%\ +050%0%0%|05053bo55o5|05#05#0-[45#1'4']''[3673']b''|05#05#5o5#1#o5#\ +050%0%0%|05051'(3=)5---|{5#1#%%%%%%%%%%%%%%|525252522'7575252}|6o.6.6-666| <0.3>\ 0-|0-|0-|0-|0-|0-|0-|3o-`\ -0-|0-|0-|0-|0-|0-|2o-|[13]'-`| +0-|0-|0-|0-|0-|0-|2o-|[13]'-`\ +1o0-2o0-2o3bo|0---5'03b'0|1#o0-3bo0-4o3bo|04o0-3bo01#o0\ +1o0-2o0-2o3bo|04o0-3bo05o0|4o0--1#o0--|1'0-2o0-5o0|6o---`| <0.4>\ 0-|0-|0-|0-|0-|0-|0-|0-\ -6-`|5#-`|5-`|4#-`|4-`|5-`|[26]'-|1'o-`| +6-`|5#-`|5-`|4#-`|4-`|5-`|[26]'-|1'o-`\ +1o0-2o0-2o3bo|05050505|1#o0-3bo0-4o3bo|04o05#0%0%\ +1o502p052o[3bo5]|0[4o5]05o0%0%|[5#4].5#.5#1#5#5#5#|[51'].5.[52']-55o5|6o.6.6-666| <0.1>\ 0-|0-|0-|0-|0-|0-|0-|0-\ 060%0%0%|05#0%0%0%|050%0%0%|04#0%0%0%\ -040%0%0%|050%0%0%|060%0%0%|060%0%0%| +040%0%0%|050%0%0%|060%0%0%|060%0%0%\ +050%0%0%|0%0%3bo55o5|05#0%0%0%|0%0%5o5#1#o5#\ +050%0%0%|0%0%3b05505|5#.%.%-%%%|5.%.%-%%%|6.%.%-%%%| diff --git a/library.wl b/library.wl index 2ea134c..0a5753c 100644 --- a/library.wl +++ b/library.wl @@ -3,7 +3,7 @@ (* user data *) version=201; userPath=$HomeDirectory<>"\\AppData\\Local\\QYMP\\"; -cloudPath="http://www.qymp.tk/assets/"; +cloudPath="http://qymp.ob-studio.cn/assets/"; If[!DirectoryQ[userPath],CreateDirectory[userPath]]; If[!DirectoryQ[userPath<>"export\\"],CreateDirectory[userPath<>"export\\"]]; If[!DirectoryQ[userPath<>"buffer\\"],CreateDirectory[userPath<>"buffer\\"]]; @@ -78,7 +78,7 @@ argument],styleDict[[style]]]; (* tokenizer related *) rep=#~~(","~~#)...&; int=DigitCharacter..; -expr=Except["("|")"]..; +expr=Except["("|")"|"<"|">"]..; name=LetterCharacter~~WordCharacter...; real=DigitCharacter...~~"."~~DigitCharacter...; tonalityDict=<| @@ -88,6 +88,7 @@ tonalityDict=<| "F#"->6,"C#"->1,"Bb"->-2,"Gb"->6, "Eb"->3,"Ab"->-4,"Db"->1,"Cb"->-1 |>; +key=Alternatives@Keys@tonalityDict; getArgument[string_,function_]:=Switch[function, "Instr",{string}, "Volume"|"Chord",ToExpression/@StringSplit[string,","], diff --git a/parser.wl b/parser.wl index 1e2caec..c89d1c1 100644 --- a/parser.wl +++ b/parser.wl @@ -49,15 +49,15 @@ pitchCalc[token_,settings_,previous_]:=Module[{pitches,chordSymbol,pitchDict,cho trackParse[tokenizer_,global_]:=Module[ { + (* basic variables *) tokens=Association/@tokenizer[["Contents"]], repeat=tokenizer[["Repeat"]], settings=global, + + (* notations *) functionData,pitches, beatCount,duration=0, barBeat=0,prevBeat, - barCount=0, - - (* notations *) appoggiatura={}, tuplet=0,tupletRatio, tremolo1=0,tremolo2=0, @@ -65,13 +65,15 @@ trackParse[tokenizer_,global_]:=Module[ portamento=False,portRate, previous=Array[None&,4], + (* repeat and subtrack *) voltaData,voltaSettings, voltaDefault,volta={}, - master,lastRepeat=<||>, - soundData={},durCount=0, - trackData, + master,lastRepeat,trackData, + (* return value *) - trackDuration,MusicClips,messages={} + MusicClips,soundData={}, + trackDuration,durCount=0, + messages={},barCount=0 }, MusicClips=<|"Main"->Null,"Accent"->Nothing,"Subtracks"->{}|>; If[repeat>0, @@ -204,6 +206,7 @@ trackParse[tokenizer_,global_]:=Module[ durCount+=trackData[["Duration"]]; ], {token,Association/@tokens}]; + (* build main music clip *) Switch[repeat, _?Positive, diff --git a/qymToken.wl b/qymToken.wl index f61a280..3dabeab 100644 --- a/qymToken.wl +++ b/qymToken.wl @@ -1,6 +1,6 @@ (* ::Package:: *) -Begin["qym`"]; +Begin["QYM`"]; simitoneOp=Alternatives[Characters["b#"]]...; pitOp=Alternatives[Characters["adMmop$,'"]]...; durOp=Alternatives[Characters["-_."]]...; diff --git a/qysToken.wl b/qysToken.wl index 190bf2c..b8f81bd 100644 --- a/qysToken.wl +++ b/qysToken.wl @@ -49,11 +49,8 @@ getTrack[score_]:=StringCases[score,{ {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Speed"->ToExpression@speed}}, "<"~~bar:int~~"/"~~beat:int~~">":> {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Bar"->ToExpression@bar,"Beat"->ToExpression@beat}}, - "<1="~~cont:(LetterCharacter|","|"'"|"#")..~~">":> - {"Type"->"FunctionToken","Simplified"->True,"Argument"->{ - "Key"->tonalityDict[[StringDelete[cont,","|"'"]]], - "Oct"->StringCount[cont,"'"]-StringCount[cont,","] - }}, + "<1="~~k:key~~o:("'"|",")...~~">":> + {"Type"->"FunctionToken","Simplified"->True,"Argument"->{"Key"->tonalityDict[[k]],"Oct"->StringCount[o,"'"]-StringCount[o,","]}}, "<"~~cont:rep[name~~""|("("~~real~~")")]~~">":> {"Type"->"FunctionToken","Simplified"->True,"Argument"->Module[{ivList=StringSplit[cont,","]},{ "Instr"->StringDelete["("~~__~~")"]/@ivList, @@ -74,7 +71,7 @@ getTrack[score_]:=StringCases[score,{ "("~~pitches:pitch..~~"^)":> {"Type"->"Appoggiatura","Pitches"->getPitch[pitches]}, - (* note related *) + (* others *) "~":>{"Type"->"Portamento"}, "^":>{"Type"->"Tie"}, pitches:pitch|("["~~(pitch|"^")..~~"]")~~pitOp:pitOp~~durOp:durOp:>{ @@ -86,6 +83,7 @@ getTrack[score_]:=StringCases[score,{ "Arpeggio"->StringContainsQ[pitches,"^"], "DurationOperators"->StringDelete[durOp,"`"] }, + space:Whitespace:>{"Type"->"Whitespace","Content"->space}, undef__:>{"Type"->"Undefined","Content"->undef} }]; @@ -110,7 +108,7 @@ Tokenize[filename_]:=Module[ True, score=score<>line; If[StringPart[line,-1]=="\\",Continue[]]; - trackToken=getTrack[StringDelete[score,Whitespace]]; + trackToken=getTrack[score]; If[ContainsOnly[Association[#][["Type"]]&/@trackToken,{"FunctionToken"}], If[sectionMeta!={}, (* empty track *) AppendTo[sections,Append[sectionMeta,"Tracks"->tracks]]; @@ -138,7 +136,7 @@ End[]; (* ::Input:: *) -(*QYS`getTrack["<1=bE'>3(Log[2,12]=)3'---|"]*) +(*QYS`getTrack["<1=bB,,>\t"]*) (* ::Input:: *) From 68da5492f678a157abe1bc69a963c396c0c5c030 Mon Sep 17 00:00:00 2001 From: NN708 Date: Sat, 20 Jan 2018 10:59:01 +0800 Subject: [PATCH 34/54] =?UTF-8?q?=E4=B8=BB=E9=9F=B3=E8=BD=A8=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E6=94=B9=E4=B8=BA=E4=B8=8E=E5=AD=90=E9=9F=B3=E8=BD=A8?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E7=9B=B8=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qymToken.wl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/qymToken.wl b/qymToken.wl index f61a280..66e55b3 100644 --- a/qymToken.wl +++ b/qymToken.wl @@ -203,7 +203,11 @@ tokenizer[filename_]:=Block[ (* Tracks *) tracks={}; While[i<=Length[content] && content[[i]]!="" && (StringLength[content[[i]]]<2 || StringTake[content[[i]],2]!="//"), - AppendTo[tracks,trackTokenizer[content[[i]]]]; + AppendTo[tracks,{ + "Type"->"Track", + "Contents"->trackTokenizer[content[[i]]], + "Repeat"->0 + }]; i++; ]; (* Construct section *) From ad465b226928d7011a4b2dfdebb464878db1d97c Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sat, 20 Jan 2018 12:31:05 +0800 Subject: [PATCH 35/54] Add debug temporarily delete language "english" --- Lang/chs.json | 29 ++++++++++---------- Lang/jpn.json | 54 ------------------------------------ library.wl | 21 +++++++------- parser.wl | 76 +++++++++++++++++++++++++++++++++++++++++++++------ style.json | 1 + 5 files changed, 93 insertions(+), 88 deletions(-) delete mode 100644 Lang/jpn.json diff --git a/Lang/chs.json b/Lang/chs.json index c1cebf7..cf22ceb 100644 --- a/Lang/chs.json +++ b/Lang/chs.json @@ -61,20 +61,6 @@ "Whistle": "口哨", "Xylophone": "木琴" }, - "Error": { - "FileNotFound": "未找到文件\"$1\"", - "TerminatorAbsent": "(章节&1,音轨&2) 缺少终止符", - "RepeatError": "(章节&1,音轨&2) 反复标记不匹配", - "InvalidTonality": "(章节&1,音轨&2,小节&3) 声明了无效调名\"$4\"", - "InvalidInstrument": "(章节&1,音轨&2,小节&3) 声明了无效乐器\"$4\"", - "InvalidCharacter": "(章节&1,音轨&2,小节&3) 匹配到无效字符\"$4\"", - "InvalidFunction": "(章节&1,音轨&2,小节&3) 声明了无效函数名\"$4\"", - "BarLengthError": "(章节&1,音轨&2,小节&3) 拍数错误: 应为&4拍, 实际为&5拍", - "NoFormerPitch": "(章节&1,音轨&2,小节&3) %缺少前一个音符", - "ExpectPitch": "(章节&1,音轨&2,小节&3) 应该使用音高1~7或和弦", - "ExpectPrecussion": "(章节&1,音轨&2,小节&3) 应该使用打击乐标记x或X", - "DiffDuration": "(章节&1) 各音轨长度不统一:#2" - }, "Caption": { "QYMP": "青云播放器", "Playlist": "歌单", @@ -115,6 +101,19 @@ "Version": "1.5", "Producer": "鄂毕工作室", "Website": "www.qymp.tk" - } + }, + "Section": "章节&1", + "Track": "音轨&1", + "Bar": "小节&1", + "FileNotFound": "未找到文件$1", + "TerminatorAbsent": "缺少终止符", + "InvalidTonality": "声明了无效调名$1", + "InvalidInstrument": "声明了无效乐器$1", + "InvalidCharacter": "匹配到无效字符$1", + "InvalidFunction": "声明了无效函数名$1", + "BarLengthError": "拍数错误: 应为&1拍, 实际为&2拍", + "ExpectPitch": "应该使用音高1~7或和弦", + "ExpectPrecussion": "应该使用打击乐标记x或X", + "DiffDuration": "各音轨长度不统一:#1" } } \ No newline at end of file diff --git a/Lang/jpn.json b/Lang/jpn.json deleted file mode 100644 index 46d417b..0000000 --- a/Lang/jpn.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "LanguageName": "简体中文", - "TagName": { - "SongName": "曲名", - "Lyricist": "作词", - "Composer": "作曲", - "Adapter": "改编", - "Comment": "备注", - "Abstract": "摘要", - "Format": "格式", - "TrackCount": "音轨数", - "Duration": "时长", - "Instruments": "乐器" - }, - "Instrument": { - "Accordion": "手风琴", - "Bass": "贝司", - "Cello": "大提琴", - "ElectricBass": "电贝司", - "ElectricPiano": "电钢琴", - "ElectricPiano2": "电钢琴", - "ElectricGrandPiano": "电钢琴", - "Piano": "钢琴", - "Guitar": "吉他", - "Viola": "中提琴", - "Violin": "小提琴", - "Harp": "竖琴", - "Tuba": "大号", - "Flute": "长笛", - "PanFlute": "排萧", - "Piccolo": "短笛", - "Whistle": "口哨", - "Xylophone": "木琴" - }, - "Button": { - "Play": "播放", - "Pause": "暂停", - "Stop": "停止", - "Return": "返回", - "Exit": "退出", - "Delete": "删除", - "Confirm": "确认", - "Settings": "设置", - "Debug": "调试", - "AddSong": "添加歌曲", - "PlaySong": "播放歌曲", - "Add": "添加", - "Manage": "歌单管理", - "Modify": "修改", - "Save": "保存修改", - "Undo": "撤销", - "Export": "导出文件" - } -} \ No newline at end of file diff --git a/library.wl b/library.wl index 0a5753c..04a88d5 100644 --- a/library.wl +++ b/library.wl @@ -42,12 +42,11 @@ styleDict=Normal@Module[{outcome={}}, If[KeyExistsQ[#,"FontWeight"],AppendTo[outcome,FontWeight->ToExpression@#[["FontWeight"]]]]; If[KeyExistsQ[#,"FontColor"],AppendTo[outcome,FontColor->styleColor[[#[["FontColor"]]]]]]; outcome]&/@styleData; -langList={"chs","eng"}; (* languages *) +langList={"chs"(*,"eng"*)}; (* languages *) langDict=#->caption[Association[Import[path<>"Lang\\"<>#<>".json"]][["LanguageName"]],"Text"]&/@langList; langData=Association@Import[path<>"Lang\\"<>userInfo[["Language"]]<>".json"]; tagName=Association@langData[["TagName"]]; instrName=Association@langData[["Instrument"]]; -errorDict=Association@langData[["Error"]]; text=Association@langData[["Caption"]]; aboutInfo=Association@text[["AboutQYMP"]]; metaInfoTags={"Format","TrackCount","Duration","Instruments"}; (* tags *) @@ -64,14 +63,16 @@ timeDisplay[t_]:=Module[ {sec=Floor[QuantityMagnitude[UnitConvert[t,"Seconds"]]]}, IntegerString[Floor[sec/60],10,2]<>":"<>IntegerString[Mod[sec,60],10,2] ]; -completeText[raw_,arg_]:=StringReplace[raw,Flatten@Array[{ - "&"<>ToString[#]->ToString[arg[[#]],FormatType->InputForm], - "$"<>ToString[#]->arg[[#]], - "#"<>ToString[#]->StringRiffle[ToString[#,FormatType->InputForm]&/@arg[[#]],", "] -}&,Length@arg]]; -caption[string_,style_]:=caption[string,style,{}]; -caption[string_,style_,argument_]:=Style[completeText[ - If[StringLength@string>0&&StringPart[string,1]=="_",text[[StringDrop[string,1]]],string], +completeText[raw_,arg_]:=StringReplace[raw,{ + "&"~~i:int:>ToString[arg[[ToExpression@i]],FormatType->InputForm], + "$"~~i:int:>"\""<>arg[[ToExpression@i]]<>"\"", + "#"~~i:int:>StringRiffle[ToString[#,FormatType->InputForm]&/@arg[[ToExpression@i]],", "] +}]; +caption[string_String]:=caption[string,"None",{}]; +caption[string_String,argument_List]:=caption[string,"None",argument]; +caption[string_String,style_String]:=caption[string,style,{}]; +caption[string_String,style_String,argument_List]:=Style[completeText[ + If[StringLength@string>0&&StringPart[string,1]=="_",text[[StringDrop[string,1]]],string], argument],styleDict[[style]]]; diff --git a/parser.wl b/parser.wl index c89d1c1..2264beb 100644 --- a/parser.wl +++ b/parser.wl @@ -8,6 +8,7 @@ defaultSettings=<| functionList=Keys@defaultSettings; metaSettingTag={"Instr","Volume","FadeIn","FadeOut"}; effectSettingTag={"FadeIn","FadeOut"}; +messageTemplate=<|"TrackMessages"->{},"GlobalMessages"->{}|>; beatCalc[operators_]:=Module[{beats=1,i=1}, @@ -185,7 +186,8 @@ trackParse[tokenizer_,global_]:=Module[ barCount++; If[barBeat!=settings[["Bar"]],AppendTo[messages,<| "Type"->"BarLengthError", - "Info"->{barCount,settings[["Bar"]],barBeat} + "Bar"->barCount, + "Info"->{settings[["Bar"]],barBeat} |>]]; barBeat=0; ], @@ -203,9 +205,24 @@ trackParse[tokenizer_,global_]:=Module[ |>] ], {musicClip,trackData[["MusicClips"]]}]; + messages=Join[messages,<| + "Type"->#Type, + "Bar"->#Bar+barCount, + "Info"->#Info + |>&/@trackData[["Messages"]]]; durCount+=trackData[["Duration"]]; + barCount+=trackData[["BarCount"]]; ], {token,Association/@tokens}]; + If[barBeat!=0, + barCount++; + If[barBeat!=settings[["Bar"]],AppendTo[messages,<| + "Type"->"BarLengthError", + "Bar"->barCount, + "Info"->{settings[["Bar"]],barBeat} + |>]]; + barBeat=0; + ]; (* build main music clip *) Switch[repeat, @@ -233,6 +250,7 @@ trackParse[tokenizer_,global_]:=Module[ Return[<| "MusicClips"->Join[{#Main,#Accent},#Subtracks]&[MusicClips], "Duration"->trackDuration, + "BarCount"->barCount, "Messages"->messages |>] ]; @@ -245,19 +263,22 @@ parse[tokenizer_,sections_]:=Module[ tokenData,sectionToken, trackData,MusicClips={}, sectionDuration,duration=0, - messages={},effects, - sectionCount, + trackDuration, + messages,effects, + sectionCount,trackCount, startSection,endSection }, settings=defaultSettings; effects=settings[[effectSettingTag]]; tokenData=Association[tokenizer][["Sections"]]; sectionCount=Length[tokenData]; + messages=ConstantArray[messageTemplate,sectionCount]; Switch[sections, _?ListQ,{startSection,endSection}=sections, _?NumberQ,{startSection,endSection}={sections,sections}, _,{startSection,endSection}={1,sectionCount} ]; + Do[ sectionToken=Association@tokenData[[i]]; sectionDuration=0; @@ -269,18 +290,28 @@ parse[tokenizer_,sections_]:=Module[ {token,Association/@sectionToken[["GlobalSettings"]]}]; If[Length@sectionToken[["Tracks"]]==0,effects=settings[[effectSettingTag]]]; If[iendSection,Continue[]]; + trackCount=Length@sectionToken[["Tracks"]]; + messages[[i,"TrackMessages"]]=ConstantArray[{},trackCount]; + trackDuration={}; Do[ - trackData=trackParse[trackToken,settings]; + trackData=trackParse[sectionToken[["Tracks",j]],settings]; + AppendTo[trackDuration,trackData[["Duration"]]]; MusicClips=Join[MusicClips,<| "SoundData"->#SoundData, "Beginning"->duration+#Beginning, "End"->duration+#Beginning+#Duration, "MetaSettings"->#MetaSettings |>&/@trackData[["MusicClips"]]]; - sectionDuration=Max[sectionDuration,trackData[["Duration"]]], - {trackToken,sectionToken[["Tracks"]]}]; + messages[[i,"TrackMessages",j]]=trackData[["Messages"]], + {j,trackCount}]; + sectionDuration=Max[trackDuration]; + If[!SameQ@@trackDuration,AppendTo[messages[[i,"GlobalMessages"]],<| + "Type"->"DiffDuration", + "Info"->{trackDuration} + |>]]; duration+=sectionDuration, {i,sectionCount}]; + Return[<| "Infomation"-><|"Duration"->duration|>, "MusicClips"->MusicClips, @@ -295,9 +326,7 @@ parse[tokenizer_,sections_]:=Module[ (* ::Input:: *) -(*AudioStop[];AudioPlay[#[[2]]]&@*) -(*EchoFunction["time: ",#[[1]]&]@*) -(*Timing[QYSParse[path<>"Songs\\test.qys"]];*) +(*debug[#Messages]&@parse[QYS`Tokenize[path<>"Songs\\test.qys"],All]*) (* ::Input:: *) @@ -306,6 +335,35 @@ parse[tokenizer_,sections_]:=Module[ (*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\Touhou\\Hana_ni_Kaze.qys"],All]]];*) +debug[messages_]:=Module[{output={},sectionOutput}, + Do[ + If[messages[[i]]!=messageTemplate, + sectionOutput={}; + Do[ + If[messages[[i,"TrackMessages",j]]!={}, + AppendTo[sectionOutput,OpenerView[{ + caption["_Track",{j}], + Column[Row[{ + caption["_Bar",{#Bar}], + caption[": "], + caption[text[[#Type]],#Info] + }]&/@messages[[i,"TrackMessages",j]]] + },True,Method->"Active"]] + ], + {j,Length@messages[[i,"TrackMessages"]]}]; + sectionOutput=Join[sectionOutput,Row[{ + caption[text[[#Type]],#Info] + }]&/@messages[[i,"GlobalMessages"]]]; + AppendTo[output,OpenerView[{ + caption["_Section",{i}], + Column[sectionOutput] + },True,Method->"Active"]] + ], + {i,Length@messages}]; + Return[Column[output]]; +]; + + integrate[tracks_]:=integrate[tracks,defaultSettings[[effectSettingTag]]]; integrate[tracks_,effects_]:=Module[ { diff --git a/style.json b/style.json index 469155d..acfe1cb 100644 --- a/style.json +++ b/style.json @@ -1,4 +1,5 @@ { + "None": {}, "Text": {"FontSize": 20}, "Title": {"FontSize": 32, "FontWeight": "Bold", "FontFamily": "微软雅黑"}, "TitleComment": {"FontSize": 28, "FontWeight": "Bold", "FontFamily": "微软雅黑", "FontColor": "Comment"}, From e46bc808936cbe15def7c48fea92e9f526ef5a27 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sat, 20 Jan 2018 15:26:01 +0800 Subject: [PATCH 36/54] Add some adjustments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 将A,bA调整体调高一个8度 2. 修复了一些过去歌曲的语法问题 3. 修复了部分反复无法运行的问题 --- Songs/El_Pollito_Pio.qys | 2 +- Songs/Gate_of_Steiner.qys | 76 ++++++++++++++++++++------------------- Songs/Lonely_Night.qys | 27 +++++++------- Songs/Numb.qys | 58 +++++++++++++++--------------- Songs/Oriental_Pearl.qys | 12 +++---- library.wl | 6 ++-- parser.wl | 31 +++++++++++----- 7 files changed, 118 insertions(+), 94 deletions(-) diff --git a/Songs/El_Pollito_Pio.qys b/Songs/El_Pollito_Pio.qys index 8489013..0fd67f0 100644 --- a/Songs/El_Pollito_Pio.qys +++ b/Songs/El_Pollito_Pio.qys @@ -12,7 +12,7 @@ {2*66661'1'656---6-[16]'-|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%\ 7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---}\ <138>\ -{2*:66661'1'6566666666|66661'1'6566666633\ +{2*66661'1'6566666666|66661'1'6566666633\ (2-)2'(2-)1'{4*(2-)7(2-)1'}|7-%-%%%%6---[23]---}\ <144>\ {2*66661'1'6566666666|66661'1'6566666633\ diff --git a/Songs/Gate_of_Steiner.qys b/Songs/Gate_of_Steiner.qys index 8f1ffb6..b713281 100644 --- a/Songs/Gate_of_Steiner.qys +++ b/Songs/Gate_of_Steiner.qys @@ -1,6 +1,7 @@ //Gate of Steiner -// +//阿保剛 +//-------------------- Section A -------------------- <72><4/4><1=bE> \ @@ -18,35 +19,11 @@ [7b25][46]_[57b][61'][3b52'].-[252'][51'5']|[562'5']---[4#61'4#']---\ [35^1']77b7|[4#^1']77b7\ [34^1]767|[2^6]6[25#7]2'__1'__7__6__\ -<1=bE'>[1^1'][7,^7][7,^7]b[7,^7]|[34#^1'][7,4^7][7b,4^7b][7b,4^7]\ +[1^1'][7,^7][7,^7]b[7,^7]|[34#^1'][7,4^7][7b,4^7b][7b,4^7]\ [13b^1'][7,4#^7][7b,3^7b][4#7^4#']|3'6745347,21#4,7,6,3,4,-\ 4'71'5645132#7,15,7,4,-|5'#1'#2'#6#75#6#4#321#7,6,1#4,#7,\ 46,245237462'462'64'|3(Log[2,12]=)3'---|| -\ -0---|0---|0---|0---|0---|0---|0---|0---\ -0---|0---|0---|0---|0---|0---|0---|0---\ -0---|0---|0---|0---|0---|0---|0---|0---\ -0---|0---|0---|0---|0---|0---|0---|0---\ -0---|0---|0---|0---\ -2.6,_^%---0_2_6,_2_|3.6,_^%---0_3_6,_3_\ -4-0_4_5_4_3-0_3_1'_6_^|6---0---\ -[2,6,2].6,_^%---0_2_6,_2_|34_36,.^%-0_6,_3_4_\ -5-0_6_4_3-12_3_2_^|%---[4#,6,2].[6,24#].[6,15]\ -[7b,26].5.1'[146].[35].3_4_|[6,15].43_4_1'_[6,13].[6,14].-\ -[7b,26].[7b,25].[251'][3b62'].[3b51']4'_3'_6_^|%.[241'].7b[136].[6,15]3_1\ -[7b,26].[7b,25].[251'][146].[7b,35].3_4_|[6,15].[6,14].[351'][5,13].[6,14].^%\ -[7b25][46]_[57b][61'][3b52'].-[252'][51'5']|[562'5']---[4#61'4#']---\ -[7b,26].[7b,25].[251'][146].[7b,35].3_4_|[6,15].[6,14].[351'][5,13].[6,14].-\ -[7b,26].[7b,25].[251'][3b62'].[3b51']4'_3'_6_^|6.[2,4,1].7b,[136],.5,3,_1,\ -[7b,26].[7b,25].[251'][146].[7b,35].3_4_|[6,15].[6,14].[351'][5,13].[6,14].0\ -[7b25][46]_[57b][61'][3b52'].-[252'][51'5']|[562'5']---[4#61'4#']---\ -[67b2'5']'-[61'4#']'-^|%---\ -[35^1']77b7|[4#^1']77b7\ -[34^1]767|[2^6]6[25#7]2'__1'__7__6__\ -[1^1'][7,^7][7,^7]b[7,^7]|[34#^1'][7,4^7][7b,4^7b][7b,4^7]\ -[14^6]^%__6,__2__3__[6,1#6][5,5]|[463']..[346],..0_|| - <0.6>\ 07,3507,3507,3507,35|07,34#07,34#07,34#07,34#\ 06,3406,3406,3406,34|04#,2304#,233,7,35#[7,35#],---\ @@ -65,7 +42,42 @@ 07,4#507,4#507,4#507,4#5|07,b34#07,b34#07,b34#07,b34#\ 07,3b4#07,3b4#07,3b4#07,3b4#|3,7,453,7,457,,4,1#27,,4,1#2\ 5,1565,1561,5,2#31,5,2#3|5#,2#6#75#,2#6#77,,4#,1#27,,4#,1#2\ -2,6,342,6,342,6,342,6,34|6,,3,5,36,,3,5,7b,67b564534\ +2,6,342,6,342,6,342,6,34|6,,3,5,36,,3,5,7b,67b564534|| + +<0.3>\ +3---|3---|2---|7,--0\ +3---|3---|2-0-|2,_---6,_\ +2,---|6,---|7b,-1,-|2,-6,,-\ +2,---|6,---|5,-1,-|2,-0-\ +0---|0---|0---|0---\ +0---|0---|3b,---|0---\ +3---|3---|2---|7,--0\ +3---|3---|3b---|3,-7,,-\ +4,-1,-|5,-7,,-|2,---|6,,---|| + +//-------------------- Section B -------------------- +<72><4/4><1=bE> + +\ +2.6,_^%---0_2_6,_2_|3.6,_^%---0_3_6,_3_\ +4-0_4_5_4_3-0_3_1'_6_^|6---0---\ +[2,6,2].6,_^%---0_2_6,_2_|34_36,.^%-0_6,_3_4_\ +5-0_6_4_3-12_3_2_^|%---[4#,6,2].[6,24#].[6,15]\ +[7b,26].5.1'[146].[35].3_4_|[6,15].43_4_1'_[6,13].[6,14].-\ +[7b,26].[7b,25].[251'][3b62'].[3b51']4'_3'_6_^|%.[241'].7b[136].[6,15]3_1\ +[7b,26].[7b,25].[251'][146].[7b,35].3_4_|[6,15].[6,14].[351'][5,13].[6,14].^%\ +[7b25][46]_[57b][61'][3b52'].-[252'][51'5']|[562'5']---[4#61'4#']---\ +[7b,26].[7b,25].[251'][146].[7b,35].3_4_|[6,15].[6,14].[351'][5,13].[6,14].-\ +[7b,26].[7b,25].[251'][3b62'].[3b51']4'_3'_6_^|6.[2,4,1].7b,[136],.5,3,_1,\ +[7b,26].[7b,25].[251'][146].[7b,35].3_4_|[6,15].[6,14].[351'][5,13].[6,14].0\ +[7b25][46]_[57b][61'][3b52'].-[252'][51'5']|[562'5']---[4#61'4#']---\ +[67b2'5']'-[61'4#']'-^|%---\ +[35^1']77b7|[4#^1']77b7\ +[34^1]767|[2^6]6[25#7]2'__1'__7__6__\ +[1^1'][7,^7][7,^7]b[7,^7]|[34#^1'][7,4^7][7b,4^7b][7b,4^7]\ +[14^6]^%__6,__2__3__[6,1#6][5,5]|[463']..[346],..0_|| + +<0.6>\ 0_.[6,34]__-0_.%__-|0_.[6,13]__-0_.%__-\ 0_.[245]__-0_.[7b,35]__-|0_.[6,34]_.5__6__0_.[1#35]__-\ 0_.[6,34]__-0_.%__-|0_.[6,13]__-0_.%__-\ @@ -85,15 +97,6 @@ 0__6__3'__4'__-[1#34][6,3]|0__6,__1__3__-2,.0_|| <0.3>\ -3---|3---|2---|7,--0\ -3---|3---|2-0-|2,_---6,_\ -2,---|6,---|7b,-1,-|2,-6,,-\ -2,---|6,---|5,-1,-|2,-0-\ -0---|0---|0---|0---\ -0---|0---|3b,---|0---\ -3---|3---|2---|7,--0\ -3---|3---|3b---|3,-7,,-\ -4,-1,-|5,-7,,-|2,---|6,,---\ 2,---|6,---|7b,-1,-|2,-6,,-\ 2,---|6,---|5,-1,-|2,-0-\ 0---|0---|0---|0---\ @@ -103,3 +106,4 @@ 0---|0---\ 3---|3---|2---|7,--0\ 3---|3---|2---|2,.--0_|| + diff --git a/Songs/Lonely_Night.qys b/Songs/Lonely_Night.qys index d828c8a..d4db85a 100644 --- a/Songs/Lonely_Night.qys +++ b/Songs/Lonely_Night.qys @@ -1,5 +1,5 @@ -//Ťҹ -//݆ѧ +//寂しい夜 +//三輪学 <72> @@ -23,24 +23,23 @@ 3_6,_1-1_2_|3_6,_6.1'_7_5_|2---^|%-..2_\ 3_6,_1-1_2_|3_6,_1.1_7,_1_|2_5_2.7,_2_1_\ 7,_3,_5,-5,_2_|3_6,_6,-6,_1_|7,_2_5-3_4_\ -3_6,_6,-6,_1_|7,257|[7,3^5]---|2'---|6---|| +3_6,_6,-6,_1_|7,257|[7,3^5]---|2'---|6---|| <1=D><0.7><4/4>\ -04,_^1_^5_^6.^|%4,_^1_^5_^6.^|%6,_^3_^7_^1'.|3^6,_^3_0-\ -04,_^1_^5_^6.^|%4,_^1_^5_^6.^|%3,_^7,_4#_^5.^|%3,_^7,_^4#_^5_^6^\ -%2,_^6,_^3_^4.^|%2,_^6,_^3_^4.^|%1,_^5,_^2_^3.^|%1,_^5,_^2_^3.^\ -%2,_^6,_^3_^4.^|%4,_^1_^5_^6.^|%3,_^7,_^3_^4#_0|0---\ -{<1=D,><2/2>\ +04,_1_5_6.^|%4,_1_5_6.^|%6,_3_7_1'.|36,_3_0-\ +04,_1_5_6.^|%4,_1_5_6.^|%3,_7,_4#_5.^|%3,_7,_4#_5_6^\ +%2,_6,_3_4.^|%2,_6,_3_4.^|%1,_5,_2_3.^|%1,_5,_2_3.^\ +%2,_6,_3_4.^|%4,_1_5_6.^|%3,_7,_3_4#_0|0---\ +{\ 0-[36]1[36]1[36]1|[36]1[36]1[36]1[36]1|[36]1[25]7,[25]7,[25]7,|[25]7,[25]7,[25]7,[25]7,\ [25]7,[36]1[36]1[36]1|[36]1[36]1[36]1[36]1|[36]1[25]7,[25]7,[25]7,|[25]7,[25]7,[25]7,[25]7,\ [25]7,[46]2[46]2[46]2|[46]2[46]2[46]2[46]2|[46]2[25]7,[25]7,[25]7,|[25]7,[25]7,[25]7,[25]7,\ [46]2[46]2[46]2[46]2|[25]7,[25]7,[25]7,[25]7,|[46]2[46]2[46]2[46]2|[25]7,[25]7,[25]7,[25]7,}\ -<1=D><4/4>\ 4,_1_5_6_^%-^|%---|3,_1_3_5_^%-^|%---\ 4,_1_5_6_^%-^|%---|6,_3_7_1'_^%-^|%---\ 4,_1_5_6_^%-^|%---|3,_1_3_5_^%-^|%---\ -<2/2>2,6,2-3,5,1-|4,14-3,5,1-|2,6,23461'3'|5,20-----\ -<4/4>1,_5,_1_3_5-|4,_1_4_6_1'-|1,_5,_1_3_5-|4,_1_4_6_1'-\ +{2,6,2-3,5,1-|4,14-3,5,1-|2,6,23461'3'|5,20-----}\ +1,_5,_1_3_5-|4,_1_4_6_1'-|1,_5,_1_3_5-|4,_1_4_6_1'-\ 4,_1_4_6_^%-|4,_1_4_6_^%-|6,_3_7_1'_^%3|6,_3_0--\ 4,_1_4_6_^%-|4,_1_4_6_^%-|3,_7,_4#_5_^%-|3,_7,_4#_5_6-\ 2,_6,_3_4_^%-|2,_6,_3_4_^%-|1,_5,_2_3_^%-|1,_5,_2_3_^%-\ @@ -52,5 +51,9 @@ 0---|0---|0---|0---|0---|0---|0---|0---\ 0---|0---|0--0_2'_|5'_1'_71'2'|3'0--|0---|0--0_2'_|5'_1'_71'2'\ 3'0--|0---|0---|0---|0---|0---|0---|0---\ -{3---^|3---}|| +{3---^|3---}|0---|0---|0---|0---|0---|0---\ +0---|0---|0---|0---|0---|0---|0---|0---\ +0---|0---|0---|0---|0---|0---|0---|0---\ +0---|0---|0---|0---|0---|0---|0---|0---\ +0---|0---|0---|0---|0---|0---|0---|| diff --git a/Songs/Numb.qys b/Songs/Numb.qys index b7b5931..377adaa 100644 --- a/Songs/Numb.qys +++ b/Songs/Numb.qys @@ -3,8 +3,8 @@ <1=F><4/4><60> -<1.0><1/4>0__3'__5'__3'__\ -<4/4>6'_.1''_.7'.0__3'__5'__3'__|1''_.7'_.5'.0__3'__5'__3'__\ +<1.0>{0__3'__5'__3'__}\ +6'_.1''_.7'.0__3'__5'__3'__|1''_.7'_.5'.0__3'__5'__3'__\ [66']_.[1'1'']_.[77'].0__[33']__[55']__[33']__|[1'1'']_.[77']_.[55'].0__[33']__[55']__[33']__\ [66']_3'__3'__3'__3'__4'__3'__0__3'__2'__1'__0_.5__|3'__3'__2'__1'__0__2'__0__5__3'__3'__2'__1'__0__2'__0_\ 0__6__3'__3'__3'__3'__4'__3'__0__3'__2'__1'__0_.5__|3'__3'__2'__1'__0__2'__0__5__3'__2'__0__1'__0__2'__0__3'__^\ @@ -22,10 +22,10 @@ [53'5']_[63'6']__[63'6']__[63'6']_[52'5']_[62'6']_[62'6']__[62'6']__[62'6']_[575']_\ [61'#6']_[61'#6']__[61'#6']__[61'#6']_[52'5']_[61'6']_[61'6']__[61'6']__[61'6']_[747']_\ [53'5']_[63'6']__[63'6']__[63'6']_[52'5']_[62'6']_[62'6']__[62'6']__[62'6']_[575']_\ -[61'6']0__[61'6']__[1'3'1'']__[72'7']__00__[61'6']__[72'7']__0__|[1'3'1''][72'7'][1'3'1''][72'7']_0__[61'6']__-\ -0__[61'6']__[1'3'1'']__[72'7']__00_[72'7']__[61'6']__\ -<2/4>[72'7']__.[72'7']__.[72'7']__0__[61'6']__[72'7']__[61'6']__\ -[72'7']__.[72'7']__.[72'7']__0__[72'7']__[1'3'1'']__[72'7']|[61'6']_.[575']_\ +[61'6']0__[61'6']__[1'3'1'']__[72'7']__00__[61'6']__[72'7']__0__|[1'3'1''][72'7'][1'3'1''][72'7']_0__[61'6']__^\ +%0__[61'6']__[1'3'1'']__[72'7']__00_[72'7']__[61'6']__\ +{<2/4>[72'7']__.[72'7']__.[72'7']__0__[61'6']__[72'7']__[61'6']__\ +[72'7']__.[72'7']__.[72'7']__0__[72'7']__[1'3'1'']__[72'7']__|%_.[61'6']_.[575']_}\ [61'#6']_.[61'#6']__[61'#6']_[52'5']_[61'6']_[61'6']__[61'6']__[61'6']_[747']_\ [53'5']_[63'6']__[63'6']__[63'6']_[52'5']_[62'6']_[62'6']__[62'6']__[62'6']_[575']_\ [61'#6']_[61'#6']__[61'#6']__[61'#6']_[52'5']_[61'6']_[61'6']__[61'6']__[61'6']_[747']_\ @@ -33,26 +33,28 @@ [61'#6']_.[61'#6']__[61'#6']_[52'5']_[61'6']_[61'6']__[61'6']__[61'6']_[747']_\ [53'5']__[55']__[3'3'']__[3'3'']__[3'3'']__[3'3'']__[4'4'']__[3'3'']__0__[3'3'']__[2'2'']__[1'1'']__0\ [61'#6']_.[61'#6']__[61'#6']_[52'5']_[61'6']_[61'6']__[61'6']__[61'6']_[747']_\ -[53'5']__[55']__[3'3'']__[3'3'']__[3'3'']__[3'3'']__[4'4'']__[3'3'']__0__[3'3'']__[2'2'']__[1'1'']__0_[77']_|6---|| +[53'5']__[55']__[3'3'']__[3'3'']__[3'3'']__[3'3'']__[4'4'']__[3'3'']__0__[3'3'']__[2'2'']__[1'1'']__0_[77']_\ +6---|| -<0.6><1/4>0<4/4>\ -6,,__3,__6,__1__0__6,__3,__0__4,,__1,__4,__6,__0__4,__1,__0__|1,__5,__1__3__0__1__5,__0__5,,__2,__5,__7,__0__5,__2,__0__\ -6,,,__3,,__6,,__1,__0__6,,__3,,__0__4,,__1,__4,__6,__0__4,__1,__0__|1,,__5,,__1,__3,__0__1,__5,,__0__5,,__2,__5,__7,__0__5,__2,__0__\ -6,,__3,__6,__1__0__6,__3,__0__4,,__1,__4,__6,__0__4,__1,__0__|1,__5,__1__3__0__1__5,__0__5,,__2,__5,__7,__0__5,__2,__0__\ -6,,__3,__6,__1__0__6,__3,__0__4,,__1,__4,__6,__0__4,__1,__0__|1,__5,__1__3__0__1__5,__0__5,,__2,__5,__7,__0__5,__2,__0__\ -4,,__1,__4,__6,__0__4,__1,__0__5,,__2,__5,__7,__0__5,__2,__0__|6,,__3,__6,__1__0__6,__3,__0__1,,__5,,__1,__3,__0__1,__5,,__0__\ -4,,__1,__4,__6,__0__4,__1,__0__5,,__2,__5,__7,__0__5,__2,__0__|6,,,__3,,__6,,__1#,__0__6,,__3,,__0__4,,__1,__4,__6,__0__4,__1,__0__\ -1,,__5,,__1,__3,__0__1,__5,,__0__5,,__2,__5,__7,__0__5,__2,__0__|6,,,__3,,__6,,__1#,__0__6,,__3,,__0__4,,__1,__4,__6,__0__4,__1,__0__\ -1,,__5,,__1,__3,__0__1,__5,,__0__5,,__2,__5,__7,__0__5,__2,__0__|6,,__3,__6,__1__0__6,__3,__0__4,,__1,__4,__6,__0__4,__1,__0__\ -1,__5,__1__3,__0__1__5,__0__5,,__2,__5,__7,__0__5,__2,__0__|6,,__3,__6,__1__0__6,__3,__0__4,,__1,__4,__6,__0__4,__1,__0__\ -1,__5,__1__3,__0__1__5,__0__5,,__2,__5,__7,__0__5,__2,__0__|4,,__1,__4,__6,__0__4,__1,__0__5,,__2,__5,__7,__0__5,__2,__0__\ -6,,__3,__6,__1__0__6,__3,__0__1,,__5,,__1,__3,__0__1,__5,,__0__|4,,__1,__4,__6,__0__4,__1,__0__5,,__2,__5,__7,__0__5,__2,__0__\ -6,,__3,__6,__1__0__6,__3,__0__1,,__5,,__1,__3,__0__1,__5,,__0__|6,,__3,__6,__1#__0__6,__3,__0__4,,__1,__4,__6,__0__4,__1,__0__\ -1,,__5,,__1,__3,__0__1,__5,,__0__5,,__2,__5,__7,__0__5,__2,__0__|6,,__3,__6,__1#__0__6,__3,__0__4,,__1,__4,__6,__0__4,__1,__0__\ -1,,__5,,__1,__3,__0__1,__5,,__0__5,,__2,__5,__7,__0__5,__2,__0__|4,,__1,__4,__6,__0__4,__1,__0__5,,__2,__5,__7,__0__5,__2,__0__\ -6,,__3,__6,__3,__7,,__5,__7,__5,__1,__5,__1__5,__3,,__7,,__3,__7,,__|4,,__1,__4,__6,__0__4,__1,__0__5,,__2,__5,__7,__0__5,__2,__0__\ -<2/4>3,,__7,,__3,__0_7,,__3,__7,,__|3,,__7,,__3,__0_7,,__3,__7,,__|3,,__7,,__3,__0_7,,__3,__7,,__\ -6,,,__3,,__6,,__1#,__0__6,,__3,,__0__4,,__1,__4,__6,__0__4,__1,__0__|1,,__5,,__1,__3,__0__1,__5,,__0__5,,__2,__5,__7,__0__5,__2,__0__\ -6,,,__3,,__6,,__1#,__0__6,,__3,,__0__4,,__1,__4,__6,__0__4,__1,__0__|1,,__5,,__1,__3,__0__1,__5,,__0__5,,__2,__5,__7,__0__5,__2,__0__\ -6,,,__3,,__6,,__1#,__0__6,,__3,,__0__4,,__1,__4,__6,__0__4,__1,__0__|1,,__5,,__1,__3,__0__1,__5,,__0__5,,__2,__5,__1__0__5,__2,__0__\ -6,,,__3,,__6,,__1#,__0__6,,__3,,__0__4,,__1,__4,__6,__0__4,__1,__0__|1,,__5,,__1,__3,__0__1,__5,,__0__5,,__2,__5,__1__0__5,__3,,__0__|6,,,---|| \ No newline at end of file +<0.6>{0}\ +6,,3,6,106,3,04,,1,4,6,04,1,0|1,5,13015,05,,2,5,7,05,2,0\ +6,,,3,,6,,1,06,,3,,04,,1,4,6,04,1,0|1,,5,,1,3,01,5,,05,,2,5,7,05,2,0\ +6,,3,6,106,3,04,,1,4,6,04,1,0|1,5,13015,05,,2,5,7,05,2,0\ +6,,3,6,106,3,04,,1,4,6,04,1,0|1,5,13015,05,,2,5,7,05,2,0\ +4,,1,4,6,04,1,05,,2,5,7,05,2,0|6,,3,6,106,3,01,,5,,1,3,01,5,,0\ +4,,1,4,6,04,1,05,,2,5,7,05,2,0|6,,,3,,6,,1#,06,,3,,04,,1,4,6,04,1,0\ +1,,5,,1,3,01,5,,05,,2,5,7,05,2,0|6,,,3,,6,,1#,06,,3,,04,,1,4,6,04,1,0\ +1,,5,,1,3,01,5,,05,,2,5,7,05,2,0|6,,3,6,106,3,04,,1,4,6,04,1,0\ +1,5,13,015,05,,2,5,7,05,2,0|6,,3,6,106,3,04,,1,4,6,04,1,0\ +1,5,13,015,05,,2,5,7,05,2,0|4,,1,4,6,04,1,05,,2,5,7,05,2,0\ +6,,3,6,106,3,01,,5,,1,3,01,5,,0|4,,1,4,6,04,1,05,,2,5,7,05,2,0\ +6,,3,6,106,3,01,,5,,1,3,01,5,,0|6,,3,6,1#06,3,04,,1,4,6,04,1,0\ +1,,5,,1,3,01,5,,05,,2,5,7,05,2,0|6,,3,6,1#06,3,04,,1,4,6,04,1,0\ +1,,5,,1,3,01,5,,05,,2,5,7,05,2,0|4,,1,4,6,04,1,05,,2,5,7,05,2,0\ +6,,3,6,3,7,,5,7,5,1,5,15,3,,7,,3,7,,|4,,1,4,6,04,1,05,,2,5,7,05,2,0\ +{3,,7,,3,0-7,,3,7,,|3,,7,,3,0-7,,3,7,,|3,,7,,3,0-7,,3,7,,}\ +6,,,3,,6,,1#,06,,3,,04,,1,4,6,04,1,0|1,,5,,1,3,01,5,,05,,2,5,7,05,2,0\ +6,,,3,,6,,1#,06,,3,,04,,1,4,6,04,1,0|1,,5,,1,3,01,5,,05,,2,5,7,05,2,0\ +6,,,3,,6,,1#,06,,3,,04,,1,4,6,04,1,0|1,,5,,1,3,01,5,,05,,2,5,105,2,0\ +6,,,3,,6,,1#,06,,3,,04,,1,4,6,04,1,0|1,,5,,1,3,01,5,,05,,2,5,105,3,,0\ +6,,,---|| \ No newline at end of file diff --git a/Songs/Oriental_Pearl.qys b/Songs/Oriental_Pearl.qys index 815fef9..3a13001 100644 --- a/Songs/Oriental_Pearl.qys +++ b/Songs/Oriental_Pearl.qys @@ -3,7 +3,7 @@ <4/4> //Soprano -<1=D><100><0.8>0-\ +<1=D><100><0.8>{0-}\ 0---|0---|0---|0---|0---|0---|0---|<80>0--5,_6,_\ 3---^|3--0|5---^|567-\ 1'---^|<1.0>1'_4_1'_.7__6-<0.8>|5--4|3--^3_0_\ @@ -12,7 +12,7 @@ 5-^5_5,_1_.7,__|6,--0_5,__1__|3_15__3__6_.5_.2_|2__^3__1.^10|| //Tenor -<1=D><100><0.8>0-\ +<1=D><100><0.8>{0-}\ 0---|0---|0---|0---|0---|0---|0---|<80>0---\ 5---^|5<1.0>2_1_5-<0.6>|5---|04_3_2-\ <1.0>0_3_6_7_56_7_<0.8>|1'---|1'7-6|5--^5_0_\ @@ -21,16 +21,16 @@ 0_5_5_.6__5-^|5_1_1'_.7__6-|5--4|3--0|| //Alto -<1=D><100><0.8>0-\ +<1=D><100><0.8>{0-}\ 0---|0---|0---|0---|0---|0---|0---|<80>0---\ 1--<1.0>(3~)3_2_1_<0.8>|5,--<1.0>1_2_|3-^3_5_(3~)3_2_1_|1-2_5_5^\ -5-.5,_1_.7,__<0.8>|6,--<1.0>0_5,__1__|3_15__3__6_53_|<0.8>3_1--0_\ +5.-5,_1_.7,__<0.8>|6,--<1.0>0_5,__1__|3_15__3__6_53_|<0.8>3_1--0_\ 0---|0---|0---|0---|0---|0---|0---|0--<1.0>5,_6,_\ 1--(3~)3_2_1_|5,--1_2_|3-^3_5_(3~)3_2_1_|2-^2_5_5\ 5-^5_5,_1_.7,__|6,--0_5,__1__|3_15__3__6_.5_.2_|2__^3__1.^10|| //Bass -<1=D><100><0.8>0-\ +<1=D><100><0.8>{0-}\ 0---|0---|0---|0---|0---|0---|0---|<80>0---\ 1---^|1--0|1---|7,6,5,-\ 1-23|4---|4-4,-|1--^1_0_\ @@ -39,7 +39,7 @@ 0_5_3_.4__3-^|3_1_2_.3__4-|5--5,|1--0|| //Solo -<1=D><100><0.8>5,6,\ +<1=D><100><0.8>{5,6,}\ 1--(3~)3_2_1_|5,--1_2_|3-^3_5_(3~)3_2_1_|2-^2_5_5\ 5-^5_5,_1_.7,__|6,--0_5,__1__|3_15__3__6_52_|<80>3_1.^10\ 0---|0---|0---|0---|0---|0---|0---|0--5,_6,_\ diff --git a/library.wl b/library.wl index 04a88d5..ea73264 100644 --- a/library.wl +++ b/library.wl @@ -83,11 +83,11 @@ expr=Except["("|")"|"<"|">"]..; name=LetterCharacter~~WordCharacter...; real=DigitCharacter...~~"."~~DigitCharacter...; tonalityDict=<| - "C"->0,"G"->7,"D"->2,"A"->-3,"E"->4, + "C"->0,"G"->7,"D"->2,"A"->9,"E"->4, "B"->-1,"#F"->6,"#C"->1,"F"->5,"bB"->-2, - "bE"->3,"bA"->-4,"bD"->1,"bG"->6,"bC"->-1, + "bE"->3,"bA"->8,"bD"->1,"bG"->6,"bC"->-1, "F#"->6,"C#"->1,"Bb"->-2,"Gb"->6, - "Eb"->3,"Ab"->-4,"Db"->1,"Cb"->-1 + "Eb"->3,"Ab"->8,"Db"->1,"Cb"->-1 |>; key=Alternatives@Keys@tonalityDict; getArgument[string_,function_]:=Switch[function, diff --git a/parser.wl b/parser.wl index 2264beb..5d87436 100644 --- a/parser.wl +++ b/parser.wl @@ -8,7 +8,6 @@ defaultSettings=<| functionList=Keys@defaultSettings; metaSettingTag={"Instr","Volume","FadeIn","FadeOut"}; effectSettingTag={"FadeIn","FadeOut"}; -messageTemplate=<|"TrackMessages"->{},"GlobalMessages"->{}|>; beatCalc[operators_]:=Module[{beats=1,i=1}, @@ -69,7 +68,7 @@ trackParse[tokenizer_,global_]:=Module[ (* repeat and subtrack *) voltaData,voltaSettings, voltaDefault,volta={}, - master,lastRepeat,trackData, + master,lastRepeat=<||>,trackData, (* return value *) MusicClips,soundData={}, @@ -126,8 +125,7 @@ trackParse[tokenizer_,global_]:=Module[ ], tie&&pitches==previous[[2]], soundData[[-1,2]]+=duration; - prevBeat+=beatCount; - tie=False, + prevBeat+=beatCount, tremolo1!=0, duration/=(beatCount*2^tremolo1); Do[ @@ -169,7 +167,8 @@ trackParse[tokenizer_,global_]:=Module[ staccato=False, AppendTo[soundData,{pitches,duration}]; ]; - ], + ]; + tie=False, "BarLine", If[token[["Skip"]],lastRepeat=<|"SoundData"->soundData,"Duration"->durCount|>]; If[token[["Order"]]!={0}, @@ -256,6 +255,16 @@ trackParse[tokenizer_,global_]:=Module[ ]; +(* ::Input:: *) +(*debug[#Messages]&@parse[QYS`Tokenize[path<>"Songs\\test.qys"],All]*) + + +(* ::Input:: *) +(*AudioStop[];AudioPlay[#[[2]]]&@*) +(*EchoFunction["time: ",#[[1]]&]@*) +(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\test.qys"],All]]];*) + + parse[tokenizer_]:=parse[tokenizer,All]; parse[tokenizer_,sections_]:=Module[ { @@ -272,7 +281,7 @@ parse[tokenizer_,sections_]:=Module[ effects=settings[[effectSettingTag]]; tokenData=Association[tokenizer][["Sections"]]; sectionCount=Length[tokenData]; - messages=ConstantArray[messageTemplate,sectionCount]; + messages=ConstantArray[{},sectionCount]; Switch[sections, _?ListQ,{startSection,endSection}=sections, _?NumberQ,{startSection,endSection}={sections,sections}, @@ -326,7 +335,13 @@ parse[tokenizer_,sections_]:=Module[ (* ::Input:: *) -(*debug[#Messages]&@parse[QYS`Tokenize[path<>"Songs\\test.qys"],All]*) +(*debug[#Messages]&@parse[QYS`Tokenize[path<>"Songs\\Telegrapher.qys"],All]*) + + +(* ::Input:: *) +(*AudioStop[];AudioPlay[#[[2]]]&@*) +(*EchoFunction["time: ",#[[1]]&]@*) +(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\Lonely_Night.qys"],All]]];*) (* ::Input:: *) @@ -337,7 +352,7 @@ parse[tokenizer_,sections_]:=Module[ debug[messages_]:=Module[{output={},sectionOutput}, Do[ - If[messages[[i]]!=messageTemplate, + If[Flatten@Values@messages[[i]]!={}, sectionOutput={}; Do[ If[messages[[i,"TrackMessages",j]]!={}, From 78b675ea9eb046553ae3aa42bae30655c282a797 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sat, 20 Jan 2018 16:53:00 +0800 Subject: [PATCH 37/54] Modify some 1=A and 1=bA songs --- Songs/Anima.qys | 16 +++--- Songs/Banana.qys | 2 +- Songs/El_Pollito_Pio.qys | 8 +-- Songs/Nagisa.qys | 6 +-- Songs/Noushyou_Sakuretsu_Garu.qys | 88 +++++++++---------------------- parser.wl | 29 +++++----- 6 files changed, 52 insertions(+), 97 deletions(-) diff --git a/Songs/Anima.qys b/Songs/Anima.qys index 986fd00..bfa1d37 100644 --- a/Songs/Anima.qys +++ b/Songs/Anima.qys @@ -3,14 +3,14 @@ <182><4/4> -<1.0><1=bA>\ +<1.0><1=bA,>\ [361']---|[257]---|[361']---|01'75\ [361']---|[24#67]-[5#]-|[361']-1-|01'75\ 4M.-1_3_6_|[13]'.-1_3_6_|5#d-[35]'-|6m-[571'3']-\ 6m.3_6_3_6__3__6__7__|[361']6'7o7'__5'__6'__7'__|[241']'_.2''__1''(2=)2''--\ [25#7]'.-0__7__5#__3__2__7,__|0-37,35#75#73'\ [361']-131'04M-131'04M-2[46]|1'0[251']-251'03a-3[61']3m---\ -[361']-361'04M-461'04M-2[46]|1'05M-%---7d-5#[14]'[573']---<1=A>\ +[361']-361'04M-461'04M-2[46]|1'05M-%---7d-5#[14]'[573']---<1=A,>\ [361']-361'04M-461'04M-2[46]|1'0[251']-251'03a-3[61']3m---\ [361']-131'04M-131'04M-2[46]|1'0[51'2']-5M---35#72'3'5#'7'2''\ [351']'-3'1''3m'-3'7'[72'5']-672'5'67|6m-61'1#'[23b]'[13]'-[4#6]---671'2'\ @@ -19,7 +19,7 @@ [4#61'3']'-6'7'1''7'1''3''6''---7o'---|4M'-6'7'1''7'1''2''[251']'---[257]'---\ [146]-(3~)[61'4']%6m(3~)[51'3'][51'2']%(3~)5M%%|[35#72'].5#_[72'5']-6m-%-\ [4#1'3']--4#64#61'[4#1'3']-4#61'61'3'|[561'3']-251'3'4'3'5M---%---<1=B>\ -[146]-(3~)[61'4']%6m(3~)[51'3'][51'2']%(3~)5M%%|[35#72'].5#_[72'5']-6m-%-<1=bA>\ +[146]-(3~)[61'4']%6m(3~)[51'3'][51'2']%(3~)5M%%|[35#72'].5#_[72'5']-6m-%-<1=bA,>\ 2m'-62'4'2'4'5'[13b4#6]'-62'4'2'4'7'|[251']'-72'5'1''2''1''[257]'---[72'4#'7']---<1=bE>\ [561'#3']-(3~)61'3'[1#61'5']--6'_5'_|[62'4']-44'[51'3']-33'[47b2']-22'[361']-11'\ [472']-(3~)572'[7,574']--5'_4'_|[51'3']-33'5M-22'[351']-31'[257b]--7b<1=bB>\ @@ -39,23 +39,23 @@ [136]-%-6,136[146]-%-6,146|2m-%-6,246[462'4']-4'[64'][3b673b']---\ 06'_7'_6'(2=)7'-|[73'5#']-5'4#'4'3'3b'2'[23]''[67b1']'[34#5]'[7b1'2'][46][1235][567b],[34],\ 0-[241']-2461'[257]--721'7,7|0-[257]-7,257[351']-5-4o,345\ -02m(3~)[12][14][15][7,246].[7,245][5,7,24].|%-5,7,[12]7,24[5#,7,3]-4[2#3][3,5#,7,2]---<1=bA>\ +02m(3~)[12][14][15][7,246].[7,245][5,7,24].|%-5,7,[12]7,24[5#,7,3]-4[2#3][3,5#,7,2]---<1=bA,>\ [361']-1'7[3561']71'_7_1'_2'_|4#d-6m.6_2M-[7d7']-\ [2m1']-(3~)[61'4']%%(3~)[146]'%%(3~)[147]'%%|(3~)[35#1']'%%(3~)[35#2']'%%(3~)[73'6']'%%[72'3'5#']'-\ [616']'-0-6'1''3''6''[131']''-1'''[36]''1''1'0-|[136]---^|%---| -<0.6><1=bA,,>\ +<0.6><1=bA,,,>\ 4o---|3o---|6o---|0---\ 4o---|3'-3-|6o---|6o,_.6,__6(2=)6,-6_6,__6__\ 2o---|2o---|3o-3-|6o-6-\ 4#o---|4#---|5o.5_5o.5_\ 5#o55_5_5o_5o_|5#5#.0.\ -6o6_4o4_2o|2_5o5_5#o%|6o6_4o4_2o|2_5o_%%#%<1=A,,>\ +6o6_4o4_2o|2_5o5_5#o%|6o6_4o4_2o|2_5o_%%#%<1=A,,,>\ 6o66'4o44'2o2|2'5o-55#o-%-|6o66'4o44'2o2|2'5o%-5#-5#,o-\ 6o,-6-5o,-5,-|4#o,-4#,-4#-4#,-|2o-2-3o-5#o-|6o65o54o43o3\ 2o-2-5o5'44'|3o-5#o-6o6'55'|4#o4#'6'1''3''1''6'4'|2o-2-5o-5-\ 4o-4'-5o-4-|3o-3-6o-5o-|4#o2o'4#'52o22'2|5o-2'-5o-4-\ -<1=B,,>4o,-1o-5o,-4,-|3o,-3,-6o,-5o,-|<1=bA,,>2o-22'4#o-4#4#'|5o-5-7o654#\ +<1=B,,>4o,-1o-5o,-4,-|3o,-3,-6o,-5o,-|<1=bA,,,>2o-22'4#o-4#4#'|5o-5-7o654#\ <1=bE,,>6o,1#'3'6'0-6,-|22'11'7b,7b6,6|5o,72'5'0-5,-|11'5,511'7b,7bo\ 3o3'5#'7'0-3-|66'55'4#4#'4#,4#|44'3b3b'33'33'|333o3o3o3o0-\ 6[36]'`6[36]'`6[36]'`6[36]'`|6[36]'`6[36]'`6[36]'`6[36]'`|6[36]'`6[36]'`6[36]'`6[36]'`|3o%`2o%`1o%`7o,%`\ @@ -65,7 +65,7 @@ 3`2`1`7,`6o,5`4`3`|3b`1#`7,`6,`5#o,4`3`3b`|1#`7,`6,`5#,`4#o,3`2`1#`|11'`4#,4#`1#o-1#-<1=G,,,>\ 6o%0-4o%0-|2o%0-3o-3-|6o%0-4o%0-|2o%0-3o-3b-<1=G,,>\ 3-3,-----|3o,.3_3,_3_3,_33,_3_3,_3_3,_3_3,_|262'4'5[27]'4'2'|373'763'06\ -26(3~)2o4o5o5o.5o,7.|151,17,-3o,-|<1=bA,,>63'1''3'52'5'5|4#2'6'2''4#''-4#'-\ +26(3~)2o4o5o5o.5o,7.|151,17,-3o,-|<1=bA,,,>63'1''3'52'5'5|4#2'6'2''4#''-4#'-\ 2o-[62'4']'-3bo-[73b']'-|3o-3p'-3o,-3-|6o,06'_1''_3''_6''_6p0.1''_6'_[13]'_|6o,---^|%---| diff --git a/Songs/Banana.qys b/Songs/Banana.qys index d36d315..b5fb5c7 100644 --- a/Songs/Banana.qys +++ b/Songs/Banana.qys @@ -1,6 +1,6 @@ //Banana - The Minions Song -<100><4/4><1=A> +<100><4/4><1=A,> //Soprano <1.0>0---|0---|0--2_3_|3_2_1.3_5_3_\ diff --git a/Songs/El_Pollito_Pio.qys b/Songs/El_Pollito_Pio.qys index 0fd67f0..5ec2b6f 100644 --- a/Songs/El_Pollito_Pio.qys +++ b/Songs/El_Pollito_Pio.qys @@ -2,8 +2,8 @@ <1=A><4/4> -<1.0><120>\ -01$0%0%0%|0%0%0%0%|0%0%0%0%|0%0%%-3-\ +<1.0><120>\ +01$0%0%0%|0%0%0%0%|0%0%0%0%|0%0%%-3-\ {4*66661'1'656---0---|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%|7-%-%%%%1'-%-%%%%|7-%-%%%%6---[23]---}\ <128>\ {2*66661'1'656---6-6'-|66661'1'656-3'-%%%%|2'-%-%%%%1'-%-%%%%\ @@ -19,7 +19,7 @@ (2-)2'(2-)1'{5*(2-)7(2-)1'}|7-%-%%%%6---[23]---}\ 66661'1'656---0---|66661'1'656-3'-%-%-|2'%%%1'%%%|7771'66[16]'-|| -<1.0><120>\ +<1.0><120>\ 0---|0---|0---|0---\ {4*1316,|1313|6-3-|5#-3-|5#-6m,5#,}\ <128>\ @@ -33,7 +33,7 @@ [35#]7,[36]6|[35#]-[36]-|[35#]7,[36]6|[35#]-[36]-|5#-6m,5#,}\ 1316,|1313|6-3-|5#-3-|| -<1.0><120>\ +<1.0><120>\ 6o,03'5'6o,03'5'|6o,03'5'6o,03'5'|6o,03'5'6o,03'5'|6o,03'5'6o,06o,,-\ {4*6o,1$'3[75']6o,1$'3[75']|6o,1$'3[75']6o,1$'3[75']|2o,[62']6[26]'6o,1$'3[16]'\ 3o,3M'5#[75#']6o,1$'3[16]'|5#o,3M'3[75#]6p,-3M-}\ diff --git a/Songs/Nagisa.qys b/Songs/Nagisa.qys index 527065e..db70841 100644 --- a/Songs/Nagisa.qys +++ b/Songs/Nagisa.qys @@ -1,6 +1,6 @@ <1=bA><4/4><150> -\ +\ 6,_.5,_.1.1^|%_2.2.3_^|%1.5,.|6,_.5,_.1.1^|%_2.2.3_^|%1--\ 6,_.5,_.1.1^|%_2.2.3_^|%1.5,.|6,_.5,_.1.1^|%_2.1-^|%---\ 6,_.5,_.1.1^|%_2.2.3_^|%1.5,.|6,_.5,_.1.1^|%_2.2.3_^|%2--\ @@ -12,7 +12,7 @@ 2.1_.6,.1__^|%_2_.3_.5_.2_.3_^|%1_.5,_.1_.2_.|2.1_.6,_.0_.6,__^|6,_1_.5_.3-^|%3,_.5,_.6,_.2_.\ 2.1_.6,.1__^|%_2_.3_.5_.2_.3_^|%1.7,.|6,-6,_.7,_.0_|0__1_.7,_.0_.1.^|%---| -<0.6>\ +<0.6>\ 0---|0---|0---|0---|0---|0---\ 0---|0---|0---|0---|0---|0---\ 6,--1^|%-5,-^|%1--|6,--1^|%-5,-^|%2--\ @@ -24,7 +24,7 @@ 0---|0---|0---|0---|0---|0---\ 0---|0---|0---|0---|0---|0---| -<0.2>\ +<0.2>\ 0---|0---|0---|0---|0---|0---\ 0---|0---|0---|0---|0---|0---\ 0---|0---|0---|0---|0---|0---\ diff --git a/Songs/Noushyou_Sakuretsu_Garu.qys b/Songs/Noushyou_Sakuretsu_Garu.qys index b83fdd7..8167d0b 100644 --- a/Songs/Noushyou_Sakuretsu_Garu.qys +++ b/Songs/Noushyou_Sakuretsu_Garu.qys @@ -1,10 +1,10 @@ -//×ըѥ` -// +//脳浆炸裂ガール +//れるりり //----------Section 1---------- <150><4/4> -<1=Ab>\ +<1=bA,>\ 63'6_2#'6_2'6_1'.6|065_6_3_1_2#_2_1_6,6,_5,\ 63'6_2#'6_2'6_1'.6|065_6_3_1_2#_3_6_1'6_2'\ 63'6_2#'6_2'6_1'.6|065_6_3_1_2#_2_1_6,6,_5,\ @@ -12,7 +12,7 @@ 63'6_2#'6_2'6_1'.6|065_6_3_1_2#_2_1_6,6,_5,\ 63'6_2#'6_2'6_1'.6|065_6_3_1_2#_3_6_1'6_2'| -<1=Ab,><0.8>\ +<1=bA,,><0.8>\ [6,36]---|[4,14]-[3,7,3]-\ [6,36]---|[4,14]-[3,7,3]-\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ @@ -20,7 +20,7 @@ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]| -<1=Ab,><0.8>\ +<1=bA,,><0.8>\ [6,36]---|[4,14]-[3,7,3]-\ [6,36]---|[4,14]-[3,7,3]-\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ @@ -45,45 +45,26 @@ x0x0x0x0x0x0x0x0|x0x0x0x0x0x0x0x0| //----------Section 2-3---------- <150><4/4> -<1=Ab><0.6>\ +<1=bA,><0.6>\ 56-66-56-66-5665|6-6-6-6666661'665\ 6-6-6-6566666665|6-6-1'1'2'2'2#'-2#'-2'1'65\ 56-66-56-66-5665|6-6-6-6666661'665\ 6-6-6-656-6-6-65|56661'6652'1'6-56-1'\ -\ -23561'2'3'5'6'5'3'2'1'653|23561'2'3'5'7b'6'5'3'7b653\ +{\ 23561'2'3'5'6'5'3'2'1'653|23561'2'3'5'7b'6'5'3'7b653\ +23561'2'3'5'6'5'3'2'1'653|23561'2'3'5'7b'6'5'3'7b653}\ \ 56666-65-6666665|6-6-6-6566661'1'2'2'\ 6666566656665665|6-6-1'1'2'2'2#'-2#'-2'1'65\ 5666666566666555|666-6-6566661'1'2'2'\ 6-6-6-656-6-5665|61'656--5#\ -\ -2'-^2'-1'-7-1'7^|7-5-5-35-6666666\ -6-6565656-656565|666666662'-3'-5556\ -1'-1'6777677|77777771'2'-3'-5-6-\ -(12~)666665666665|6666666666662'-1'-| - -<1=Ab>\ -56-66-56-66-5665|6-6-6-6666661'665\ -6-6-6-6566666665|6-6-1'1'2'2'2#'-2#'-2'1'65\ -56-66-56-66-5665|6-6-6-6666661'665\ -6-6-6-656-6-6-65|56661'6652'1'6-56-1'\ -\ -23561'2'3'5'6'5'3'2'1'653|23561'2'3'5'7b'6'5'3'7b653\ -23561'2'3'5'6'5'3'2'1'653|23561'2'3'5'7b'6'5'3'7b653\ -\ -56666-65-6666665|6-6-6-6566661'1'2'2'\ -6666566656665665|6-6-1'1'2'2'2#'-2#'-2'1'65\ -5666666566666555|666-6-6566661'1'2'2'\ -6-6-6-656-6-5665|61'656--5#\ -\ +{\ 2'-^2'-1'-7-1'7^|7-5-5-35-6666666\ 6-6565656-656565|666666662'-3'-5556\ 1'-1'6777677|77777771'2'-3'-5-6-\ -(12~)666665666665|6666666666662'-1'-| +(12~)666665666665|6666666666662'-1'-}| -<1=Ab,>\ +<1=bA,,>\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ @@ -99,7 +80,7 @@ x0x0x0x0x0x0x0x0|x0x0x0x0x0x0x0x0| 4[14]'4[14]'3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ [41'4']-[373']-|[6,36]---| -<1=Ab,><0.6>\ +<1=bA,,><0.6>\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ @@ -213,21 +194,21 @@ x-x-|x-x-\ //----------Section 5---------- <150><3/4> -<1=Ab'><0.7>\ +<1=bA><0.7>\ 0--|0--|0--|02_3_4_5_\ 71'5|2#-3|4-4#|5--\ 5,6,1|2-7,_6,_|4,_6,_1_2_3|7b--\ 01'1'|1'6_5_3b_3_|11'1'|1'6_5_3b_3_\ 6,7b,7,11#2|2#344#55#|67b71'1#'2'|2#'3'4'4#'5'5#'| -<1=Ab,><0.8>\ +<1=bA,,><0.8>\ 1[35][35]|5,[35][35]|1[35][35]|5,[35][35]\ 1[35][35]|5,[35][35]|1[35][35]|5,[35][35]\ 1[35][35]|5,[35][35]|1[35][35]|5,[35][35]\ 1[35][35]|5,[35][35]|1[35][35]|5,[35][35]\ 1[35][35]|5,[35][35]|1[35][35]|5,[35][35]| -<1=Ab,><0.8>\ +<1=bA,,><0.8>\ 1[35][35]|5,[35][35]|1[35][35]|5,[35][35]\ 1[35][35]|5,[35][35]|1[35][35]|5,[35][35]\ 1[35][35]|5,[35][35]|1[35][35]|5,[35][35]\ @@ -251,49 +232,28 @@ x0-|x0-|x0-|x0-\ //----------Section 6-7---------- <150><4/4> -<1=Ab'><0.6>\ -6'---|0---|5'---|0---\ -\ +<1=bA>\ +{\ +6'---|0---|5'---|0---}\ 566-6-6566666-66|6-6-6-656661'--65\ 6666666666666665|666-1'1'2'2'2#'-3'-2'1'65\ 566-6-6566666-66|6-6-6-656-6-1'-2'-\ 6-666-556-666665|6-66-1'662'1'6-56-1'\ -\ +{\ 65671'671'2'3'2'1'71'75|461'71'6435#75#371'2'7\ -65671'671'2'3'4'2'5'4'3'4'|3'1'61'72'1'75#72'5#4'5#3'5#\ +65671'671'2'3'4'2'5'4'3'4'|3'1'61'72'1'75#72'5#4'5#3'5#}\ \ 66-66-65-6666665|666666656-661'1'2'2'\ 666666666-666-6-|56-61'1'2'2'2#'2#'3'-2'1'65\ 6666666656-60---|666-6-6566661'1'2'2'\ 6-6-6-656-6-5665|61'656--5#\ -\ -2'-^2'-1'-7-1'7^|7-5-5-35-6666666\ -6-6565656-656565|666666662'-3'-5556\ -1'-1'6777677|77777771'2'-3'-5-6-\ -(12~)666665666665|6666666666662'-1'-| - -<1=Ab'>\ -6'---|0---|5'---|0---\ -\ -566-6-6566666-66|6-6-6-656661'--65\ -6666666666666665|666-1'1'2'2'2#'-3'-2'1'65\ -566-6-6566666-66|6-6-6-656-6-1'-2'-\ -6-666-556-666665|6-66-1'662'1'6-56-1'\ -\ -65671'671'2'3'2'1'71'75|461'71'6435#75#371'2'7\ -65671'671'2'3'4'2'5'4'3'4'|3'1'61'72'1'75#72'5#4'5#3'5#\ -\ -66-66-65-6666665|666666656-661'1'2'2'\ -666666666-666-6-|56-61'1'2'2'2#'2#'3'-2'1'65\ -6666666656-60---|666-6-6566661'1'2'2'\ -6-6-6-656-6-5665|61'656--5#\ -\ +{\ 2'-^2'-1'-7-1'7^|7-5-5-35-6666666\ 6-6565656-656565|666666662'-3'-5556\ 1'-1'6777677|77777771'2'-3'-5-6-\ -(12~)666665666665|6666666666662'-1'-| +(12~)666665666665|6666666666662'-1'-}| -<1=Ab,,><0.6>\ +<1=bA,,,><0.6>\ 65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ 65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ 65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ @@ -305,7 +265,7 @@ x0-|x0-|x0-|x0-\ 4[14]'4[14]'3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ [41'4']-[373']-|[6,36]---| -<1=Ab,,><0.6>\ +<1=bA,,,><0.6>\ 65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ 65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ 65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ diff --git a/parser.wl b/parser.wl index 5d87436..492ea2e 100644 --- a/parser.wl +++ b/parser.wl @@ -281,7 +281,7 @@ parse[tokenizer_,sections_]:=Module[ effects=settings[[effectSettingTag]]; tokenData=Association[tokenizer][["Sections"]]; sectionCount=Length[tokenData]; - messages=ConstantArray[{},sectionCount]; + messages=ConstantArray[<|"TrackMessages"->{},"GlobalMessages"->{}|>,sectionCount]; Switch[sections, _?ListQ,{startSection,endSection}=sections, _?NumberQ,{startSection,endSection}={sections,sections}, @@ -335,13 +335,13 @@ parse[tokenizer_,sections_]:=Module[ (* ::Input:: *) -(*debug[#Messages]&@parse[QYS`Tokenize[path<>"Songs\\Telegrapher.qys"],All]*) +(*debug[#Messages]&@parse[QYS`Tokenize[path<>"Songs\\Noushyou_Sakuretsu_Garu.qys"],All]*) (* ::Input:: *) (*AudioStop[];AudioPlay[#[[2]]]&@*) (*EchoFunction["time: ",#[[1]]&]@*) -(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\Lonely_Night.qys"],All]]];*) +(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\Noushyou_Sakuretsu_Garu.qys"],5]]];*) (* ::Input:: *) @@ -379,13 +379,15 @@ debug[messages_]:=Module[{output={},sectionOutput}, ]; +generate=If[MemberQ[instrData[["Style"]],#[[3]]], + SoundNote[#[[1]],#[[2]],#[[3]]], + SoundNote[If[TrueQ@#[[1]],#[[3]],None],#[[2]]] +]&; integrate[tracks_]:=integrate[tracks,defaultSettings[[effectSettingTag]]]; integrate[tracks_,effects_]:=Module[ { - j, - settings,instrCount, - instrument,final={}, - generate,audio=0 + j,settings,instrCount, + final={},audio=0 }, (* simplify *) @@ -397,7 +399,6 @@ integrate[tracks_,effects_]:=Module[ ]; Do[ j=LengthWhile[final,Or[ - #Instr!=settings[["Instr",i]], #Volume!=settings[["Volume",i]], #Duration>trackData[["Beginning"]], #FadeOut!=0, @@ -405,15 +406,14 @@ integrate[tracks_,effects_]:=Module[ ]&]+1; If[j>Length@final, AppendTo[final,<| - "SoundData"->Prepend[trackData[["SoundData"]],{None,trackData[["Beginning"]]}], + "SoundData"->(Append[#,settings[["Instr",i]]]&)/@Prepend[trackData[["SoundData"]],{None,trackData[["Beginning"]]}], "Duration"->trackData[["End"]], - "Instr"->settings[["Instr",i]], "Volume"->settings[["Volume",i]], "FadeIn"->settings[["FadeIn"]], "FadeOut"->settings[["FadeOut"]] |>], - AppendTo[final[[j,"SoundData"]],{None,trackData[["Beginning"]]-final[[j,"Duration"]]}]; - final[[j,"SoundData"]]=Join[final[[j,"SoundData"]],trackData[["SoundData"]]]; + AppendTo[final[[j,"SoundData"]],{None,trackData[["Beginning"]]-final[[j,"Duration"]],"Piano"}]; + final[[j,"SoundData"]]=Join[final[[j,"SoundData"]],Append[#,settings[["Instr",i]]]&/@trackData[["SoundData"]]]; final[[j,"Duration"]]=trackData[["End"]]; ], {i,instrCount}], @@ -421,11 +421,6 @@ integrate[tracks_,effects_]:=Module[ (* integrate *) Do[ - instrument=data[["Instr"]]; - If[MemberQ[instrData[["Style"]],instrument], - generate=SoundNote[#[[1]],#[[2]],instrument]&, - generate=SoundNote[If[TrueQ@#[[1]],instrument,None],#[[2]]]& - ]; audio+=data[["Volume"]]*AudioFade[ Sound[generate/@data[["SoundData"]]], {data[["FadeIn"]],data[["FadeOut"]]}], From 7a703e3c3619cdd678bde4c1acc9c265f3fefb6e Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sat, 20 Jan 2018 21:31:41 +0800 Subject: [PATCH 38/54] Fixed a bug I'm sorry... --- Songs/Noushyou_Sakuretsu_Garu.qys | 2 +- Songs/Touhou/Hana_ni_Kaze.qys | 139 ++++++++++++++++++++++++++++-- parser.wl | 6 +- qysToken.wl | 4 +- 4 files changed, 136 insertions(+), 15 deletions(-) diff --git a/Songs/Noushyou_Sakuretsu_Garu.qys b/Songs/Noushyou_Sakuretsu_Garu.qys index 8167d0b..a91db9e 100644 --- a/Songs/Noushyou_Sakuretsu_Garu.qys +++ b/Songs/Noushyou_Sakuretsu_Garu.qys @@ -45,7 +45,7 @@ x0x0x0x0x0x0x0x0|x0x0x0x0x0x0x0x0| //----------Section 2-3---------- <150><4/4> -<1=bA,><0.6>\ +<1=bA,>\ 56-66-56-66-5665|6-6-6-6666661'665\ 6-6-6-6566666665|6-6-1'1'2'2'2#'-2#'-2'1'65\ 56-66-56-66-5665|6-6-6-6666661'665\ diff --git a/Songs/Touhou/Hana_ni_Kaze.qys b/Songs/Touhou/Hana_ni_Kaze.qys index 30421c4..48476e7 100644 --- a/Songs/Touhou/Hana_ni_Kaze.qys +++ b/Songs/Touhou/Hana_ni_Kaze.qys @@ -6,19 +6,19 @@ <1.0>0-56\ 7b-7b2'|(3~)1'7b6^%-|1'-(3~)1'2'3b'\ -(3~)2'1'7b^%6|7b.2'1'_7b_6_|4_1_4.56_|5---^|5---`| +(3~)2'1'7b^%6|7b.2'1'_7b_6_|4_1_4.56_|5---^|5---`| -<0.2>0-\ +<0.4>0-\ [57b]7b,3[57b]-%23b|[47b]144[46]146|[61']14#1[13b]'14#1|[7b2']255'-2'7b5\ [57b]7b,3[7b2']7b,3b[57b]-|[46]14[46]--[61']-|3bM--555.4''_[51'']_7'_|4'6'| -<0.1>0-\ +<0.2>0-\ 3bo-|4o-|4#o-|5o-|3bo-|4o-|5o-|0-| <0.3>0-\ 0-|0-|0-|0-|5$-|4M-|5$-^|%-`| -<0.5>0-\ +<0.7>0-\ 0-|0-|0-|0-|0-|0-|0-|03b__4__5#_| <0.4>0-\ @@ -38,11 +38,11 @@ 1.7,.1^|%_22_17,|1.7,.1^|%_2.[13]_2_[7,2]_1_\ 1.7,.1^|%_22_17,|1.7,.1^|%_2.17,| -<0.6>\ +<0.5>\ 1o-^|%2o|5,o-^|%1o__[35]__7,o__[35]__\ 1o-^|%7,o|1o_.7,o_.6,__5#,__^|%-`| -<0.7>\ +<1.0>\ 23_5.3_2_^|%-..5_^|%_4_3_2_(3~)7,15,^|%-2_3_5_3_\ 5.6.-^|%.1'7_6_5_|5--6_5#_^|%---`| @@ -78,13 +78,13 @@ 6'60%0%0%|5#'5#0%0%0%|5'50%0%0%|4#'4#0%0%0%\ 4'40%0%0%|5'50%0%0%|6'60%0%0%|060%0%0%\ 050%0%0%|05053bo55o5|05#05#0-[45#1'4']''[3673']b''|05#05#5o5#1#o5#\ -050%0%0%|05051'(3=)5---|{5#1#%%%%%%%%%%%%%%|525252522'7575252}|6o.6.6-666| +050%0%0%|05051'(3=)5---|5#(3=)1#-------|{525252522'7575252}|6o.6.6-666| <0.3>\ 0-|0-|0-|0-|0-|0-|0-|3o-`\ 0-|0-|0-|0-|0-|0-|2o-|[13]'-`\ 1o0-2o0-2o3bo|0---5'03b'0|1#o0-3bo0-4o3bo|04o0-3bo01#o0\ -1o0-2o0-2o3bo|04o0-3bo05o0|4o0--1#o0--|1'0-2o0-5o0|6o---`| +1o0-2o0-2o3bo|04o0-3bo05o0|4o0--1#o0--|1'0-2o0-5o0|6o-`| <0.4>\ 0-|0-|0-|0-|0-|0-|0-|0-\ @@ -97,4 +97,125 @@ 060%0%0%|05#0%0%0%|050%0%0%|04#0%0%0%\ 040%0%0%|050%0%0%|060%0%0%|060%0%0%\ 050%0%0%|0%0%3bo55o5|05#0%0%0%|0%0%5o5#1#o5#\ -050%0%0%|0%0%3b05505|5#.%.%-%%%|5.%.%-%%%|6.%.%-%%%| +050%0%0%|0%0%3bo55o5|5#.%.%-%%%|5.%.%-%%%|6.%.%-%%%| + +//-------------------- Section D -------------------- +<1=bA> + +<1.0>\ +1-13|(3~)217,^%-|2-(3~)234|(3~)321^%7,\ +1.32_1_7,_|5,_2,_5,.6,7,_|1-..1_^|%_7,_6,_5,_3,_5,.\ +1-13|(3~)217,^%-|2-(3~)234|(3~)321^%7,\ +1.32_1_7,_|5,_2,_5,.6,7,_|6,---^|%---`\ +0-|0-|0-|0-|0-|0-|0-|0-| + +<0.4>\ +17,15----^|%7,15-7,15|3237----^|%735-1o35\ +1o357-1o35|1o357-1o35|1o351o-1o3_1'_[51']_1'_|{13,5,7,13571'75317,5,3,}\ +17,15----^|%7,17o-7,15|2'o237----^|%7351'o1o7o5\ +[6o1']357-1o6o5|[5o1']357-1o2o5|1o35[5o1']-1'o7o5|{1o3,5,7,13571'75317,5,3,}\ +{<0.6>4,M-13|(3~)217,^%-|2-(3~)234|(3~)321^%7,\ +1.32_1_7,_|5,_2,_5,.6,_6,_7,_|0---|7.7_7_77_}| + +<0.2>\ +4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ +4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ +4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ +4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ +{<0.4>[4o,6],13[14]----|5o,,7,25-257|5#o,,7,2[35#]----|6o,,136-316,\ +4o,,6,1[36]----|5o,,7,25-27,5,_[6,1]_|[4,,46]-^|%-}| + +<0.5>\ +6-61'|(3~)765^%-|7-(3~)71'2'|(3~)1'76^65\ +6.1'7_6_5_|2_--67_|6---^|%---`\ +6-61'|(3~)765^%-|7-(3~)71'2'|(3~)1'76^65\ +6.1'7_6_5_|2_--65_|1'---^|%---`\ +0-|0-|0-|0-|0-|0-|7o-^|%-`| + +<0.4>\ +4-`|5-`|5#-`|6-`|4-`|5-`|6-^|6-`\ +4-`|5-`|5#-`|6-`|4-`|5-`|6-^|6-`\ +0-|0-|0-|0-|0-|0-|0-|0-| + +<0.1>\ +4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ +4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ +4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ +4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ +0-|0-|0-|0-|0-|0-|0-|04| + +//-------------------- Section E -------------------- +<1=bG> + +<0.2>\ +1o---^|%-2o-|5o,---^|%-1o[35]7o,[35]\ +1o'351'-351'|351'3[57']7--|1o'357o-3[51'']1'|2o'75#3o'----| + +<0.1>\ +1.7,.1^|%_22_17,|1.7,.1^|%_22_[13]_2_[7,2]_1_\ +1.7,.1^|%_22_17,|1.7,.1^|%_2.17,| + +<0.5>\ +1o---^|%-2o-|5o,---^|%-1o_[35]_7,o_[35]_\ +1o---^|%-7o,-|1o.7o,.6o,|5#o,---`| + +<0.1>\ +6.%.%-%%%|6.%.%-%%%|6.%.%-%%%|6.6.61'373\ +4.%.%-%%%|4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%| + +<1.0>\ +1'71'1'---`7^|%1'75---`5|{43217,12176564543|23217,1217,6,7,12345}\ +6,1-2-321^|%--5--45|1'7-5--6-|5#-| + +<0.1>\ +6.%.%-%%%|6.%.%-%%%|6.%.%-%%%|6.6.61'575\ +4.%.%-%%%|4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%| + +//-------------------- Section F -------------------- +<1=bE> + +<1.0>\ +6,-3-|7,--6,_7,_|1.2.7,|1--3_5_\ +6.5.4|51'75|(2^)3---^|%---`\ +3-5-|2.-5#6_|7_5_3_1'_5_3_2'|1'71'6_7_\ +1'_7_6_5_6.1'_^|1'_7_6_5_6_7_3_5_|6---^|%---`\ +1-02-023b^|%-05-43b4|1#-03b-04-^|%-05-43b1#\ +1-02-023b^|%-03b-23b5|4.5.5#7b.5#.7b|5---^|%-`23| + +<0.4>\ +6---[63']1'--|[5#7]--3'[5#7]'---|[51']351'351'3'|[4#2']--3'[36]'---\ +[41']14[51']1'4'[46]'-|[25]--5[57]---|[67]36[37]-[31']3'-|[13]'3[72']3[61']3[5#7]3\ +3o3535o353|2o35#35#35#3|535351o3o5o|4#o34#[4#6]'-4#'[62']3\ +4141451o[35]'|5,o7,[25]7,[25]7,5,o[37],|2o3,6,2-3,6,2|1o3,6,[13]----\ +[1M,1]0-[25m],0-%[3,5,13]|0---3b'o05'o0|[1#m,1]0-[3bp5#],0-4o'0|0[4,5#,14]0-5o'01#o'0\ +{1'(3=)5}|5_3b_1_3b_1_5,_1_5,_3bo05o0|4o01#o0|1'0_2o0_5o|6o---| + +<0.4>\ +6'60%0%0%|5#'5#0%0%0%|5'50%0%0%|4#'4#0%0%0%\ +4'40%0%0%|5'50%0%0%|6'60%0%0%|6'60%0%0%\ +6'60%0%0%|5#'5#0%0%0%|5'50%0%0%|4#'4#0%0%0%\ +4'40%0%0%|5'50%0%0%|6'60%0%0%|060%0%0%\ +050%0%0%|05053bo55o5|05#05#0-[45#1'4']''[3673']b''|05#05#5o5#1#o5#\ +050%0%0%|05051'(3=)5---|5#(3=)1#-------|{525252522'7575252}|6o.6.6-666| + +<0.3>\ +0-|0-|0-|0-|0-|0-|3o-^|%-`\ +[36]-|[25#]-|[35]-|[24#]-|[14]-|[25]-|2o-|[13]'-`\ +1o0-2o0-2o3bo|0---5'03b'0|1#o0-3bo0-4o3bo|04o0-3bo01#o0\ +1o0-2o0-2o3bo|04o0-3bo05o0|4o0--1#o0--|1'0-2o0-5o0|6o-`| + +<0.4>\ +6-`|5#-`|5-`|4#-`|4-`|5-`|6-^|6-`\ +6-`|5#-`|5-`|4#-`|4-`|5-`|[26]'-|1'o-`\ +1o0-2o0-2o3bo|05050505|1#o0-3bo0-4o3bo|04o05#0%0%\ +1o502p052o[3bo5]|0[4o5]05o0%0%|[5#4].5#.5#1#5#5#5#|[51'].5.[52']-55o5|6o.6.6-666| + +<0.1>\ +060%0%0%|05#0%0%0%|050%0%0%|04#0%0%0%\ +040%0%0%|050%0%0%|060%0%0%|060%0%0%\ +060%0%0%|05#0%0%0%|050%0%0%|04#0%0%0%\ +040%0%0%|050%0%0%|060%0%0%|060%0%0%\ +050%0%0%|0%0%3bo55o5|05#0%0%0%|0%0%5o5#1#o5#\ +050%0%0%|0%0%3bo55o5|5#.%.%-%%%|5.%.%-%%%|6.%.%-%%%| + + diff --git a/parser.wl b/parser.wl index 492ea2e..969a263 100644 --- a/parser.wl +++ b/parser.wl @@ -335,13 +335,13 @@ parse[tokenizer_,sections_]:=Module[ (* ::Input:: *) -(*debug[#Messages]&@parse[QYS`Tokenize[path<>"Songs\\Noushyou_Sakuretsu_Garu.qys"],All]*) +(*debug[#Messages]&@parse[QYS`Tokenize[path<>"Songs\\Touhou\\Hana_ni_Kaze.qys"],All]*) (* ::Input:: *) (*AudioStop[];AudioPlay[#[[2]]]&@*) (*EchoFunction["time: ",#[[1]]&]@*) -(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\Noushyou_Sakuretsu_Garu.qys"],5]]];*) +(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\test.qys"],5]]];*) (* ::Input:: *) @@ -375,7 +375,7 @@ debug[messages_]:=Module[{output={},sectionOutput}, },True,Method->"Active"]] ], {i,Length@messages}]; - Return[Column[output]]; + If[output!={},Print[Column[output]]]; ]; diff --git a/qysToken.wl b/qysToken.wl index b8f81bd..27b3b7e 100644 --- a/qysToken.wl +++ b/qysToken.wl @@ -116,11 +116,11 @@ Tokenize[filename_]:=Module[ ]; sectionMeta={"Comments"->comments,"GlobalSettings"->trackToken}; comments={}, - AppendTo[tracks,<| (* real track *) + AppendTo[tracks,{ (* real track *) "Type"->"Track", "Contents"->trackToken, "Repeat"->0 - |>] + }] ]; score="" ], From 7fa4af55bb373e01e0af71b346622ca3851b3a25 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sat, 20 Jan 2018 21:32:12 +0800 Subject: [PATCH 39/54] Fix bug part.2 --- parser.wl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parser.wl b/parser.wl index 969a263..1b2735c 100644 --- a/parser.wl +++ b/parser.wl @@ -303,7 +303,7 @@ parse[tokenizer_,sections_]:=Module[ messages[[i,"TrackMessages"]]=ConstantArray[{},trackCount]; trackDuration={}; Do[ - trackData=trackParse[sectionToken[["Tracks",j]],settings]; + trackData=trackParse[Association@sectionToken[["Tracks",j]],settings]; AppendTo[trackDuration,trackData[["Duration"]]]; MusicClips=Join[MusicClips,<| "SoundData"->#SoundData, @@ -347,7 +347,7 @@ parse[tokenizer_,sections_]:=Module[ (* ::Input:: *) (*AudioStop[];AudioPlay[#[[2]]]&@*) (*EchoFunction["time: ",#[[1]]&]@*) -(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\Touhou\\Hana_ni_Kaze.qys"],All]]];*) +(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\Touhou\\Hana_ni_Kaze.qys"],{5,6}]]];*) debug[messages_]:=Module[{output={},sectionOutput}, From c6229fe3f1a4b30d00f8c222999848a5b8f6cfb7 Mon Sep 17 00:00:00 2001 From: NN708 Date: Sat, 20 Jan 2018 21:34:34 +0800 Subject: [PATCH 40/54] fix tonality --- Songs/Bracing_the_Chill.qym | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Songs/Bracing_the_Chill.qym b/Songs/Bracing_the_Chill.qym index e18094b..5f52004 100644 --- a/Songs/Bracing_the_Chill.qym +++ b/Songs/Bracing_the_Chill.qym @@ -2,5 +2,5 @@ //刘畅 词 //谭旋 曲 <1=G><4/4><90> -{Flute}6-6_(7^)6_5_6_|(2^)3--5_2_|(2^)3---|3-00|(5^)6-6_(7^)6_5_6_|(2^)3--5_2_|(2^)3.2__1__6,-^|6,---|7-5-|2-7,-|3---^|3-2-|7-1'-|2'--7_1'__7__|6---^|6-00||:1_1_1_7,_17,_1_^|1_1_1_7,_12_7,_^|7,_7,_7,_6,_7,6,_7,_^|7,_7,_7,_6,_7,6,_5,_|6,-00 |006,_5,3,_|5,__^2,__^3,_^3,-0|0000|1_1_1_7,_17,_1_^|1_1_1_7,_12_7,_^|7,_7,_7,_6,_7,6,_7,_^|7,_7,_7,_6,_7,_1_7,_5,_|6,-00 |006,3_2_^|2_3_^3--|0000|6,_3_3_2_3_5_3_2_|36,-0|7,_7,_7,_1_7,_3,5,_|6,_^5,.-0|6,_3_3_2_3_2_3_5_^|5_3.0_2_3_5_|5_^6.6.5_^|5_6_^6-0|6,_3_3_2_3_5_3_2_|36,-0|7,_7,_7,_1_7,_3,5,_|6,_^5,.-0|6,_3_3_2_3_2_3_5_|1'_7_6_5_35|635_3_5_6_|[1.]6-00|6.5_3_5.^|5-3_2_^1_7,_|1--0|3'_2'_3'_2'_7-|3'_2'_3'_2'_6-|4'-5'-|7,_7,_7,7,(3)7,_7,_7,_|7,_7,_7,(3)7,_1_2_(3)3_2_1_|7'_6'_3'5'_4'.|4'_3'_2'_1'_7-|#5---:||[2.]6--- |b7_6543_^|357-|#1'---|<1=A'>6,_3_3_2_3_5_3_2_|36,-0|7,_7,_7,_1_7,_3,5,_|6,_^5,.-0|6,_3_3_2_3_2_3_5_^|5_3.0_2_3_5_|5_^6.6.5_^|5_6_^6-0|6,_3_3_2_3_5_3_2_|36,-0|7,_7,_7,_1_7,_3,5,_|6,_^5,.-0|6,_3_3_2_3_2_3_5_|1'_7_6_5_35|635_3_5_6_^|6---|0000|3.2_(.)7,3__^2__^1__^7,__|1---^|1--0|| -{Flute}0000 |0000 |0000 |0000|0000 |0000 |0000 |0000 |0000|0000 |0000 |0000|0000 |0000 |0000 |0000||:0000 |0000 |0000 |0000 |06,_5,_6,-|0000 |0000 |0000|0000 |0000 |0000 |0000 |001_7,_5,_6,_^|6,-00 |0000 |0000|0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |[1.]0000|0000 |001'_7_^6_5_|6--0|0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 :||[2.]4'_3'2'1'b7_|0000 |0000|0000 |<1=A'>0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000|0000|6.5_(.)31'__^7__^7__^5__ |6---^|6--0|| \ No newline at end of file +{Flute}6-6_(7^)6_5_6_|(2^)3--5_2_|(2^)3---|3-00|(5^)6-6_(7^)6_5_6_|(2^)3--5_2_|(2^)3.2__1__6,-^|6,---|7-5-|2-7,-|3---^|3-2-|7-1'-|2'--7_1'__7__|6---^|6-00||:1_1_1_7,_17,_1_^|1_1_1_7,_12_7,_^|7,_7,_7,_6,_7,6,_7,_^|7,_7,_7,_6,_7,6,_5,_|6,-00 |006,_5,3,_|5,__^2,__^3,_^3,-0|0000|1_1_1_7,_17,_1_^|1_1_1_7,_12_7,_^|7,_7,_7,_6,_7,6,_7,_^|7,_7,_7,_6,_7,_1_7,_5,_|6,-00 |006,3_2_^|2_3_^3--|0000|6,_3_3_2_3_5_3_2_|36,-0|7,_7,_7,_1_7,_3,5,_|6,_^5,.-0|6,_3_3_2_3_2_3_5_^|5_3.0_2_3_5_|5_^6.6.5_^|5_6_^6-0|6,_3_3_2_3_5_3_2_|36,-0|7,_7,_7,_1_7,_3,5,_|6,_^5,.-0|6,_3_3_2_3_2_3_5_|1'_7_6_5_35|635_3_5_6_|[1.]6-00|6.5_3_5.^|5-3_2_^1_7,_|1--0|3'_2'_3'_2'_7-|3'_2'_3'_2'_6-|4'-5'-|7,_7,_7,7,(3)7,_7,_7,_|7,_7,_7,(3)7,_1_2_(3)3_2_1_|7'_6'_3'5'_4'.|4'_3'_2'_1'_7-|#5---:||[2.]6--- |b7_6543_^|357-|#1'---|<1=A>6,_3_3_2_3_5_3_2_|36,-0|7,_7,_7,_1_7,_3,5,_|6,_^5,.-0|6,_3_3_2_3_2_3_5_^|5_3.0_2_3_5_|5_^6.6.5_^|5_6_^6-0|6,_3_3_2_3_5_3_2_|36,-0|7,_7,_7,_1_7,_3,5,_|6,_^5,.-0|6,_3_3_2_3_2_3_5_|1'_7_6_5_35|635_3_5_6_^|6---|0000|3.2_(.)7,3__^2__^1__^7,__|1---^|1--0|| +{Flute}0000 |0000 |0000 |0000|0000 |0000 |0000 |0000 |0000|0000 |0000 |0000|0000 |0000 |0000 |0000||:0000 |0000 |0000 |0000 |06,_5,_6,-|0000 |0000 |0000|0000 |0000 |0000 |0000 |001_7,_5,_6,_^|6,-00 |0000 |0000|0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |[1.]0000|0000 |001'_7_^6_5_|6--0|0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 :||[2.]4'_3'2'1'b7_|0000 |0000|0000 |<1=A>0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000 |0000|0000|6.5_(.)31'__^7__^7__^5__ |6---^|6--0|| \ No newline at end of file From 924587b2bd98500abb8d95aba444a1c87ea69c60 Mon Sep 17 00:00:00 2001 From: NN708 Date: Sat, 20 Jan 2018 21:38:34 +0800 Subject: [PATCH 41/54] fix volume --- qymToken.wl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qymToken.wl b/qymToken.wl index 32de99b..a0c5c63 100644 --- a/qymToken.wl +++ b/qymToken.wl @@ -96,7 +96,7 @@ trackTokenizer[track_]:=StringCases[track,{ "Type"->"FunctionToken", "Simplified"->True, "Argument"->{ - "Volume"->ToExpression[volume] + "Volume"->ToExpression[volume]/100 } }, (* Instrument *) From bfa54fcb6757996de35570d9c58af4bdbed74c40 Mon Sep 17 00:00:00 2001 From: NN708 Date: Sat, 20 Jan 2018 22:03:52 +0800 Subject: [PATCH 42/54] fix vol & instr --- qymToken.wl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qymToken.wl b/qymToken.wl index a0c5c63..c9c4040 100644 --- a/qymToken.wl +++ b/qymToken.wl @@ -96,7 +96,7 @@ trackTokenizer[track_]:=StringCases[track,{ "Type"->"FunctionToken", "Simplified"->True, "Argument"->{ - "Volume"->ToExpression[volume]/100 + "Volume"->{ToExpression[volume]/100} } }, (* Instrument *) @@ -104,7 +104,7 @@ trackTokenizer[track_]:=StringCases[track,{ "Type"->"FunctionToken", "Simplified"->True, "Argument"->{ - "Instr"->instr + "Instr"->{instr} } }, (* Tuplet *) From 5eed742387a05b176ab395064e94edbe2f9f7e1b Mon Sep 17 00:00:00 2001 From: NN708 Date: Sat, 20 Jan 2018 22:41:52 +0800 Subject: [PATCH 43/54] New Song: Diving Girl --- Meta/Diving_Girl.meta | 6 ++++++ Songs/Diving_Girl.qym | 14 ++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 Meta/Diving_Girl.meta create mode 100644 Songs/Diving_Girl.qym diff --git a/Meta/Diving_Girl.meta b/Meta/Diving_Girl.meta new file mode 100644 index 0000000..8f7ebf3 --- /dev/null +++ b/Meta/Diving_Girl.meta @@ -0,0 +1,6 @@ +Format: qym; +TrackCount: 1; +Duration: 58.66666667; +Instruments: {"ElectricGuitar"}; +SongName: 潜海姑娘; +Composer: 王立平; \ No newline at end of file diff --git a/Songs/Diving_Girl.qym b/Songs/Diving_Girl.qym new file mode 100644 index 0000000..2f5359f --- /dev/null +++ b/Songs/Diving_Girl.qym @@ -0,0 +1,14 @@ +//潜海姑娘 +//王立平 曲 +<1=C><4/4><90> +{ElectricGuitar}5,|3--5_^6_|33_^2_1.3_|2_.^3__2_1_6,^6,__^1__^2__^1__|2--5,| + +{ElectricGuitar}3--5_^6_|33_^2_1.3_|2_.^3__2_1_5,.^2_|1--3__^5__^6__^5__| + +{ElectricGuitar}6--1'_^6_|5.^3_53_^5_|6-1'^6_^3_|2--5,| + +{ElectricGuitar}3--5_^6_|3_0_3_^2_1.3_|2_^3_2_^1_6,6,__^1__^2__^1__|2--2_3_| + +{ElectricGuitar}53_^1'_5_^6_6_5_|33_^2_1.3_|2_.^3__2_1_5,.^2_|1--^1_3_| + +{ElectricGuitar}2_.^3__2_1_5,.^2_|1--|| \ No newline at end of file From f2140d1345acf7ac2e8901d367c4c85e8b96a3ec Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sun, 21 Jan 2018 00:58:19 +0800 Subject: [PATCH 44/54] Transfer meta to json --- Lang/chs.json | 1 + Meta/Anima.json | 13 ++ Meta/Anima.meta | 8 - Meta/Banana.json | 13 ++ Meta/Banana.meta | 6 - Meta/Bracing_the_Chill.json | 13 ++ Meta/Bracing_the_Chill.meta | 8 - Meta/Diving_Girl.meta | 6 - Meta/El_Pollito_Pio.json | 13 ++ Meta/El_Pollito_Pio.meta | 7 - Meta/Gate_of_Steiner.json | 13 ++ Meta/Gate_of_Steiner.meta | 7 - Meta/Hana_no_Ko_Lunlun.json | 13 ++ Meta/Hana_no_Ko_Lunlun.meta | 10 - Meta/If_You_Were_By_My_Side.json | 13 ++ Meta/If_You_Were_By_My_Side.meta | 6 - Meta/Kaze_No_Sumu_Machi.json | 13 ++ Meta/Kaze_No_Sumu_Machi.meta | 6 - Meta/Lonely_Night.json | 13 ++ Meta/Lonely_Night.meta | 7 - Meta/March_of_the_Volunteers.json | 13 ++ Meta/March_of_the_Volunteers.meta | 8 - Meta/NCU_School_Song.json | 13 ++ Meta/NCU_School_Song.meta | 9 - Meta/NSFZ_School_Song.json | 13 ++ Meta/NSFZ_School_Song.meta | 6 - Meta/Nagisa.json | 13 ++ Meta/Nagisa.meta | 7 - Meta/Noushyou_Sakuretsu_Garu.json | 13 ++ Meta/Noushyou_Sakuretsu_Garu.meta | 9 - Meta/Numb.json | 13 ++ Meta/Numb.meta | 7 - Meta/Nyan_Cat.json | 13 ++ Meta/Nyan_Cat.meta | 8 - Meta/Onaji_Takami_he.json | 13 ++ Meta/Onaji_Takami_he.meta | 8 - Meta/Oriental_Pearl.json | 13 ++ Meta/Oriental_Pearl.meta | 8 - Meta/Rainbow.json | 13 ++ Meta/Rainbow.meta | 7 - Meta/Red_Star_Song.json | 13 ++ Meta/Red_Star_Song.meta | 9 - Meta/Shionari.json | 13 ++ Meta/Shionari.meta | 8 - Meta/Socialism_is_Good.json | 13 ++ Meta/Socialism_is_Good.meta | 7 - Meta/Sora_ni_Hikaru.json | 13 ++ Meta/Sora_ni_Hikaru.meta | 9 - Meta/Sunny_Light.json | 13 ++ Meta/Sunny_Light.meta | 7 - Meta/Telegrapher.json | 13 ++ Meta/Telegrapher.meta | 7 - Meta/The_East_is_Red.json | 13 ++ Meta/The_East_is_Red.meta | 7 - Meta/The_Internationale.json | 13 ++ Meta/The_Internationale.meta | 7 - Meta/Touhou/Dark_Side_of_Fate.json | 13 ++ Meta/Touhou/Dark_Side_of_Fate.meta | 9 - Meta/Touhou/Dream_Battle.json | 13 ++ Meta/Touhou/Dream_Battle.meta | 9 - Meta/Touhou/Houkainohi.json | 13 ++ Meta/Touhou/Houkainohi.meta | 9 - Meta/Touhou/Necro_Fantasia.json | 13 ++ Meta/Touhou/Necro_Fantasia.meta | 10 - Meta/Touhou/Phantom_Ensemble.json | 13 ++ Meta/Touhou/Phantom_Ensemble.meta | 9 - Meta/Touhou/Sumizome_Sakura.json | 13 ++ Meta/Touhou/Sumizome_Sakura.meta | 9 - .../Hartmann_No_Youkai_Otome.json | 13 ++ .../Hartmann_No_Youkai_Otome.meta | 10 - .../Touhou/TH11-Chireiden/Nuclear_Fusion.json | 13 ++ .../Touhou/TH11-Chireiden/Nuclear_Fusion.meta | 11 - .../TH11-Chireiden/Ryokugann_No_Jealousy.json | 13 ++ .../TH11-Chireiden/Ryokugann_No_Jealousy.meta | 9 - Meta/Touhou/TH11-Chireiden/Taeta_Hashi.json | 13 ++ Meta/Touhou/TH11-Chireiden/Taeta_Hashi.meta | 10 - Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.json | 13 ++ Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.meta | 9 - .../Touhou/TH15-Kanjuden/Eien_no_Shyunmu.json | 13 ++ .../Touhou/TH15-Kanjuden/Eien_no_Shyunmu.meta | 11 - Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.json | 13 ++ Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.meta | 9 - .../Gyakutensuru_Wheel_of_Fortune.json | 13 ++ .../Gyakutensuru_Wheel_of_Fortune.meta | 10 - .../Haruka_38Man_Kilo_Voyage.json | 13 ++ .../Haruka_38Man_Kilo_Voyage.meta | 9 - .../Kokyou_Hoshi_Utsuru_Umi.json | 13 ++ .../Kokyou_Hoshi_Utsuru_Umi.meta | 9 - .../Koori_Tsuita_Eien_no_Miyako.json | 13 ++ .../Koori_Tsuita_Eien_no_Miyako.meta | 9 - .../TH15-Kanjuden/Kyuugatsu_no_Pumpkin.json | 13 ++ .../TH15-Kanjuden/Kyuugatsu_no_Pumpkin.meta | 10 - Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.json | 13 ++ Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.meta | 9 - .../TH15-Kanjuden/Pandemonic_Planet.json | 13 ++ .../TH15-Kanjuden/Pandemonic_Planet.meta | 10 - Meta/Touhou/TH15-Kanjuden/Pure_Furies.json | 13 ++ Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta | 10 - .../TH15-Kanjuden/Seijyouki_no_Pierrot.json | 13 ++ .../TH15-Kanjuden/Seijyouki_no_Pierrot.meta | 10 - .../TH15-Kanjuden/Usagi_ha_Mai_Orita.json | 13 ++ .../TH15-Kanjuden/Usagi_ha_Mai_Orita.meta | 10 - Meta/Touhou/TH15-Kanjuden/Wasuregataki.json | 13 ++ Meta/Touhou/TH15-Kanjuden/Wasuregataki.meta | 9 - Meta/Touhou/Tenkuu_Hana_Miyako.json | 13 ++ Meta/Touhou/Tenkuu_Hana_Miyako.meta | 9 - Meta/Touhou/Touhou_Mix_1.json | 13 ++ Meta/Touhou/Touhou_Mix_1.meta | 9 - QYMP.wl | 176 +++++---------- interface.wl | 51 +++-- library.wl | 201 +++++++++++------- 111 files changed, 892 insertions(+), 682 deletions(-) create mode 100644 Meta/Anima.json delete mode 100644 Meta/Anima.meta create mode 100644 Meta/Banana.json delete mode 100644 Meta/Banana.meta create mode 100644 Meta/Bracing_the_Chill.json delete mode 100644 Meta/Bracing_the_Chill.meta delete mode 100644 Meta/Diving_Girl.meta create mode 100644 Meta/El_Pollito_Pio.json delete mode 100644 Meta/El_Pollito_Pio.meta create mode 100644 Meta/Gate_of_Steiner.json delete mode 100644 Meta/Gate_of_Steiner.meta create mode 100644 Meta/Hana_no_Ko_Lunlun.json delete mode 100644 Meta/Hana_no_Ko_Lunlun.meta create mode 100644 Meta/If_You_Were_By_My_Side.json delete mode 100644 Meta/If_You_Were_By_My_Side.meta create mode 100644 Meta/Kaze_No_Sumu_Machi.json delete mode 100644 Meta/Kaze_No_Sumu_Machi.meta create mode 100644 Meta/Lonely_Night.json delete mode 100644 Meta/Lonely_Night.meta create mode 100644 Meta/March_of_the_Volunteers.json delete mode 100644 Meta/March_of_the_Volunteers.meta create mode 100644 Meta/NCU_School_Song.json delete mode 100644 Meta/NCU_School_Song.meta create mode 100644 Meta/NSFZ_School_Song.json delete mode 100644 Meta/NSFZ_School_Song.meta create mode 100644 Meta/Nagisa.json delete mode 100644 Meta/Nagisa.meta create mode 100644 Meta/Noushyou_Sakuretsu_Garu.json delete mode 100644 Meta/Noushyou_Sakuretsu_Garu.meta create mode 100644 Meta/Numb.json delete mode 100644 Meta/Numb.meta create mode 100644 Meta/Nyan_Cat.json delete mode 100644 Meta/Nyan_Cat.meta create mode 100644 Meta/Onaji_Takami_he.json delete mode 100644 Meta/Onaji_Takami_he.meta create mode 100644 Meta/Oriental_Pearl.json delete mode 100644 Meta/Oriental_Pearl.meta create mode 100644 Meta/Rainbow.json delete mode 100644 Meta/Rainbow.meta create mode 100644 Meta/Red_Star_Song.json delete mode 100644 Meta/Red_Star_Song.meta create mode 100644 Meta/Shionari.json delete mode 100644 Meta/Shionari.meta create mode 100644 Meta/Socialism_is_Good.json delete mode 100644 Meta/Socialism_is_Good.meta create mode 100644 Meta/Sora_ni_Hikaru.json delete mode 100644 Meta/Sora_ni_Hikaru.meta create mode 100644 Meta/Sunny_Light.json delete mode 100644 Meta/Sunny_Light.meta create mode 100644 Meta/Telegrapher.json delete mode 100644 Meta/Telegrapher.meta create mode 100644 Meta/The_East_is_Red.json delete mode 100644 Meta/The_East_is_Red.meta create mode 100644 Meta/The_Internationale.json delete mode 100644 Meta/The_Internationale.meta create mode 100644 Meta/Touhou/Dark_Side_of_Fate.json delete mode 100644 Meta/Touhou/Dark_Side_of_Fate.meta create mode 100644 Meta/Touhou/Dream_Battle.json delete mode 100644 Meta/Touhou/Dream_Battle.meta create mode 100644 Meta/Touhou/Houkainohi.json delete mode 100644 Meta/Touhou/Houkainohi.meta create mode 100644 Meta/Touhou/Necro_Fantasia.json delete mode 100644 Meta/Touhou/Necro_Fantasia.meta create mode 100644 Meta/Touhou/Phantom_Ensemble.json delete mode 100644 Meta/Touhou/Phantom_Ensemble.meta create mode 100644 Meta/Touhou/Sumizome_Sakura.json delete mode 100644 Meta/Touhou/Sumizome_Sakura.meta create mode 100644 Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.json delete mode 100644 Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta create mode 100644 Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.json delete mode 100644 Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta create mode 100644 Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.json delete mode 100644 Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta create mode 100644 Meta/Touhou/TH11-Chireiden/Taeta_Hashi.json delete mode 100644 Meta/Touhou/TH11-Chireiden/Taeta_Hashi.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Pure_Furies.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.meta create mode 100644 Meta/Touhou/TH15-Kanjuden/Wasuregataki.json delete mode 100644 Meta/Touhou/TH15-Kanjuden/Wasuregataki.meta create mode 100644 Meta/Touhou/Tenkuu_Hana_Miyako.json delete mode 100644 Meta/Touhou/Tenkuu_Hana_Miyako.meta create mode 100644 Meta/Touhou/Touhou_Mix_1.json delete mode 100644 Meta/Touhou/Touhou_Mix_1.meta diff --git a/Lang/chs.json b/Lang/chs.json index cf22ceb..83aa86d 100644 --- a/Lang/chs.json +++ b/Lang/chs.json @@ -7,6 +7,7 @@ "Adapter": "改编", "Comment": "备注", "Abstract": "摘要", + "Origin": "原曲", "Format": "格式", "TrackCount": "音轨数", "Duration": "时长", diff --git a/Meta/Anima.json b/Meta/Anima.json new file mode 100644 index 0000000..dafc88f --- /dev/null +++ b/Meta/Anima.json @@ -0,0 +1,13 @@ +{ + "SongName": "ANiMA", + "Lyricist": "", + "Composer": "xi", + "Adapter": "", + "Comment": "", + "Abstract": "《deemo》游戏配曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Anima.meta b/Meta/Anima.meta deleted file mode 100644 index 8aeef49..0000000 --- a/Meta/Anima.meta +++ /dev/null @@ -1,8 +0,0 @@ -Format: qys; -TrackCount: 4; -Duration: 10320/91; -Instruments: {"BrightPiano", "Piano"}; -Messages: ; -SongName: ANiMA; -Composer: xi; -Abstract: 《deemo》游戏配曲; \ No newline at end of file diff --git a/Meta/Banana.json b/Meta/Banana.json new file mode 100644 index 0000000..3f14ae8 --- /dev/null +++ b/Meta/Banana.json @@ -0,0 +1,13 @@ +{ + "SongName": "Banana", + "Lyricist": "", + "Composer": "", + "Adapter": "", + "Comment": "Minion Song", + "Abstract": "", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Banana.meta b/Meta/Banana.meta deleted file mode 100644 index fbddf13..0000000 --- a/Meta/Banana.meta +++ /dev/null @@ -1,6 +0,0 @@ -SongName: Banana; -Format: qys; -Comment: Minion Song; -TrackCount: 4; -Duration: 34.1333; -Instruments: {"Violin"}; \ No newline at end of file diff --git a/Meta/Bracing_the_Chill.json b/Meta/Bracing_the_Chill.json new file mode 100644 index 0000000..1609260 --- /dev/null +++ b/Meta/Bracing_the_Chill.json @@ -0,0 +1,13 @@ +{ + "SongName": "凉凉", + "Lyricist": "刘畅", + "Composer": "谭旋", + "Adapter": "", + "Comment": "", + "Abstract": "电视剧《三生三世十里桃花》片尾曲", + "Image": "", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Bracing_the_Chill.meta b/Meta/Bracing_the_Chill.meta deleted file mode 100644 index c0cd2cd..0000000 --- a/Meta/Bracing_the_Chill.meta +++ /dev/null @@ -1,8 +0,0 @@ -Format: qym; -TrackCount: 2; -Duration: 303.7750566893424; -Instruments: {"Flute"}; -SongName: 凉凉; -Lyricist: 刘畅; -Composer: 谭旋; -Abstract: 电视剧《三生三世十里桃花》片尾曲; \ No newline at end of file diff --git a/Meta/Diving_Girl.meta b/Meta/Diving_Girl.meta deleted file mode 100644 index 8f7ebf3..0000000 --- a/Meta/Diving_Girl.meta +++ /dev/null @@ -1,6 +0,0 @@ -Format: qym; -TrackCount: 1; -Duration: 58.66666667; -Instruments: {"ElectricGuitar"}; -SongName: 潜海姑娘; -Composer: 王立平; \ No newline at end of file diff --git a/Meta/El_Pollito_Pio.json b/Meta/El_Pollito_Pio.json new file mode 100644 index 0000000..62d12c1 --- /dev/null +++ b/Meta/El_Pollito_Pio.json @@ -0,0 +1,13 @@ +{ + "SongName": "小鸡哔哔", + "Lyricist": "", + "Composer": "", + "Adapter": "", + "Comment": "El Pollito Pio", + "Abstract": "", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/El_Pollito_Pio.meta b/Meta/El_Pollito_Pio.meta deleted file mode 100644 index d87f9bf..0000000 --- a/Meta/El_Pollito_Pio.meta +++ /dev/null @@ -1,7 +0,0 @@ -Format: qys; -TrackCount: 6; -Duration: 243559/1518; -Instruments: {"ElectricBass", "ElectricPiano"}; -Messages: ; -SongName: 小鸡哔哔; -Comment: El Pollito Pio; \ No newline at end of file diff --git a/Meta/Gate_of_Steiner.json b/Meta/Gate_of_Steiner.json new file mode 100644 index 0000000..109af15 --- /dev/null +++ b/Meta/Gate_of_Steiner.json @@ -0,0 +1,13 @@ +{ + "SongName": "Gate of Steiner", + "Lyricist": "", + "Composer": "阿保剛", + "Adapter": "", + "Comment": "", + "Abstract": "《命运石之门》插曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Gate_of_Steiner.meta b/Meta/Gate_of_Steiner.meta deleted file mode 100644 index 5a197b4..0000000 --- a/Meta/Gate_of_Steiner.meta +++ /dev/null @@ -1,7 +0,0 @@ -Format: qys; -TrackCount: 8; -Duration: 700/3; -Instruments: {"Piano", "Viola"}; -SongName: Gate of Steiner; -Composer: 阿保剛; -Abstract: 《命运石之门》插曲; \ No newline at end of file diff --git a/Meta/Hana_no_Ko_Lunlun.json b/Meta/Hana_no_Ko_Lunlun.json new file mode 100644 index 0000000..fe550b8 --- /dev/null +++ b/Meta/Hana_no_Ko_Lunlun.json @@ -0,0 +1,13 @@ +{ + "SongName": "花仙子之歌", + "Lyricist": "千家和也", + "Composer": "小林亜星", + "Adapter": "", + "Comment": "花の子ルンルン", + "Abstract": "动画片《花仙子》主题曲", + "Image": "Lulu.jpg", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Hana_no_Ko_Lunlun.meta b/Meta/Hana_no_Ko_Lunlun.meta deleted file mode 100644 index 3ee8577..0000000 --- a/Meta/Hana_no_Ko_Lunlun.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qym; -TrackCount: 3; -Duration: 66.6492; -Instruments: {}; -Image: Lulu.jpg; -SongName: 花仙子之歌; -Lyricist: 千家和也; -Composer: 小林亜星; -Comment: 花の子ルンルン; -Abstract: 动画片《花仙子》主题曲; \ No newline at end of file diff --git a/Meta/If_You_Were_By_My_Side.json b/Meta/If_You_Were_By_My_Side.json new file mode 100644 index 0000000..ccee0ea --- /dev/null +++ b/Meta/If_You_Were_By_My_Side.json @@ -0,0 +1,13 @@ +{ + "SongName": "橘色温度", + "Lyricist": "", + "Composer": "何真真", + "Adapter": "", + "Comment": "", + "Abstract": "", + "Image": "", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/If_You_Were_By_My_Side.meta b/Meta/If_You_Were_By_My_Side.meta deleted file mode 100644 index 918c022..0000000 --- a/Meta/If_You_Were_By_My_Side.meta +++ /dev/null @@ -1,6 +0,0 @@ -Format: qym; -TrackCount: 3; -Duration: 205.822; -Instruments: {"Piano"}; -SongName: 橘色温度; -Composer: 何真真; \ No newline at end of file diff --git a/Meta/Kaze_No_Sumu_Machi.json b/Meta/Kaze_No_Sumu_Machi.json new file mode 100644 index 0000000..18fccf0 --- /dev/null +++ b/Meta/Kaze_No_Sumu_Machi.json @@ -0,0 +1,13 @@ +{ + "SongName": "风居住的街道", + "Lyricist": "", + "Composer": "矶村由纪子", + "Adapter": "", + "Comment": "", + "Abstract": "", + "Image": "", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Kaze_No_Sumu_Machi.meta b/Meta/Kaze_No_Sumu_Machi.meta deleted file mode 100644 index 5595e2c..0000000 --- a/Meta/Kaze_No_Sumu_Machi.meta +++ /dev/null @@ -1,6 +0,0 @@ -SongName: 风居住的街道; -Format: qym; -Composer: 矶村由纪子; -TrackCount: 1; -Duration: 281.961; -Instruments: {}; \ No newline at end of file diff --git a/Meta/Lonely_Night.json b/Meta/Lonely_Night.json new file mode 100644 index 0000000..2502ab1 --- /dev/null +++ b/Meta/Lonely_Night.json @@ -0,0 +1,13 @@ +{ + "SongName": "寂寞之夜", + "Lyricist": "", + "Composer": "三輪学", + "Adapter": "", + "Comment": "寂しい夜", + "Abstract": "", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Lonely_Night.meta b/Meta/Lonely_Night.meta deleted file mode 100644 index dc955c2..0000000 --- a/Meta/Lonely_Night.meta +++ /dev/null @@ -1,7 +0,0 @@ -Format: qys; -TrackCount: 3; -Duration: 236.263; -Instruments: {"Cello", "Harp", "Piano"}; -SongName: 寂寞之夜; -Composer: 三輪学; -Comment: 寂しい夜; \ No newline at end of file diff --git a/Meta/March_of_the_Volunteers.json b/Meta/March_of_the_Volunteers.json new file mode 100644 index 0000000..8b05b2f --- /dev/null +++ b/Meta/March_of_the_Volunteers.json @@ -0,0 +1,13 @@ +{ + "SongName": "义勇军进行曲", + "Lyricist": "田汉", + "Composer": "聂耳", + "Adapter": "", + "Comment": "中华人民共和国国歌", + "Abstract": "", + "Image": "", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/March_of_the_Volunteers.meta b/Meta/March_of_the_Volunteers.meta deleted file mode 100644 index b14acb9..0000000 --- a/Meta/March_of_the_Volunteers.meta +++ /dev/null @@ -1,8 +0,0 @@ -SongName: 义勇军进行曲; -Format: qym; -Comment: 中华人民共和国国歌; -Composer: 聂耳; -Lyricist: 田汉; -TrackCount: 1; -Duration: 47.6464; -Instruments: {}; \ No newline at end of file diff --git a/Meta/NCU_School_Song.json b/Meta/NCU_School_Song.json new file mode 100644 index 0000000..332aa4e --- /dev/null +++ b/Meta/NCU_School_Song.json @@ -0,0 +1,13 @@ +{ + "SongName": "襟江枕海甲东南", + "Lyricist": "汪东", + "Composer": "程懋筠", + "Adapter": "", + "Comment": "中央大学校歌", + "Abstract": "", + "Image": "NCU.png", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/NCU_School_Song.meta b/Meta/NCU_School_Song.meta deleted file mode 100644 index 437c64c..0000000 --- a/Meta/NCU_School_Song.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qym; -TrackCount: 2; -Duration: 57.748027210884345; -Instruments: {}; -Image: NCU.png; -SongName: 襟江枕海甲东南; -Lyricist: 汪东; -Composer: 程懋筠; -Comment: 中央大学校歌; \ No newline at end of file diff --git a/Meta/NSFZ_School_Song.json b/Meta/NSFZ_School_Song.json new file mode 100644 index 0000000..d20727f --- /dev/null +++ b/Meta/NSFZ_School_Song.json @@ -0,0 +1,13 @@ +{ + "SongName": "南师附中校歌", + "Lyricist": "柳诒徵", + "Composer": "", + "Adapter": "", + "Comment": "", + "Abstract": "", + "Image": "", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/NSFZ_School_Song.meta b/Meta/NSFZ_School_Song.meta deleted file mode 100644 index d4dea31..0000000 --- a/Meta/NSFZ_School_Song.meta +++ /dev/null @@ -1,6 +0,0 @@ -SongName: 南师附中校歌; -Format: qym; -Lyricist: 柳诒徵; -TrackCount: 1; -Duration: 51.8036`; -Instruments: {}; \ No newline at end of file diff --git a/Meta/Nagisa.json b/Meta/Nagisa.json new file mode 100644 index 0000000..9f9d978 --- /dev/null +++ b/Meta/Nagisa.json @@ -0,0 +1,13 @@ +{ + "SongName": "渚", + "Lyricist": "", + "Composer": "麻枝准", + "Adapter": "", + "Comment": "", + "Abstract": "《Clannad》插曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Nagisa.meta b/Meta/Nagisa.meta deleted file mode 100644 index 6c28995..0000000 --- a/Meta/Nagisa.meta +++ /dev/null @@ -1,7 +0,0 @@ -Format: qys; -TrackCount: 6; -Duration: 96; -Instruments: {"Harp", "Strings"}; -SongName: 渚; -Composer: 麻枝准; -Abstract: 《Clannad》插曲; \ No newline at end of file diff --git a/Meta/Noushyou_Sakuretsu_Garu.json b/Meta/Noushyou_Sakuretsu_Garu.json new file mode 100644 index 0000000..92a6b27 --- /dev/null +++ b/Meta/Noushyou_Sakuretsu_Garu.json @@ -0,0 +1,13 @@ +{ + "SongName": "脑浆炸裂少女", + "Lyricist": "れるりり", + "Composer": "れるりり", + "Adapter": "Shigma", + "Comment": "脳浆炸裂ガール", + "Abstract": "", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Noushyou_Sakuretsu_Garu.meta b/Meta/Noushyou_Sakuretsu_Garu.meta deleted file mode 100644 index 5ea9d8b..0000000 --- a/Meta/Noushyou_Sakuretsu_Garu.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 50; -Duration: 976/5; -Instruments: {"Bass", "BassDrum", "Clarinet", "ElectricBass", "ElectricGrandPiano", "ElectricGuitar", "ElectricPiano", "ElectricSnare", "Flute", "HiHatClosed", "HiHatPedal", "Oboe", "PanFlute", "Piano", "RideCymbal", "Snare", "Strings", "Viola"}; -SongName: 脑浆炸裂少女; -Lyricist: れるりり; -Composer: れるりり; -Adapter: Shigma; -Comment: 脳浆炸裂ガール; \ No newline at end of file diff --git a/Meta/Numb.json b/Meta/Numb.json new file mode 100644 index 0000000..2534852 --- /dev/null +++ b/Meta/Numb.json @@ -0,0 +1,13 @@ +{ + "Format": "qys", + "SongName": "Numb", + "Uploader": "", + "Lyricist": "Linkin Park", + "Composer": "Linkin Park", + "Adapter": "", + "Comment": "", + "Abstract": "", + "Tags": [], + "Image": "", + "Origin": "" +} \ No newline at end of file diff --git a/Meta/Numb.meta b/Meta/Numb.meta deleted file mode 100644 index 441e393..0000000 --- a/Meta/Numb.meta +++ /dev/null @@ -1,7 +0,0 @@ -Format: qys; -SongName: Numb; -Lyricist: Linkin Park; -Composer: Linkin Park; -TrackCount: 2; -Duration: 162.273; -Instruments: {"Flute", "Piano"}; \ No newline at end of file diff --git a/Meta/Nyan_Cat.json b/Meta/Nyan_Cat.json new file mode 100644 index 0000000..25e71a8 --- /dev/null +++ b/Meta/Nyan_Cat.json @@ -0,0 +1,13 @@ +{ + "SongName": "彩虹猫", + "Lyricist": "", + "Composer": "daniwellP", + "Adapter": "", + "Comment": "Nyan cat", + "Abstract": "", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Nyan_Cat.meta b/Meta/Nyan_Cat.meta deleted file mode 100644 index 3852fbf..0000000 --- a/Meta/Nyan_Cat.meta +++ /dev/null @@ -1,8 +0,0 @@ -Format: qys; -TrackCount: 4; -Duration: 7920/71; -Instruments: {"ElectricBass", "ElectricPiano"}; -Messages: ; -SongName: 彩虹猫; -Composer: daniwellP; -Comment: Nyan cat; \ No newline at end of file diff --git a/Meta/Onaji_Takami_he.json b/Meta/Onaji_Takami_he.json new file mode 100644 index 0000000..97b7084 --- /dev/null +++ b/Meta/Onaji_Takami_he.json @@ -0,0 +1,13 @@ +{ + "SongName": "向着同一高度", + "Lyricist": "", + "Composer": "鷹石忍", + "Adapter": "", + "Comment": "同じ高みへ", + "Abstract": "", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Onaji_Takami_he.meta b/Meta/Onaji_Takami_he.meta deleted file mode 100644 index fb8541d..0000000 --- a/Meta/Onaji_Takami_he.meta +++ /dev/null @@ -1,8 +0,0 @@ -Format: qys; -TrackCount: 6; -Duration: 116; -Instruments: {"BrightPiano", "Piano"}; -Messages: ; -SongName: 向着同一高度; -Composer: 鷹石忍; -Comment: 同じ高みへ; \ No newline at end of file diff --git a/Meta/Oriental_Pearl.json b/Meta/Oriental_Pearl.json new file mode 100644 index 0000000..a97d1e1 --- /dev/null +++ b/Meta/Oriental_Pearl.json @@ -0,0 +1,13 @@ +{ + "SongName": "东方之珠", + "Lyricist": "郑国江", + "Composer": "顾嘉辉", + "Adapter": "", + "Comment": "主歌部分", + "Abstract": "", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Oriental_Pearl.meta b/Meta/Oriental_Pearl.meta deleted file mode 100644 index 3085de8..0000000 --- a/Meta/Oriental_Pearl.meta +++ /dev/null @@ -1,8 +0,0 @@ -SongName: 东方之珠; -Format: qys; -Comment: 主歌部分; -Composer: 顾嘉辉; -Lyricist: 郑国江; -TrackCount: 5; -Duration: 92.5431; -Instruments: {"Violin", "Voice", "VoiceAahs"}; \ No newline at end of file diff --git a/Meta/Rainbow.json b/Meta/Rainbow.json new file mode 100644 index 0000000..d327343 --- /dev/null +++ b/Meta/Rainbow.json @@ -0,0 +1,13 @@ +{ + "SongName": "彩虹", + "Lyricist": "周杰伦", + "Composer": "周杰伦", + "Adapter": "", + "Comment": "", + "Abstract": "", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Rainbow.meta b/Meta/Rainbow.meta deleted file mode 100644 index 6cfe529..0000000 --- a/Meta/Rainbow.meta +++ /dev/null @@ -1,7 +0,0 @@ -Format: qys; -TrackCount: 6; -Duration: 240; -Instruments: {"Guitar", "Oboe", "Piano"}; -SongName: 彩虹; -Lyricist: 周杰伦; -Composer: 周杰伦; \ No newline at end of file diff --git a/Meta/Red_Star_Song.json b/Meta/Red_Star_Song.json new file mode 100644 index 0000000..fec7a46 --- /dev/null +++ b/Meta/Red_Star_Song.json @@ -0,0 +1,13 @@ +{ + "SongName": "红星歌", + "Lyricist": "邬大为, 魏宝贵", + "Composer": "傅庚辰", + "Adapter": "", + "Comment": "合唱版", + "Abstract": "电影《闪闪的红星》主题曲", + "Image": "", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Red_Star_Song.meta b/Meta/Red_Star_Song.meta deleted file mode 100644 index c1ef4fd..0000000 --- a/Meta/Red_Star_Song.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qym; -SongName: 红星歌; -Lyricist: 邬大为, 魏宝贵; -Composer: 傅庚辰; -Comment: 合唱版; -Abstract: 电影《闪闪的红星》主题曲; -TrackCount: 2; -Duration: 104.621; -Instruments: {"Piano", "VoiceAahs"}; \ No newline at end of file diff --git a/Meta/Shionari.json b/Meta/Shionari.json new file mode 100644 index 0000000..b6639cc --- /dev/null +++ b/Meta/Shionari.json @@ -0,0 +1,13 @@ +{ + "SongName": "潮鸣", + "Lyricist": "", + "Composer": "折戸伸治", + "Adapter": "", + "Comment": "潮鳴り", + "Abstract": "《Clannad》插曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Shionari.meta b/Meta/Shionari.meta deleted file mode 100644 index 5547727..0000000 --- a/Meta/Shionari.meta +++ /dev/null @@ -1,8 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 1960/13; -Instruments: {"Bass", "BassDrum", "Glockenspiel", "HighTom", "Maracas", "MidTom", "Piano", "RideCymbal2", "Snare", "Strings"}; -SongName: 潮鸣; -Composer: 折戸伸治; -Comment: 潮鳴り; -Abstract: 《Clannad》插曲; \ No newline at end of file diff --git a/Meta/Socialism_is_Good.json b/Meta/Socialism_is_Good.json new file mode 100644 index 0000000..c39ce15 --- /dev/null +++ b/Meta/Socialism_is_Good.json @@ -0,0 +1,13 @@ +{ + "SongName": "社会主义好", + "Lyricist": "希扬", + "Composer": "李焕之", + "Adapter": "", + "Comment": "", + "Abstract": "", + "Image": "", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Socialism_is_Good.meta b/Meta/Socialism_is_Good.meta deleted file mode 100644 index ae69f0f..0000000 --- a/Meta/Socialism_is_Good.meta +++ /dev/null @@ -1,7 +0,0 @@ -SongName: 社会主义好; -Format: qym; -Composer: 李焕之; -Lyricist: 希扬; -TrackCount: 1; -Duration: 29.7513; -Instruments: {}; \ No newline at end of file diff --git a/Meta/Sora_ni_Hikaru.json b/Meta/Sora_ni_Hikaru.json new file mode 100644 index 0000000..63717c6 --- /dev/null +++ b/Meta/Sora_ni_Hikaru.json @@ -0,0 +1,13 @@ +{ + "SongName": "空中闪耀", + "Lyricist": "", + "Composer": "戸越まごめ", + "Adapter": "", + "Comment": "空に光る", + "Abstract": "《Clannad》插曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Sora_ni_Hikaru.meta b/Meta/Sora_ni_Hikaru.meta deleted file mode 100644 index 3aba46b..0000000 --- a/Meta/Sora_ni_Hikaru.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 4; -Duration: 1880/11; -Instruments: {"BrightPiano", "Piano"}; -Messages: ; -SongName: 空中闪耀; -Composer: 戸越まごめ; -Comment: 空に光る; -Abstract: 《Clannad》插曲; \ No newline at end of file diff --git a/Meta/Sunny_Light.json b/Meta/Sunny_Light.json new file mode 100644 index 0000000..85bb548 --- /dev/null +++ b/Meta/Sunny_Light.json @@ -0,0 +1,13 @@ +{ + "SongName": "七色光之歌", + "Lyricist": "李幼容", + "Composer": "徐锡宜", + "Adapter": "", + "Comment": "", + "Abstract": "", + "Image": "", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Sunny_Light.meta b/Meta/Sunny_Light.meta deleted file mode 100644 index a6e1d41..0000000 --- a/Meta/Sunny_Light.meta +++ /dev/null @@ -1,7 +0,0 @@ -SongName: 七色光之歌; -Format: qym; -Lyricist: 李幼容; -Composer: 徐锡宜; -TrackCount: 2; -Duration: 116.054; -Instruments: {"Piano", "VoiceAahs"}; \ No newline at end of file diff --git a/Meta/Telegrapher.json b/Meta/Telegrapher.json new file mode 100644 index 0000000..56a0e42 --- /dev/null +++ b/Meta/Telegrapher.json @@ -0,0 +1,13 @@ +{ + "SongName": "鬼子电报员", + "Lyricist": "", + "Composer": "三泽康広", + "Adapter": "", + "Comment": "宴会开始", + "Abstract": "", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Telegrapher.meta b/Meta/Telegrapher.meta deleted file mode 100644 index b9990b7..0000000 --- a/Meta/Telegrapher.meta +++ /dev/null @@ -1,7 +0,0 @@ -SongName: 鬼子电报员; -Format: qys; -Comment: 宴会开始; -Composer: 三泽康広; -TrackCount: 2; -Duration: 68.1854; -Instruments: {"Flute", "Piano"}; \ No newline at end of file diff --git a/Meta/The_East_is_Red.json b/Meta/The_East_is_Red.json new file mode 100644 index 0000000..a7efaf4 --- /dev/null +++ b/Meta/The_East_is_Red.json @@ -0,0 +1,13 @@ +{ + "SongName": "东方红", + "Lyricist": "陕北民歌", + "Composer": "陕北民歌", + "Adapter": "", + "Comment": "", + "Abstract": "", + "Image": "", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/The_East_is_Red.meta b/Meta/The_East_is_Red.meta deleted file mode 100644 index b9fd40b..0000000 --- a/Meta/The_East_is_Red.meta +++ /dev/null @@ -1,7 +0,0 @@ -SongName: 东方红; -Format: qym; -Composer: 陕北民歌; -Lyricist: 陕北民歌; -TrackCount: 1; -Duration: 23.9422; -Instruments: {}; \ No newline at end of file diff --git a/Meta/The_Internationale.json b/Meta/The_Internationale.json new file mode 100644 index 0000000..0d9bc04 --- /dev/null +++ b/Meta/The_Internationale.json @@ -0,0 +1,13 @@ +{ + "SongName": "国际歌", + "Lyricist": "Eugène Edine Pottier", + "Composer": "Pierre De Geyter", + "Adapter": "", + "Comment": "", + "Abstract": "", + "Image": "", + "Format": "qym", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/The_Internationale.meta b/Meta/The_Internationale.meta deleted file mode 100644 index 921784a..0000000 --- a/Meta/The_Internationale.meta +++ /dev/null @@ -1,7 +0,0 @@ -SongName: 国际歌; -Format: qym; -Composer: Pierre De Geyter; -Lyricist: Eugène Edine Pottier; -TrackCount: 1; -Duration: 88.8048; -Instruments: {}; \ No newline at end of file diff --git a/Meta/Touhou/Dark_Side_of_Fate.json b/Meta/Touhou/Dark_Side_of_Fate.json new file mode 100644 index 0000000..97fef3d --- /dev/null +++ b/Meta/Touhou/Dark_Side_of_Fate.json @@ -0,0 +1,13 @@ +{ + "SongName": "命运的阴暗面", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "", + "Comment": "運命のダークサイド", + "Abstract": "东方风神录2面BOSS曲 键山雏主题曲", + "Image": "Touhou\\Kagiyama_Hina.jpg", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/Dark_Side_of_Fate.meta b/Meta/Touhou/Dark_Side_of_Fate.meta deleted file mode 100644 index a46dabc..0000000 --- a/Meta/Touhou/Dark_Side_of_Fate.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 2; -Duration: 102.841; -Instruments: {"ElectricBass", "ElectricPiano", "ElectricPiano2", "Harp"}; -Image: Touhou\Kagiyama_Hina.jpg; -SongName: 命运的阴暗面; -Composer: ZUN; -Comment: 運命のダークサイド; -Abstract: 东方风神录2面BOSS曲 键山雏主题曲; \ No newline at end of file diff --git a/Meta/Touhou/Dream_Battle.json b/Meta/Touhou/Dream_Battle.json new file mode 100644 index 0000000..2d3974b --- /dev/null +++ b/Meta/Touhou/Dream_Battle.json @@ -0,0 +1,13 @@ +{ + "SongName": "少女绮想曲", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "", + "Comment": "少女綺想曲", + "Abstract": "东方永夜抄4面BOSS曲 博丽灵梦主题曲", + "Image": "Touhou\\Hakurei_Reimu.jpg", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/Dream_Battle.meta b/Meta/Touhou/Dream_Battle.meta deleted file mode 100644 index 1108ef6..0000000 --- a/Meta/Touhou/Dream_Battle.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 150; -Instruments: {"Bass", "BrassSection", "BrightPiano", "ElectricPiano", "ElectricPiano2", "Harp", "Piano", "Strings2"}; -Image: Touhou\Hakurei_Reimu.jpg; -SongName: 少女绮想曲; -Composer: ZUN; -Comment: 少女綺想曲; -Abstract: 东方永夜抄4面BOSS曲 博丽灵梦主题曲; \ No newline at end of file diff --git a/Meta/Touhou/Houkainohi.json b/Meta/Touhou/Houkainohi.json new file mode 100644 index 0000000..ea5c4b6 --- /dev/null +++ b/Meta/Touhou/Houkainohi.json @@ -0,0 +1,13 @@ +{ + "SongName": "法界之火", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "LittleRed", + "Comment": "法界の火", + "Abstract": "东方星莲船6面道中曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/Houkainohi.meta b/Meta/Touhou/Houkainohi.meta deleted file mode 100644 index 3657db7..0000000 --- a/Meta/Touhou/Houkainohi.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 112; -Instruments: {"BassDrum2", "BlownBottle", "Cello", "HiHatPedal", "MuteSurdo", "NewAge", "Piano", "Strings", "SynthBass", "Taiko", "Timpani"}; -SongName: 法界之火; -Composer: ZUN; -Adapter: LittleRed; -Comment: 法界の火; -Abstract: 东方星莲船6面道中曲; \ No newline at end of file diff --git a/Meta/Touhou/Necro_Fantasia.json b/Meta/Touhou/Necro_Fantasia.json new file mode 100644 index 0000000..4bcb7d4 --- /dev/null +++ b/Meta/Touhou/Necro_Fantasia.json @@ -0,0 +1,13 @@ +{ + "SongName": "亡灵幻想曲", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "まらしぃ", + "Comment": "ネクロファンタジア", + "Abstract": "东方妖妖梦PH面BOSS曲 八云紫主题曲", + "Image": "Touhou\\Yakumo_Yukari.png", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/Necro_Fantasia.meta b/Meta/Touhou/Necro_Fantasia.meta deleted file mode 100644 index db42d88..0000000 --- a/Meta/Touhou/Necro_Fantasia.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 2; -Duration: 171.677; -Instruments: {"Piano"}; -Image: Touhou\Yakumo_Yukari.png; -SongName: 亡灵幻想曲; -Composer: ZUN; -Adapter: まらしぃ; -Comment: ネクロファンタジア; -Abstract: 东方妖妖梦PH面BOSS曲 八云紫主题曲; \ No newline at end of file diff --git a/Meta/Touhou/Phantom_Ensemble.json b/Meta/Touhou/Phantom_Ensemble.json new file mode 100644 index 0000000..0087bcf --- /dev/null +++ b/Meta/Touhou/Phantom_Ensemble.json @@ -0,0 +1,13 @@ +{ + "SongName": "幽灵乐团", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "", + "Comment": "幽霊楽団", + "Abstract": "东方妖妖梦4面BOSS曲 普莉兹姆利巴三姐妹主题曲", + "Image": "Touhou\\Prismriver_Sisters.jpg", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/Phantom_Ensemble.meta b/Meta/Touhou/Phantom_Ensemble.meta deleted file mode 100644 index 29cef1e..0000000 --- a/Meta/Touhou/Phantom_Ensemble.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 14; -Duration: 3720/13; -Instruments: {"Bass", "BassDrum", "BrassSection", "BrightPiano", "ElectricBass", "ElectricSnare", "Harpsichord", "HiHatPedal", "Piano", "Shaker", "Strings", "Strings2", "SynthStrings", "Trumpet", "Violin"}; -Image: Touhou\Prismriver_Sisters.jpg; -SongName: 幽灵乐团; -Composer: ZUN; -Comment: 幽霊楽団; -Abstract: 东方妖妖梦4面BOSS曲 普莉兹姆利巴三姐妹主题曲; \ No newline at end of file diff --git a/Meta/Touhou/Sumizome_Sakura.json b/Meta/Touhou/Sumizome_Sakura.json new file mode 100644 index 0000000..8964ef0 --- /dev/null +++ b/Meta/Touhou/Sumizome_Sakura.json @@ -0,0 +1,13 @@ +{ + "SongName": "幽雅绽放·墨染之樱", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "", + "Comment": "幽雅に咲かせ、墨染の樱", + "Abstract": "东方妖妖梦6面BOSS曲 西行寺幽幽子主题曲", + "Image": "Touhou\\Saigyouji_Yuyuko.jpg", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/Sumizome_Sakura.meta b/Meta/Touhou/Sumizome_Sakura.meta deleted file mode 100644 index 0aa7056..0000000 --- a/Meta/Touhou/Sumizome_Sakura.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 8; -Duration: 139.575; -Instruments: {"Bass", "Cello", "ElectricBass", "ElectricPiano2", "Flute", "Harp", "Piano", "Violin"}; -Image: Touhou\Saigyouji_Yuyuko.jpg; -SongName: 幽雅绽放·墨染之樱; -Composer: ZUN; -Comment: 幽雅に咲かせ、墨染の樱; -Abstract: 东方妖妖梦6面BOSS曲 西行寺幽幽子主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.json b/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.json new file mode 100644 index 0000000..877ce93 --- /dev/null +++ b/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.json @@ -0,0 +1,13 @@ +{ + "SongName": "哈德曼的妖怪少女", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "Shigma", + "Comment": "ハルトマンの妖怪少女", + "Abstract": "东方地灵殿EX面BOSS曲 古明地恋主题曲", + "Image": "Touhou\\Komeiji_Koishi.jpg", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta b/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta deleted file mode 100644 index 6b0c221..0000000 --- a/Meta/Touhou/TH11-Chireiden/Hartmann_No_Youkai_Otome.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 48; -Instruments: {"BrightPiano", "ElectricBass", "GuitarMuted", "Piano", "SopranoSax", "Strings", "SynthStrings"}; -Image: Touhou\Komeiji_Koishi.jpg; -SongName: 哈德曼的妖怪少女; -Composer: ZUN; -Adapter: Shigma; -Comment: ハルトマンの妖怪少女; -Abstract: 东方地灵殿EX面BOSS曲 古明地恋主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.json b/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.json new file mode 100644 index 0000000..59704e4 --- /dev/null +++ b/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.json @@ -0,0 +1,13 @@ +{ + "SongName": "灵知的太阳信仰", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "Shigma", + "Comment": "霊知の太陽信仰 ~ Nuclear Fusion", + "Abstract": "东方地灵殿6面BOSS曲 灵乌路空主题曲", + "Image": "Touhou\\Reiuji_Utsuho.jpg", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta b/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta deleted file mode 100644 index 69ab9bd..0000000 --- a/Meta/Touhou/TH11-Chireiden/Nuclear_Fusion.meta +++ /dev/null @@ -1,11 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 232/3; -Instruments: {"AltoSax", "Bass", "BassDrum", "BrightPiano", "Clap", "CrashCymbal", "GuitarMuted", "HighTom", "HiHatClosed", "HiHatOpen", "HiHatPedal", "LowTom", "MidTom", "Piano", "Snare", "SopranoSax", "Square", "Strings", "Trumpet"}; -Image: Touhou\Reiuji_Utsuho.jpg; -Messages: (章节5) 各音轨长度不统一:24, 24, 24, 24, 24, 24, 24, 64/3, 64/3, 64/3, 64/3, 64/3, 64/3; -SongName: 灵知的太阳信仰; -Composer: ZUN; -Adapter: Shigma; -Comment: 霊知の太陽信仰 ~ Nuclear Fusion; -Abstract: 东方地灵殿6面BOSS曲 灵乌路空主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.json b/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.json new file mode 100644 index 0000000..e1427d2 --- /dev/null +++ b/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.json @@ -0,0 +1,13 @@ +{ + "SongName": "绿眼的嫉妒", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "", + "Comment": "緑眼のジェラシー", + "Abstract": "东方地灵殿2面BOSS曲 水桥帕露西主题曲", + "Image": "Touhou\\Mizuhashi_Parsee.jpg", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta b/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta deleted file mode 100644 index 521e4bb..0000000 --- a/Meta/Touhou/TH11-Chireiden/Ryokugann_No_Jealousy.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 4; -Duration: 99.869; -Instruments: {"ElectricBass", "ElectricPiano2", "Piano", "Violin"}; -Image: Touhou\Mizuhashi_Parsee.jpg; -SongName: 绿眼的嫉妒; -Composer: ZUN; -Comment: 緑眼のジェラシー; -Abstract: 东方地灵殿2面BOSS曲 水桥帕露西主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Taeta_Hashi.json b/Meta/Touhou/TH11-Chireiden/Taeta_Hashi.json new file mode 100644 index 0000000..45e42c8 --- /dev/null +++ b/Meta/Touhou/TH11-Chireiden/Taeta_Hashi.json @@ -0,0 +1,13 @@ +{ + "SongName": "无人渡过之桥", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "LittleRed", + "Comment": "渡る者の途絶えた橋", + "Abstract": "东方地灵殿2面道中曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH11-Chireiden/Taeta_Hashi.meta b/Meta/Touhou/TH11-Chireiden/Taeta_Hashi.meta deleted file mode 100644 index a7c18c2..0000000 --- a/Meta/Touhou/TH11-Chireiden/Taeta_Hashi.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 2862/29; -Instruments: {"BassDrum2", "ElectricBass", "ElectricGrandPiano", "Flute", "HiHatClosed", "Koto", "Marimba", "MelodicTom", "Shaker", "Snare", "Sticks", "Strings2", "Violin"}; -Messages: ; -SongName: 无人渡过之桥; -Composer: ZUN; -Adapter: LittleRed; -Comment: 渡る者の途絶えた橋; -Abstract: 东方地灵殿2面道中曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.json b/Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.json new file mode 100644 index 0000000..347d5e3 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.json @@ -0,0 +1,13 @@ +{ + "SongName": "前所未见的噩梦世界", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "見た事が無い悪夢の世界", + "Abstract": "东方绀珠传EX面道中曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.meta b/Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.meta deleted file mode 100644 index 7bf55c5..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Akumu_no_Sekai.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 2731/20; -Instruments: {"BassDrum", "BassDrum2", "ChineseCymbal", "ElectricBass", "HiHatClosed", "HiHatPedal", "Maracas", "Snare", "Strings", "SynthBass", "Violin", "Xylophone"}; -SongName: 前所未见的噩梦世界; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 見た事が無い悪夢の世界; -Abstract: 东方绀珠传EX面道中曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.json b/Meta/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.json new file mode 100644 index 0000000..8be54b2 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.json @@ -0,0 +1,13 @@ +{ + "SongName": "永远的春梦", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "永遠の春夢", + "Abstract": "东方绀珠传3面BOSS曲 哆来咪·苏伊特主题曲\n(看标题想歪的自觉面壁)", + "Image": "Touhou\\Doremy_Sweet.jpg", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.meta b/Meta/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.meta deleted file mode 100644 index 0db7959..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Eien_no_Shyunmu.meta +++ /dev/null @@ -1,11 +0,0 @@ -Format: qys; -TrackCount: 2; -Duration: 20.747; -Instruments: {}; -Image: Touhou\Doremy_Sweet.jpg; -SongName: 永远的春梦; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 永遠の春夢; -Abstract: 东方绀珠传3面BOSS曲 哆来咪·苏伊特主题曲 -(看标题想歪的自觉面壁); \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.json b/Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.json new file mode 100644 index 0000000..6be3729 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.json @@ -0,0 +1,13 @@ +{ + "SongName": "飞翔于宇宙的不可思议巫女", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "宇宙を飛ぶ不思議な巫女", + "Abstract": "东方绀珠传3面道中曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.meta b/Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.meta deleted file mode 100644 index f658829..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Fushigi_Miko.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 3; -Duration: 67.4656; -Instruments: {"ElectricGrandPiano", "Piano", "Violin"}; -SongName: 飞翔于宇宙的不可思议巫女; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 宇宙を飛ぶ不思議な巫女; -Abstract: 东方绀珠传3面道中曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.json b/Meta/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.json new file mode 100644 index 0000000..e4940f3 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.json @@ -0,0 +1,13 @@ +{ + "SongName": "逆转的命运之轮", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "逆転するホイールオブフォーチュン", + "Abstract": "东方绀珠传4面BOSS曲 稀神探女主题曲", + "Image": "Touhou\\Kishin_Sagume.jpg", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.meta b/Meta/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.meta deleted file mode 100644 index 1497204..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Gyakutensuru_Wheel_of_Fortune.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 2; -Duration: 24.0327; -Instruments: {"Piano", "Violin"}; -Image: Touhou\Kishin_Sagume.jpg; -SongName: 逆转的命运之轮; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 逆転するホイールオブフォーチュン; -Abstract: 东方绀珠传4面BOSS曲 稀神探女主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.json b/Meta/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.json new file mode 100644 index 0000000..5968447 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.json @@ -0,0 +1,13 @@ +{ + "SongName": "遥远的38万公里的旅行", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "遥か38万キロのボヤージュ", + "Abstract": "东方绀珠传5面道中曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.meta b/Meta/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.meta deleted file mode 100644 index 9ee75ec..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Haruka_38Man_Kilo_Voyage.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 2; -Duration: 24.0327; -Instruments: {"ElectricPiano", "Piano"}; -SongName: 遥远的38万公里的旅行; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 遥か38万キロのボヤージュ; -Abstract: 东方绀珠传5面道中曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.json b/Meta/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.json new file mode 100644 index 0000000..de2366e --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.json @@ -0,0 +1,13 @@ +{ + "SongName": "倒映故乡星空之海", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "故郷の星が映る海", + "Abstract": "东方绀珠传6面道中曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.meta b/Meta/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.meta deleted file mode 100644 index 1b1e1d3..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Kokyou_Hoshi_Utsuru_Umi.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 1754/15; -Instruments: {"Crystal", "Flute", "Piano", "Seashore"}; -SongName: 倒映故乡星空之海; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 故郷の星が映る海; -Abstract: 东方绀珠传6面道中曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.json b/Meta/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.json new file mode 100644 index 0000000..8e86d53 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.json @@ -0,0 +1,13 @@ +{ + "SongName": "冻结的永恒之都", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "凍り付いた永遠の都", + "Abstract": "东方绀珠传4面道中曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.meta b/Meta/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.meta deleted file mode 100644 index 96b1985..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Koori_Tsuita_Eien_no_Miyako.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 2; -Duration: 23.1503; -Instruments: {"ElectricPiano2", "Piano"}; -SongName: 冻结的永恒之都; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 凍り付いた永遠の都; -Abstract: 东方绀珠传4面道中曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.json b/Meta/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.json new file mode 100644 index 0000000..259f92a --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.json @@ -0,0 +1,13 @@ +{ + "SongName": "九月的南瓜", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "九月のパンプキン", + "Abstract": "东方绀珠传2面BOSS曲 铃瑚主题曲", + "Image": "Touhou\\Ringo.png", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.meta b/Meta/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.meta deleted file mode 100644 index e4b3287..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Kyuugatsu_no_Pumpkin.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 4; -Duration: 92.8682; -Instruments: {"Cello", "ElectricGrandPiano", "ElectricPiano", "Piano"}; -Image: Touhou\Ringo.png; -SongName: 九月的南瓜; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 九月のパンプキン; -Abstract: 东方绀珠传2面BOSS曲 铃瑚主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.json b/Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.json new file mode 100644 index 0000000..9b5ae5b --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.json @@ -0,0 +1,13 @@ +{ + "SongName": "湖面倒映着纯净的月光", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "湖は浄めの月光を映して", + "Abstract": "东方绀珠传2面道中曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.meta b/Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.meta deleted file mode 100644 index 6237e88..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Mizuumi_Gekkou.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 3; -Duration: 28.8276; -Instruments: {"Cello", "ElectricPiano", "Piano"}; -SongName: 湖面倒映着纯净的月光; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 湖は浄めの月光を映して; -Abstract: 东方绀珠传2面道中曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.json b/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.json new file mode 100644 index 0000000..be046b4 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.json @@ -0,0 +1,13 @@ +{ + "SongName": "嘈乱的星球", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "パンデモニックプラネット", + "Abstract": "东方绀珠传EX面BOSS曲 赫卡提亚·拉碧斯拉祖利主题曲", + "Image": "Touhou\\Hecatia_Lapislazuli.png", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta b/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta deleted file mode 100644 index 38360a3..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Pandemonic_Planet.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 20; -Duration: 228; -Instruments: {"BassDrum", "BassDrum2", "ChineseCymbal", "Clap", "ElectricBass", "ElectricGrandPiano", "EnglishHorn", "HiHatClosed", "Koto", "Maracas", "Snare", "Strings", "Violin", "Xylophone"}; -Image: Touhou\Hecatia_Lapislazuli.png; -SongName: 嘈乱的星球; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: パンデモニックプラネット; -Abstract: 东方绀珠传EX面BOSS曲 赫卡提亚·拉碧斯拉祖利主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Pure_Furies.json b/Meta/Touhou/TH15-Kanjuden/Pure_Furies.json new file mode 100644 index 0000000..fc40a46 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Pure_Furies.json @@ -0,0 +1,13 @@ +{ + "SongName": "Pure Furies ~ 心之所在", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "ピュアヒューリーズ ~ 心の在処", + "Abstract": "东方绀珠传6面BOSS曲 纯狐主题曲", + "Image": "Touhou\\Junko.png", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta b/Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta deleted file mode 100644 index e3824b0..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Pure_Furies.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 0; -Duration: 5/746; -Instruments: {"BassDrum", "CrashCymbal2", "ElectricBass", "HiHatClosed", "Piano", "Snare", "SynthStrings2", "Violin"}; -Image: Touhou\Junko.png; -SongName: Pure Furies ~ 心之所在; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: ピュアヒューリーズ ~ 心の在処; -Abstract: 东方绀珠传6面BOSS曲 纯狐主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.json b/Meta/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.json new file mode 100644 index 0000000..1f12597 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.json @@ -0,0 +1,13 @@ +{ + "SongName": "星条旗的小丑", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "星条旗のピエロ", + "Abstract": "东方绀珠传5面BOSS曲 克劳恩皮丝主题曲", + "Image": "Touhou\\Clownpiece.png", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.meta b/Meta/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.meta deleted file mode 100644 index 7e069a1..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Seijyouki_no_Pierrot.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 2; -Duration: 12.0279; -Instruments: {"Cello", "Piano"}; -Image: Touhou\Clownpiece.png; -SongName: 星条旗的小丑; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 星条旗のピエロ; -Abstract: 东方绀珠传5面BOSS曲 克劳恩皮丝主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.json b/Meta/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.json new file mode 100644 index 0000000..f78f755 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.json @@ -0,0 +1,13 @@ +{ + "SongName": "兔已着陆", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "兎は舞い降りた", + "Abstract": "东方绀珠传1面BOSS曲 清兰主题曲", + "Image": "Touhou\\Seiran.png", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.meta b/Meta/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.meta deleted file mode 100644 index 0e94bba..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Usagi_ha_Mai_Orita.meta +++ /dev/null @@ -1,10 +0,0 @@ -Format: qys; -TrackCount: 5; -Duration: 56.4825; -Instruments: {"Bass", "ElectricBass", "ElectricPiano2", "Piano", "Violin"}; -Image: Touhou\Seiran.png; -SongName: 兔已着陆; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 兎は舞い降りた; -Abstract: 东方绀珠传1面BOSS曲 清兰主题曲; \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Wasuregataki.json b/Meta/Touhou/TH15-Kanjuden/Wasuregataki.json new file mode 100644 index 0000000..44f0890 --- /dev/null +++ b/Meta/Touhou/TH15-Kanjuden/Wasuregataki.json @@ -0,0 +1,13 @@ +{ + "SongName": "忘不了,那曾依凭之绿", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "触手猴 LittleRed", + "Comment": "忘れがたき、よすがの緑", + "Abstract": "东方绀珠传1面道中曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/TH15-Kanjuden/Wasuregataki.meta b/Meta/Touhou/TH15-Kanjuden/Wasuregataki.meta deleted file mode 100644 index 5a5160c..0000000 --- a/Meta/Touhou/TH15-Kanjuden/Wasuregataki.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 4; -Duration: 83.9169; -Instruments: {"Cello", "Piano"}; -SongName: 忘不了,那曾依凭之绿; -Composer: ZUN; -Adapter: 触手猴 LittleRed; -Comment: 忘れがたき、よすがの緑; -Abstract: 东方绀珠传1面道中曲; \ No newline at end of file diff --git a/Meta/Touhou/Tenkuu_Hana_Miyako.json b/Meta/Touhou/Tenkuu_Hana_Miyako.json new file mode 100644 index 0000000..e7dbdf7 --- /dev/null +++ b/Meta/Touhou/Tenkuu_Hana_Miyako.json @@ -0,0 +1,13 @@ +{ + "SongName": "天空的花都", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "LittleRed", + "Comment": "天空の花の都", + "Abstract": "东方妖妖梦4面道中曲 莉莉白主题曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/Tenkuu_Hana_Miyako.meta b/Meta/Touhou/Tenkuu_Hana_Miyako.meta deleted file mode 100644 index b4a9772..0000000 --- a/Meta/Touhou/Tenkuu_Hana_Miyako.meta +++ /dev/null @@ -1,9 +0,0 @@ -Format: qys; -TrackCount: 3; -Duration: 26.6333; -Instruments: {"ElectricGrandPiano", "ElectricPiano", "Piano"}; -SongName: 天空的花都; -Composer: ZUN; -Adapter: LittleRed; -Comment: 天空の花の都; -Abstract: 东方妖妖梦4面道中曲 莉莉白主题曲; \ No newline at end of file diff --git a/Meta/Touhou/Touhou_Mix_1.json b/Meta/Touhou/Touhou_Mix_1.json new file mode 100644 index 0000000..b656efb --- /dev/null +++ b/Meta/Touhou/Touhou_Mix_1.json @@ -0,0 +1,13 @@ +{ + "SongName": "东方组曲第一弹", + "Lyricist": "", + "Composer": "ZUN", + "Adapter": "", + "Comment": "", + "Abstract": "行走在旧地狱街道上(旧地獄街道を行く):东方地灵殿3面道中曲\n魔法少女们的百年祭(魔法少女達の百年祭):东方红魔乡EX面道中曲\n明日之盛·昨日之俗(明日ハレの日、ケの昨日):东方风神录EX面道中曲", + "Image": "", + "Format": "qys", + "Origin": "", + "Uploader": "", + "Tags": [] +} \ No newline at end of file diff --git a/Meta/Touhou/Touhou_Mix_1.meta b/Meta/Touhou/Touhou_Mix_1.meta deleted file mode 100644 index 25a6beb..0000000 --- a/Meta/Touhou/Touhou_Mix_1.meta +++ /dev/null @@ -1,9 +0,0 @@ -SongName: 东方组曲第一弹; -Format: qys; -Composer: ZUN; -Abstract: 行走在旧地狱街道上(旧地獄街道を行く):东方地灵殿3面道中曲 -魔法少女们的百年祭(魔法少女達の百年祭):东方红魔乡EX面道中曲 -明日之盛·昨日之俗(明日ハレの日、ケの昨日):东方风神录EX面道中曲; -TrackCount: 6; -Duration: 123.391; -Instruments: {"Cello", "ElectricGrandPiano", "Flute", "Piano", "Violin", "Whistle"}; \ No newline at end of file diff --git a/QYMP.wl b/QYMP.wl index 756f59c..167d66b 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -18,133 +18,59 @@ QYMParse[filename_]:=integrate[#MusicClips,#Effects]&@parse[QYM`tokenizer[filena QYSParse[filename_]:=integrate[#MusicClips,#Effects]&@parse[QYS`Tokenize[filename]]; -refresh:=Module[ - { - metaTree,songsClassified, - playlistInfo,songList - }, - SetDirectory[path]; - metaTree=StringDrop[FileNames["*","Meta",Infinity],5]; - songs=StringDrop[Select[metaTree,StringMatchQ[__~~".meta"]],-5]; - dirList=Select[metaTree,!StringMatchQ[#,__~~".meta"]&]; +(* user data *) +version=201; +userPath=$HomeDirectory<>"\\AppData\\Local\\QYMP\\"; +cloudPath="http://qymp.ob-studio.cn/assets/"; +If[!DirectoryQ[userPath],CreateDirectory[userPath]]; +If[!DirectoryQ[userPath<>"export\\"],CreateDirectory[userPath<>"export\\"]]; +If[!DirectoryQ[userPath<>"buffer\\"],CreateDirectory[userPath<>"buffer\\"]]; +If[!DirectoryQ[userPath<>"images\\"],CreateDirectory[userPath<>"images\\"]]; +template=<|"Version"->version,"Language"->"chs","Developer"->False,"Player"->"Old"|>; +If[!FileExistsQ[userPath<>"Default.json"],Export[userPath<>"Default.json",template]]; +userInfo=Association@Import[userPath<>"Default.json"]; +If[userInfo[["Version"]]"buffer\\"<>dir],CreateDirectory[userPath<>"buffer\\"<>dir]]; - If[!DirectoryQ[userPath<>"images\\"<>dir],CreateDirectory[userPath<>"images\\"<>dir]], - {dir,dirList}]; - index=AssociationMap[readInfo,songs]; - playlists=#&/@Import[path<>"playlist.json"]; - playlistData=<||>; - songsClassified={}; - Do[ - playlistInfo=Association@Import[path<>"Playlists\\"<>playlist<>".qyl","JSON"]; - songList=#Song&/@Association/@playlistInfo[["SongList"]]; - AppendTo[playlistData,<|playlist->playlistInfo|>]; - songsClassified=Union[songsClassified,playlistInfo[["Path"]]<>#&/@songList], - {playlist,playlists}]; - playlists=Join[{"All","Unclassified"},playlists]; - playlistData=Join[<| - "All"-><| - "Path"->"", - "Title"->"\:6240\:6709\:6b4c\:66f2", - "Abstract"->"", - "Comment"->"", - "SongList"->({"Song"->#}&/@songs), - "IndexWidth"->0 - |>, - "Unclassified"-><| - "Path"->"", - "Title"->"\:672a\:5206\:7c7b\:7684\:6b4c\:66f2", - "Abstract"->"", - "Comment"->"", - "SongList"->({"Song"->#}&/@Complement[songs,songsClassified]), - "IndexWidth"->0 - |> - |>,playlistData]; - pageData=AssociationMap[1&,Prepend[playlists,"Main"]]; -]; - - -(* ::Input:: *) -(*refresh;*) - - -updateImage:=Module[{updates={},image,filename,meta}, - Do[ - If[KeyExistsQ[index[[song]],"Image"]&&!FileExistsQ[userPath<>"Images\\"<>index[[song,"Image"]]], - AppendTo[updates,index[[song,"Image"]]] - ], - {song,songs}]; - If[updates=={},Return[]]; - Monitor[Do[ - filename=updates[[i]]; - image=Import[cloudPath<>"images/"<>StringReplace[filename,"\\"->"/"]]; - Export[userPath<>"Images\\"<>filename,image]; - meta=Association@Import[cloudPath<>"images/"<>StringReplace[filename,{"\\"->"/","."~~__->".json"}]]; - If[KeyExistsQ[imageData,filename], - imageData[[filename]]=meta, - AppendTo[imageData,filename->meta] - ], - {i,Length@updates}], - Panel[Column[{Spacer[{4,4}], - text[["UpdatingImage"]], - Spacer[1], - ProgressIndicator[i,{1,Length@updates},ImageSize->{320,16}], - Spacer[1], - Row[{ - caption["_Progression","Text",{i,Length@updates}], - Spacer[4],text[["Loading"]], - updates[[i]] - }], - Spacer[{4,4}]},Alignment->Center],ImageSize->400,Alignment->Center]]; - Export[userPath<>"Image.json",Normal/@Normal@imageData]; -]; - - -updateBuffer:=Module[{updates={},song,filename,hash,audio,messages,bufferList}, - SetDirectory[userPath]; - bufferList=StringTake[FileNames["*.buffer","buffer",Infinity],{8,-8}]; - DeleteFile[userPath<>"Buffer\\"<>#<>".buffer"]&/@Complement[bufferList,songs]; - Do[ - filename=path<>"Songs\\"<>song<>"."<>index[[song,"Format"]]; - hash=toBase32@FileHash[filename]; - If[KeyExistsQ[bufferHash,song], - If[bufferHash[[song]]==hash && FileExistsQ[userPath<>"Buffer\\"<>song<>".buffer"], - Continue[], - AppendTo[updates,song]; - ], - AppendTo[bufferHash,song->hash]; - AppendTo[updates,song]; - ], - {song,songs}]; - If[updates=={},Return[]]; - Monitor[Do[ - song=updates[[i]]; - filename=path<>"Songs\\"<>song<>"."<>index[[song,"Format"]]; - bufferHash[[song]]=toBase32@FileHash[filename]; - If[index[[song,"Format"]]=="qys", - audio=QYSParse[filename], - audio=QYMParse[filename] - ]; - messages=Values[Options[audio,MetaInformation]][[1]][["Messages"]]; - If[KeyExistsQ[errorLog,song], - errorLog[[song]]=messages, - AppendTo[errorLog,song->messages] - ]; - Export[userPath<>"Buffer\\"<>song<>".buffer",audio,"MP3"], - {i,Length@updates}], - Panel[Column[{Spacer[{4,4}], - text[["UpdatingBuffer"]], - Spacer[1], - ProgressIndicator[i,{1,Length@updates},ImageSize->{320,16}], - Spacer[1], - Row[{ - caption["_Progression","Text",{i,Length@updates}], - Spacer[4],text[["Loading"]], - index[[updates[[i]],"SongName"]] - }], - Spacer[{4,4}]},Alignment->Center],ImageSize->400,Alignment->Center]]; - Export[userPath<>"Buffer.json",Normal@bufferHash[[Intersection[Keys@bufferHash,songs]]]]; + If[!KeyExistsQ[userInfo,tag],AppendTo[userInfo,tag->template[[tag]]]], + {tag,Keys@template}]; + userInfo[["Version"]]=version; + Export[userPath<>"Default.json",userInfo]; ]; +If[!FileExistsQ[userPath<>"Buffer.json"],Export[userPath<>"Buffer.json",{}]]; +bufferHash=Association@Import[userPath<>"Buffer.json"]; +If[!FileExistsQ[userPath<>"ErrorLog.json"],Export[userPath<>"ErrorLog.json",{}]]; +errorLog=Association@Import[userPath<>"ErrorLog.json"]; +If[!FileExistsQ[userPath<>"Favorite.json"],Export[userPath<>"Favorite.json",{}]]; +favorite=Import[userPath<>"Favorite.json"]; +If[!FileExistsQ[userPath<>"Image.json"],Export[userPath<>"Image.json",{}]]; +imageData=Association/@Association@Import[userPath<>"image.json"]; + + +(* local data *) +instrData=Association@Import[path<>"instr.json"]; (* instruments *) +colorData=Association@Import[path<>"color.json"]; (* colors *) +styleColor=RGBColor/@Association@colorData[["StyleColor"]]; +buttonColor=RGBColor/@#&/@Association/@Association@colorData[["ButtonColor"]]; +pageSelectorColor=RGBColor/@#&/@Association/@Association@colorData[["PageSelectorColor"]]; +styleData=Association/@Association@Import[path<>"style.json"]; (* styles *) +styleDict=Normal@Module[{outcome={}}, + If[KeyExistsQ[#,"FontSize"],AppendTo[outcome,FontSize->#[["FontSize"]]]]; + If[KeyExistsQ[#,"FontFamily"],AppendTo[outcome,FontFamily->#[["FontFamily"]]]]; + If[KeyExistsQ[#,"FontWeight"],AppendTo[outcome,FontWeight->ToExpression@#[["FontWeight"]]]]; + If[KeyExistsQ[#,"FontColor"],AppendTo[outcome,FontColor->styleColor[[#[["FontColor"]]]]]]; +outcome]&/@styleData; +langList={"chs"(*,"eng"*)}; (* languages *) +langDict=#->caption[Association[Import[path<>"Lang\\"<>#<>".json"]][["LanguageName"]],"Text"]&/@langList; +langData=Association@Import[path<>"Lang\\"<>userInfo[["Language"]]<>".json"]; +tagName=Association@langData[["TagName"]]; +instrName=Association@langData[["Instrument"]]; +text=Association@langData[["Caption"]]; +aboutInfo=Association@text[["AboutQYMP"]]; +metaInfoTags={"Format","TrackCount","Duration","Instruments"}; (* tags *) +textInfoTags={"SongName","Lyricist","Composer","Adapter","Comment","Abstract","Origin"}; +otherInfoTags={"Format","Image","Uploader","Tags"}; +imageTags={"Title","Painter","PainterID","IllustID","URL"}; +aboutTags={"Version","Producer","Website"}; (* ::Input::Initialization:: *) diff --git a/interface.wl b/interface.wl index f2e10b4..d307686 100644 --- a/interface.wl +++ b/interface.wl @@ -26,7 +26,6 @@ uiSettings:=DynamicModule[{choices}, langData=Association@Import[path<>"Lang\\"<>choices[["Language"]]<>".json"]; tagName=Association@langData[["TagName"]]; instrName=Association@langData[["Instrument"]]; - errorDict=Association@langData[["Error"]]; text=Association@langData[["Caption"]]; aboutInfo=Association@text[["AboutQYMP"]]; userInfo=choices; @@ -115,7 +114,7 @@ uiPlayerControlsNew:={ uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, AudioStop[]; - If[KeyExistsQ[index[[song]],"Image"], + If[index[[song,"Image"]]!="", imageExist=True; image=Import[userPath<>"Images\\"<>index[[song,"Image"]]]; aspectRatio=ImageAspectRatio[image], @@ -142,7 +141,7 @@ uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, ], Spacer[{40,40}]}]}],Nothing],Spacer[48], Column[Join[{Spacer[{60,60}], - If[KeyExistsQ[index[[song]],"Comment"], + If[index[[song,"Comment"]]!="", If[textLength@index[[song,"SongName"]]>16||textLength@index[[song,"Comment"]]>16, Column, Row @@ -153,12 +152,12 @@ uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, caption[index[[song,"SongName"]],"Title"] ], Spacer[1], - Column[If[KeyExistsQ[index[[song]],#], + Column[If[index[[song,#]]!="", caption[tagName[[#]]<>": "<>index[[song,#]],"Text"], Nothing ]&/@{"Composer","Lyricist","Adapter"},Alignment->Center], Spacer[1], - If[KeyExistsQ[index[[song]],"Abstract"], + If[index[[song,"Abstract"]]!="", Column[caption[#,"Text"]&/@StringSplit[index[[song,"Abstract"]],"\n"],Center], Nothing ], @@ -175,7 +174,7 @@ uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, uiModifySong[song_]:=DynamicModule[{textInfo}, - textInfo=getTextInfo[song]; + textInfo=index[[song,textInfoTags]]; CreateDialog[Column[{Spacer[{20,20}], caption[textInfo[["SongName"]],"Title"], Spacer[1], @@ -187,7 +186,7 @@ uiModifySong[song_]:=DynamicModule[{textInfo}, Spacer[1], Grid[{ {Button[text[["Save"]],putTextInfo[song,textInfo],ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], - Button[text[["Undo"]],textInfo=getTextInfo[song],ImageSize->150]}, + Button[text[["Undo"]],textInfo=index[[song,textInfoTags]],ImageSize->150]}, {Button[text[["DeleteSong"]],DialogReturn[uiDeleteSong[song]],ImageSize->150], Button[text[["Return"]],DialogReturn[refresh;uiPlaylist["All"]],ImageSize->150]} }],Spacer[{20,20}] @@ -196,6 +195,29 @@ uiModifySong[song_]:=DynamicModule[{textInfo}, ]; +putTextInfo[song_,textInfo_]:=Module[ + {info=index[[song]]}, + Do[ + info[[tag]]=textInfo[[tag]], + {tag,textInfoTags}]; + index[[song]]=info; + Export[path<>"Meta\\"<>song<>".json",index[[song]]]; +]; + + +tagTemplate=<|"Image"->"","Uploader"->"","Tags"->{}|>; +addSong[songPath_,textInfo_]:=Module[{song,metaInfo,audio,format}, + song=StringDrop[songPath,-4]; + format=StringTake[songPath,-3]; + audio=If[format=="qys",QYSParse,QYMParse][path<>"Songs\\"<>songPath]; + Export[userPath<>"Buffer\\"<>song<>".buffer",audio,"MP3"]; + AppendTo[bufferHash,song->toBase32@FileHash[path<>"Songs\\"<>songPath]]; + Export[userPath<>"Buffer.json",Normal@bufferHash]; + AppendTo[index,song->Join[textInfo,tagTemplate,<|"Format"->format|>]]; + putTextInfo[song,textInfo]; +]; + + ignoreList={"temp.qys","test.qys"}; uiAddSong:=DynamicModule[{songPath,textInfo,candidates}, textInfo=AssociationMap[""&,textInfoTags]; @@ -223,21 +245,6 @@ uiAddSong:=DynamicModule[{songPath,textInfo,candidates}, ]; -addSong[songPath_,textInfo_]:=Module[{song,metaInfo,audio}, - song=StringDrop[songPath,-4]; - AppendTo[bufferHash,song->toBase32@FileHash[path<>"Songs\\"<>songPath]]; - Export[userPath<>"Buffer.json",Normal@bufferHash]; - audio=If[StringTake[songPath,-3]=="qys",QYSParse,QYMParse][path<>"Songs\\"<>songPath]; - Export[userPath<>"Buffer\\"<>song<>".buffer",audio,"MP3"]; - metaInfo=Values[Options[audio,MetaInformation]][[1]]; - metaInfo[["TrackCount"]]=ToString[metaInfo[["TrackCount"]]]; - metaInfo[["Duration"]]=ToString[metaInfo[["Duration"]],InputForm]; - metaInfo[["Instruments"]]=ToString[metaInfo[["Instruments"]],InputForm]; - AppendTo[index,song->metaInfo]; - putTextInfo[song,textInfo]; -]; - - (* ::Input:: *) (*uiAddSong;*) diff --git a/library.wl b/library.wl index ea73264..8023d94 100644 --- a/library.wl +++ b/library.wl @@ -1,61 +1,5 @@ (* ::Package:: *) -(* user data *) -version=201; -userPath=$HomeDirectory<>"\\AppData\\Local\\QYMP\\"; -cloudPath="http://qymp.ob-studio.cn/assets/"; -If[!DirectoryQ[userPath],CreateDirectory[userPath]]; -If[!DirectoryQ[userPath<>"export\\"],CreateDirectory[userPath<>"export\\"]]; -If[!DirectoryQ[userPath<>"buffer\\"],CreateDirectory[userPath<>"buffer\\"]]; -If[!DirectoryQ[userPath<>"images\\"],CreateDirectory[userPath<>"images\\"]]; -template=<|"Version"->version,"Language"->"chs","Developer"->False,"Player"->"Old"|>; -If[!FileExistsQ[userPath<>"Default.json"],Export[userPath<>"Default.json",template]]; -userInfo=Association@Import[userPath<>"Default.json"]; -If[userInfo[["Version"]]template[[tag]]]], - {tag,Keys@template}]; - userInfo[["Version"]]=version; - Export[userPath<>"Default.json",userInfo]; -]; -If[!FileExistsQ[userPath<>"Buffer.json"],Export[userPath<>"Buffer.json",{}]]; -bufferHash=Association@Import[userPath<>"Buffer.json"]; -If[!FileExistsQ[userPath<>"ErrorLog.json"],Export[userPath<>"ErrorLog.json",{}]]; -errorLog=Association@Import[userPath<>"ErrorLog.json"]; -If[!FileExistsQ[userPath<>"Favorite.json"],Export[userPath<>"Favorite.json",{}]]; -favorite=Import[userPath<>"Favorite.json"]; -If[!FileExistsQ[userPath<>"Image.json"],Export[userPath<>"Image.json",{}]]; -imageData=Association/@Association@Import[userPath<>"image.json"]; - - -(* local data *) -path=NotebookDirectory[]; -instrData=Association@Import[path<>"instr.json"]; (* instruments *) -colorData=Association@Import[path<>"color.json"]; (* colors *) -styleColor=RGBColor/@Association@colorData[["StyleColor"]]; -buttonColor=RGBColor/@#&/@Association/@Association@colorData[["ButtonColor"]]; -pageSelectorColor=RGBColor/@#&/@Association/@Association@colorData[["PageSelectorColor"]]; -styleData=Association/@Association@Import[path<>"style.json"]; (* styles *) -styleDict=Normal@Module[{outcome={}}, - If[KeyExistsQ[#,"FontSize"],AppendTo[outcome,FontSize->#[["FontSize"]]]]; - If[KeyExistsQ[#,"FontFamily"],AppendTo[outcome,FontFamily->#[["FontFamily"]]]]; - If[KeyExistsQ[#,"FontWeight"],AppendTo[outcome,FontWeight->ToExpression@#[["FontWeight"]]]]; - If[KeyExistsQ[#,"FontColor"],AppendTo[outcome,FontColor->styleColor[[#[["FontColor"]]]]]]; -outcome]&/@styleData; -langList={"chs"(*,"eng"*)}; (* languages *) -langDict=#->caption[Association[Import[path<>"Lang\\"<>#<>".json"]][["LanguageName"]],"Text"]&/@langList; -langData=Association@Import[path<>"Lang\\"<>userInfo[["Language"]]<>".json"]; -tagName=Association@langData[["TagName"]]; -instrName=Association@langData[["Instrument"]]; -text=Association@langData[["Caption"]]; -aboutInfo=Association@text[["AboutQYMP"]]; -metaInfoTags={"Format","TrackCount","Duration","Instruments"}; (* tags *) -textInfoTags={"SongName","Lyricist","Composer","Adapter","Comment","Abstract"}; -otherInfoTags={"Image","Uploader"}; -imageTags={"Title","Painter","PainterID","IllustID","URL"}; -aboutTags={"Version","Producer","Website"}; - - (* some functions *) textLength[string_]:=2StringLength[string]-StringCount[string,Alternatives@CharacterRange[32,127]]; toBase32[n_]:=StringDelete[ToString@BaseForm[n,32],"\n"~~__]; @@ -97,31 +41,130 @@ getArgument[string_,function_]:=Switch[function, ]; -writeInfo[song_,info_]:=Export[ - path<>"Meta\\"<>song<>".meta", - StringRiffle[KeyValueMap[#1<>": "<>#2<>";"&,info],"\n"], -"Text"]; -readInfo[song_]:=Module[ - {data,info={},match,i}, - data=StringSplit[Import[path<>"Meta\\"<>song<>".meta","Text"],{";\n",";"}]; +refresh:=Module[ + { + metaTree,songsClassified, + playlistInfo,songList + }, + SetDirectory[path]; + metaTree=StringDrop[FileNames["*","Meta",Infinity],5]; + songs=StringDrop[Select[metaTree,StringMatchQ[__~~".json"]],-5]; + dirList=Select[metaTree,!StringMatchQ[#,__~~".json"]&]; + Do[ + If[!DirectoryQ[userPath<>"buffer\\"<>dir],CreateDirectory[userPath<>"buffer\\"<>dir]]; + If[!DirectoryQ[userPath<>"images\\"<>dir],CreateDirectory[userPath<>"images\\"<>dir]], + {dir,dirList}]; + index=Association/@AssociationMap[Import[path<>"Meta\\"<>#<>".json"]&,songs]; + playlists=Import[path<>"playlist.json"]; + playlistData=<||>; + songsClassified={}; Do[ - match=StringPosition[data[[i]],": "][[1,1]]; - AppendTo[info,StringTake[data[[i]],match-1]->StringDrop[data[[i]],match+1]], - {i,Length[data]}]; - Return[Association@info]; + playlistInfo=Association@Import[path<>"Playlists\\"<>playlist<>".qyl","JSON"]; + songList=#Song&/@Association/@playlistInfo[["SongList"]]; + AppendTo[playlistData,<|playlist->playlistInfo|>]; + songsClassified=Union[songsClassified,playlistInfo[["Path"]]<>#&/@songList], + {playlist,playlists}]; + playlists=Join[{"All","Unclassified"},playlists]; + playlistData=Join[<| + "All"-><| + "Path"->"", + "Title"->"\:6240\:6709\:6b4c\:66f2", + "Abstract"->"", + "Comment"->"", + "SongList"->({"Song"->#}&/@songs), + "IndexWidth"->0 + |>, + "Unclassified"-><| + "Path"->"", + "Title"->"\:672a\:5206\:7c7b\:7684\:6b4c\:66f2", + "Abstract"->"", + "Comment"->"", + "SongList"->({"Song"->#}&/@Complement[songs,songsClassified]), + "IndexWidth"->0 + |> + |>,playlistData]; + pageData=AssociationMap[1&,Prepend[playlists,"Main"]]; ]; -getTextInfo[song_]:=( - refresh; - AssociationMap[If[KeyExistsQ[index[[song]],#],index[[song,#]],""]&,textInfoTags] -); -putTextInfo[song_,textInfo_]:=Module[ - {info=index[[song]]}, + + +(* ::Input:: *) +(*refresh;*) + + +updateImage:=Module[{updates={},image,filename,meta}, + Do[ + If[KeyExistsQ[index[[song]],"Image"]&&!FileExistsQ[userPath<>"Images\\"<>index[[song,"Image"]]], + AppendTo[updates,index[[song,"Image"]]] + ], + {song,songs}]; + If[updates=={},Return[]]; + Monitor[Do[ + filename=updates[[i]]; + image=Import[cloudPath<>"images/"<>StringReplace[filename,"\\"->"/"]]; + Export[userPath<>"Images\\"<>filename,image]; + meta=Association@Import[cloudPath<>"images/"<>StringReplace[filename,{"\\"->"/","."~~__->".json"}]]; + If[KeyExistsQ[imageData,filename], + imageData[[filename]]=meta, + AppendTo[imageData,filename->meta] + ], + {i,Length@updates}], + Panel[Column[{Spacer[{4,4}], + text[["UpdatingImage"]], + Spacer[1], + ProgressIndicator[i,{1,Length@updates},ImageSize->{320,16}], + Spacer[1], + Row[{ + caption["_Progression","Text",{i,Length@updates}], + Spacer[4],text[["Loading"]], + updates[[i]] + }], + Spacer[{4,4}]},Alignment->Center],ImageSize->400,Alignment->Center]]; + Export[userPath<>"Image.json",Normal/@Normal@imageData]; +]; + + +updateBuffer:=Module[{updates={},song,filename,hash,audio,messages,bufferList}, + SetDirectory[userPath]; + bufferList=StringTake[FileNames["*.buffer","buffer",Infinity],{8,-8}]; + DeleteFile[userPath<>"Buffer\\"<>#<>".buffer"]&/@Complement[bufferList,songs]; Do[ - If[KeyExistsQ[info,tag], - If[textInfo[[tag]]!="",info[[tag]]=textInfo[[tag]],info=Delete[info,tag]], - If[textInfo[[tag]]!="",AppendTo[info,tag->textInfo[[tag]]]] + filename=path<>"Songs\\"<>song<>"."<>index[[song,"Format"]]; + hash=toBase32@FileHash[filename]; + If[KeyExistsQ[bufferHash,song], + If[bufferHash[[song]]==hash && FileExistsQ[userPath<>"Buffer\\"<>song<>".buffer"], + Continue[], + AppendTo[updates,song]; + ], + AppendTo[bufferHash,song->hash]; + AppendTo[updates,song]; ], - {tag,textInfoTags}]; - index[[song]]=info; - writeInfo[song,index[[song]]]; + {song,songs}]; + If[updates=={},Return[]]; + Monitor[Do[ + song=updates[[i]]; + filename=path<>"Songs\\"<>song<>"."<>index[[song,"Format"]]; + bufferHash[[song]]=toBase32@FileHash[filename]; + If[index[[song,"Format"]]=="qys", + audio=QYSParse[filename], + audio=QYMParse[filename] + ]; + messages=Values[Options[audio,MetaInformation]][[1]][["Messages"]]; + If[KeyExistsQ[errorLog,song], + errorLog[[song]]=messages, + AppendTo[errorLog,song->messages] + ]; + Export[userPath<>"Buffer\\"<>song<>".buffer",audio,"MP3"], + {i,Length@updates}], + Panel[Column[{Spacer[{4,4}], + text[["UpdatingBuffer"]], + Spacer[1], + ProgressIndicator[i,{1,Length@updates},ImageSize->{320,16}], + Spacer[1], + Row[{ + caption["_Progression","Text",{i,Length@updates}], + Spacer[4],text[["Loading"]], + index[[updates[[i]],"SongName"]] + }], + Spacer[{4,4}]},Alignment->Center],ImageSize->400,Alignment->Center]]; + Export[userPath<>"Buffer.json",Normal@bufferHash[[Intersection[Keys@bufferHash,songs]]]]; ]; From 59f61e84b56a7dc5f19b2a4892639292d64f41f2 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sun, 21 Jan 2018 01:04:52 +0800 Subject: [PATCH 45/54] File system modification --- assets.wl => Lib/assets.wl | 0 library.wl => Lib/library.wl | 0 parser.wl => Lib/parser.wl | 0 qymToken.wl => Lib/qymToken.wl | 0 qysToken.wl => Lib/qysToken.wl | 0 Lib/uiDeve.wl | 91 ++++++++++++++++++++++++++++++++++ interface.wl => Lib/uiUser.wl | 91 ---------------------------------- QYMP.wl | 13 ++--- 8 files changed, 98 insertions(+), 97 deletions(-) rename assets.wl => Lib/assets.wl (100%) rename library.wl => Lib/library.wl (100%) rename parser.wl => Lib/parser.wl (100%) rename qymToken.wl => Lib/qymToken.wl (100%) rename qysToken.wl => Lib/qysToken.wl (100%) create mode 100644 Lib/uiDeve.wl rename interface.wl => Lib/uiUser.wl (78%) diff --git a/assets.wl b/Lib/assets.wl similarity index 100% rename from assets.wl rename to Lib/assets.wl diff --git a/library.wl b/Lib/library.wl similarity index 100% rename from library.wl rename to Lib/library.wl diff --git a/parser.wl b/Lib/parser.wl similarity index 100% rename from parser.wl rename to Lib/parser.wl diff --git a/qymToken.wl b/Lib/qymToken.wl similarity index 100% rename from qymToken.wl rename to Lib/qymToken.wl diff --git a/qysToken.wl b/Lib/qysToken.wl similarity index 100% rename from qysToken.wl rename to Lib/qysToken.wl diff --git a/Lib/uiDeve.wl b/Lib/uiDeve.wl new file mode 100644 index 0000000..626919e --- /dev/null +++ b/Lib/uiDeve.wl @@ -0,0 +1,91 @@ +(* ::Package:: *) + +uiModifySong[song_]:=DynamicModule[{textInfo}, + textInfo=index[[song,textInfoTags]]; + CreateDialog[Column[{Spacer[{20,20}], + caption[textInfo[["SongName"]],"Title"], + Spacer[1], + Column[Row[{Spacer[40], + caption[tagName[[#]],"Text"], + Spacer[16], + InputField[Dynamic@textInfo[[#]],String], + Spacer[40]}]&/@textInfoTags], + Spacer[1], + Grid[{ + {Button[text[["Save"]],putTextInfo[song,textInfo],ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], + Button[text[["Undo"]],textInfo=index[[song,textInfoTags]],ImageSize->150]}, + {Button[text[["DeleteSong"]],DialogReturn[uiDeleteSong[song]],ImageSize->150], + Button[text[["Return"]],DialogReturn[refresh;uiPlaylist["All"]],ImageSize->150]} + }],Spacer[{20,20}] + },Center,ItemSize->Full,Spacings->1], + Background->styleColor[["Background"]],WindowTitle->text[["ModifySong"]]]; +]; + + +putTextInfo[song_,textInfo_]:=Module[ + {info=index[[song]]}, + Do[ + info[[tag]]=textInfo[[tag]], + {tag,textInfoTags}]; + index[[song]]=info; + Export[path<>"Meta\\"<>song<>".json",index[[song]]]; +]; + + +tagTemplate=<|"Image"->"","Uploader"->"","Tags"->{}|>; +addSong[songPath_,textInfo_]:=Module[{song,metaInfo,audio,format}, + song=StringDrop[songPath,-4]; + format=StringTake[songPath,-3]; + audio=If[format=="qys",QYSParse,QYMParse][path<>"Songs\\"<>songPath]; + Export[userPath<>"Buffer\\"<>song<>".buffer",audio,"MP3"]; + AppendTo[bufferHash,song->toBase32@FileHash[path<>"Songs\\"<>songPath]]; + Export[userPath<>"Buffer.json",Normal@bufferHash]; + AppendTo[index,song->Join[textInfo,tagTemplate,<|"Format"->format|>]]; + putTextInfo[song,textInfo]; +]; + + +ignoreList={"temp.qys","test.qys"}; +uiAddSong:=DynamicModule[{songPath,textInfo,candidates}, + textInfo=AssociationMap[""&,textInfoTags]; + SetDirectory[path]; + candidates=Complement[StringDrop[FileNames["*.qys"|"*.qym","Songs",Infinity],6], + #<>"."<>index[[#,"Format"]]&/@songs, + ignoreList + ]; + CreateDialog[Column[{Spacer[{40,40}], + caption["_AddSong","Title"], + Spacer[4], + Row[{text[["SongPath"]],Spacer[12],PopupMenu[Dynamic@songPath,candidates,ImageSize->200]}], + Column[Row[{Spacer[40], + caption[tagName[[#]],"Text"], + Spacer[16], + InputField[Dynamic@textInfo[[#]],String], + Spacer[40]}]&/@textInfoTags], + Spacer[4], + Row[{Button[text[["Add"]],addSong[songPath,textInfo];DialogReturn[QYMP], + ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], + Spacer[20], + Button[text[["Return"]],DialogReturn[refresh;uiPlaylist["All"]],ImageSize->150]}], + Spacer[{40,40}]},Center,ItemSize->Full,Spacings->1], + Background->styleColor[["Background"]],WindowTitle->text[["AddSong"]]] +]; + + +(* ::Input:: *) +(*uiAddSong;*) + + +uiDeleteSong[song_]:=CreateDialog[Column[{"", + text[["SureToRemove"]],"", + Row[{ + Button[text[["Confirm"]], + index=Delete[index,song]; + DeleteFile[path<>"Meta\\"<>song<>".meta"]; + DialogReturn[refresh;uiPlaylist["All"]], + ImageSize->100], + Spacer[20], + Button[text[["Return"]],DialogReturn[uiModifySong[song]],ImageSize->100] + }],"" +},Center,ItemSize->36], +Background->styleColor[["Background"]],WindowTitle->text[["DeleteSong"]]]; diff --git a/interface.wl b/Lib/uiUser.wl similarity index 78% rename from interface.wl rename to Lib/uiUser.wl index d307686..998a1d7 100644 --- a/interface.wl +++ b/Lib/uiUser.wl @@ -173,97 +173,6 @@ uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, ]; -uiModifySong[song_]:=DynamicModule[{textInfo}, - textInfo=index[[song,textInfoTags]]; - CreateDialog[Column[{Spacer[{20,20}], - caption[textInfo[["SongName"]],"Title"], - Spacer[1], - Column[Row[{Spacer[40], - caption[tagName[[#]],"Text"], - Spacer[16], - InputField[Dynamic@textInfo[[#]],String], - Spacer[40]}]&/@textInfoTags], - Spacer[1], - Grid[{ - {Button[text[["Save"]],putTextInfo[song,textInfo],ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], - Button[text[["Undo"]],textInfo=index[[song,textInfoTags]],ImageSize->150]}, - {Button[text[["DeleteSong"]],DialogReturn[uiDeleteSong[song]],ImageSize->150], - Button[text[["Return"]],DialogReturn[refresh;uiPlaylist["All"]],ImageSize->150]} - }],Spacer[{20,20}] - },Center,ItemSize->Full,Spacings->1], - Background->styleColor[["Background"]],WindowTitle->text[["ModifySong"]]]; -]; - - -putTextInfo[song_,textInfo_]:=Module[ - {info=index[[song]]}, - Do[ - info[[tag]]=textInfo[[tag]], - {tag,textInfoTags}]; - index[[song]]=info; - Export[path<>"Meta\\"<>song<>".json",index[[song]]]; -]; - - -tagTemplate=<|"Image"->"","Uploader"->"","Tags"->{}|>; -addSong[songPath_,textInfo_]:=Module[{song,metaInfo,audio,format}, - song=StringDrop[songPath,-4]; - format=StringTake[songPath,-3]; - audio=If[format=="qys",QYSParse,QYMParse][path<>"Songs\\"<>songPath]; - Export[userPath<>"Buffer\\"<>song<>".buffer",audio,"MP3"]; - AppendTo[bufferHash,song->toBase32@FileHash[path<>"Songs\\"<>songPath]]; - Export[userPath<>"Buffer.json",Normal@bufferHash]; - AppendTo[index,song->Join[textInfo,tagTemplate,<|"Format"->format|>]]; - putTextInfo[song,textInfo]; -]; - - -ignoreList={"temp.qys","test.qys"}; -uiAddSong:=DynamicModule[{songPath,textInfo,candidates}, - textInfo=AssociationMap[""&,textInfoTags]; - SetDirectory[path]; - candidates=Complement[StringDrop[FileNames["*.qys"|"*.qym","Songs",Infinity],6], - #<>"."<>index[[#,"Format"]]&/@songs, - ignoreList - ]; - CreateDialog[Column[{Spacer[{40,40}], - caption["_AddSong","Title"], - Spacer[4], - Row[{text[["SongPath"]],Spacer[12],PopupMenu[Dynamic@songPath,candidates,ImageSize->200]}], - Column[Row[{Spacer[40], - caption[tagName[[#]],"Text"], - Spacer[16], - InputField[Dynamic@textInfo[[#]],String], - Spacer[40]}]&/@textInfoTags], - Spacer[4], - Row[{Button[text[["Add"]],addSong[songPath,textInfo];DialogReturn[QYMP], - ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], - Spacer[20], - Button[text[["Return"]],DialogReturn[refresh;uiPlaylist["All"]],ImageSize->150]}], - Spacer[{40,40}]},Center,ItemSize->Full,Spacings->1], - Background->styleColor[["Background"]],WindowTitle->text[["AddSong"]]] -]; - - -(* ::Input:: *) -(*uiAddSong;*) - - -uiDeleteSong[song_]:=CreateDialog[Column[{"", - text[["SureToRemove"]],"", - Row[{ - Button[text[["Confirm"]], - index=Delete[index,song]; - DeleteFile[path<>"Meta\\"<>song<>".meta"]; - DialogReturn[refresh;uiPlaylist["All"]], - ImageSize->100], - Spacer[20], - Button[text[["Return"]],DialogReturn[uiModifySong[song]],ImageSize->100] - }],"" -},Center,ItemSize->36], -Background->styleColor[["Background"]],WindowTitle->text[["DeleteSong"]]]; - - uiAbout:=CreateDialog[Column[{Spacer[{40,40}], caption["_About","Title"], Spacer[{20,20}], diff --git a/QYMP.wl b/QYMP.wl index 167d66b..cf5a942 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -5,12 +5,13 @@ path=NotebookDirectory[]; -<<(path<>"library.wl") -<<(path<>"assets.wl") -<<(path<>"interface.wl") -<<(path<>"qymToken.wl") -<<(path<>"qysToken.wl") -<<(path<>"parser.wl") +<<(path<>"Lib\\library.wl") +<<(path<>"Lib\\assets.wl") +<<(path<>"Lib\\uiUser.wl") +<<(path<>"Lib\\uiDeve.wl") +<<(path<>"Lib\\qymToken.wl") +<<(path<>"Lib\\qysToken.wl") +<<(path<>"Lib\\parser.wl") (* temporary function *) From a238eb210e5cefe7e17fd89026507a027ad0e6c8 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sun, 21 Jan 2018 12:07:43 +0800 Subject: [PATCH 46/54] Add some adjustments in language system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复了英文状态下的几个显示问题 2. 重新将英语加入可选语言列表 3. 优化了部分设计语言的代码 --- Lang/chs.json | 5 +++-- Lang/eng.json | 33 +++++++++++++++++---------------- Lib/library.wl | 22 ++++++++++++++++++++++ Lib/uiDeve.wl | 16 ++++++++++------ Lib/uiUser.wl | 21 +++++++++++---------- QYMP.wl | 31 +++++++++---------------------- 6 files changed, 72 insertions(+), 56 deletions(-) diff --git a/Lang/chs.json b/Lang/chs.json index 83aa86d..f301346 100644 --- a/Lang/chs.json +++ b/Lang/chs.json @@ -9,7 +9,8 @@ "Abstract": "摘要", "Origin": "原曲", "Format": "格式", - "TrackCount": "音轨数", + "SectionCount": "乐章数", + "RealTrackCount": "实际音轨数", "Duration": "时长", "Instruments": "乐器", "URL": "地址", @@ -114,7 +115,7 @@ "InvalidFunction": "声明了无效函数名$1", "BarLengthError": "拍数错误: 应为&1拍, 实际为&2拍", "ExpectPitch": "应该使用音高1~7或和弦", - "ExpectPrecussion": "应该使用打击乐标记x或X", + "ExpectPrecussion": "应该使用打击乐标记x", "DiffDuration": "各音轨长度不统一:#1" } } \ No newline at end of file diff --git a/Lang/eng.json b/Lang/eng.json index d8ff8be..33345d4 100644 --- a/Lang/eng.json +++ b/Lang/eng.json @@ -7,8 +7,10 @@ "Adapter": "Adapter", "Comment": "Comment", "Abstract": "Abstract", + "Origin": "Origin", "Format": "Format", - "TrackCount": "Number of Tracks", + "SectionCount": "Number of Sections", + "RealTrackCount": "Number of Actual Tracks", "Duration": "Duration", "Instruments": "Instruments", "URL": "URL", @@ -61,20 +63,6 @@ "Whistle": "Whistle", "Xylophone": "Xylophone" }, - "Error": { - "FileNotFound": "Cannot find file \"$1\".", - "TerminatorAbsent": "(Section &1, Track &2) Terminator cannot be found.", - "RepeatError": "(Section &1, Track &2) Cannot match the repeat marks.", - "InvalidTonality": "(Section &1, Track &2, Measure &3) Invalid tonality\"$4\".", - "InvalidInstrument": "(Section &1, Track &2, Measure &3) Invalid instrument\"$4\".", - "InvalidCharacter": "(Section &1, Track &2, Measure &3) Invalid character\"$4\".", - "InvalidFunction": "(Section &1, Track &2, Measure &3) Invalid function\"$4\".", - "BarLengthError": "(Section &1, Track &2, Measure &3) Wrong number of beats: should be &4, but actually is &5.", - "NoFormerPitch": "(Section &1, Track &2, Measure &3) Operator \"%\" needs a previous pitch.", - "ExpectPitch": "(Section &1, Track &2, Measure &3) Expect a pitch (1~7 or chord[]).", - "ExpectPrecussion": "(Section &1, Track &2, Measure &3) Expect a precussion sign (x or X).", - "DiffDuration": "(Section &1) The length of each track is not uniform:#2." - }, "Caption": { "QYMP": "Qingyun Music Player", "Playlist": "Playlist", @@ -115,6 +103,19 @@ "Version": "1.5", "Producer": "Ob Studio", "Website": "www.qymp.tk" - } + }, + "Section": "Section &1", + "Track": "Track &1", + "Bar": "Measure &1", + "FileNotFound": "Cannot find file $1.", + "TerminatorAbsent": "Terminator cannot be found.", + "InvalidTonality": "Invalid tonality $1 was found.", + "InvalidInstrument": "Invalid instrument $1 was found.", + "InvalidExpression": "Invalid expression $1 was found.", + "InvalidFunction": "Invalid function $1 was found.", + "BarLengthError": "Number of beats is expected to be &1, but &2 was found.", + "ExpectPitch": "Expect a pitch (1~7 or chord[]).", + "ExpectPrecussion": "Expect a precussion sign (x).", + "DiffDuration": "The length of each track is not uniform:#2." } } \ No newline at end of file diff --git a/Lib/library.wl b/Lib/library.wl index 8023d94..57dd416 100644 --- a/Lib/library.wl +++ b/Lib/library.wl @@ -1,5 +1,14 @@ (* ::Package:: *) +(* tags *) +metaInfoTags={"SectionCount","RealTrackCount","Duration","Instruments"}; +textInfoTags={"SongName","Lyricist","Composer","Adapter","Comment","Abstract","Origin"}; +otherInfoTags={"Format","Image","Uploader","Tags"}; +imageTags={"Title","Painter","PainterID","IllustID","URL"}; +aboutTags={"Version","Producer","Website"}; +langList={"chs","eng"}; + + (* some functions *) textLength[string_]:=2StringLength[string]-StringCount[string,Alternatives@CharacterRange[32,127]]; toBase32[n_]:=StringDelete[ToString@BaseForm[n,32],"\n"~~__]; @@ -41,6 +50,19 @@ getArgument[string_,function_]:=Switch[function, ]; +(* ::Text:: *) +(*Refresh & Update*) + + +refreshLanguage:=Module[{langData}, + langData=dictionary[[userInfo[["Language"]]]]; + tagName=Association@langData[["TagName"]]; + instrName=Association@langData[["Instrument"]]; + text=Association@langData[["Caption"]]; + aboutInfo=Association@text[["AboutQYMP"]] +]; + + refresh:=Module[ { metaTree,songsClassified, diff --git a/Lib/uiDeve.wl b/Lib/uiDeve.wl index 626919e..ef50111 100644 --- a/Lib/uiDeve.wl +++ b/Lib/uiDeve.wl @@ -5,11 +5,11 @@ uiModifySong[song_]:=DynamicModule[{textInfo}, CreateDialog[Column[{Spacer[{20,20}], caption[textInfo[["SongName"]],"Title"], Spacer[1], - Column[Row[{Spacer[40], + Grid[{Spacer[40], caption[tagName[[#]],"Text"], - Spacer[16], + Spacer[2], InputField[Dynamic@textInfo[[#]],String], - Spacer[40]}]&/@textInfoTags], + Spacer[40]}&/@textInfoTags,Alignment->Right], Spacer[1], Grid[{ {Button[text[["Save"]],putTextInfo[song,textInfo],ImageSize->150,Enabled->Dynamic[textInfo[["SongName"]]!=""]], @@ -22,6 +22,10 @@ uiModifySong[song_]:=DynamicModule[{textInfo}, ]; +(* ::Input:: *) +(*uiModifySong["Anima"];*) + + putTextInfo[song_,textInfo_]:=Module[ {info=index[[song]]}, Do[ @@ -36,12 +40,12 @@ tagTemplate=<|"Image"->"","Uploader"->"","Tags"->{}|>; addSong[songPath_,textInfo_]:=Module[{song,metaInfo,audio,format}, song=StringDrop[songPath,-4]; format=StringTake[songPath,-3]; + AppendTo[index,song->Join[textInfo,tagTemplate,<|"Format"->format|>]]; + putTextInfo[song,textInfo]; audio=If[format=="qys",QYSParse,QYMParse][path<>"Songs\\"<>songPath]; Export[userPath<>"Buffer\\"<>song<>".buffer",audio,"MP3"]; AppendTo[bufferHash,song->toBase32@FileHash[path<>"Songs\\"<>songPath]]; Export[userPath<>"Buffer.json",Normal@bufferHash]; - AppendTo[index,song->Join[textInfo,tagTemplate,<|"Format"->format|>]]; - putTextInfo[song,textInfo]; ]; @@ -81,7 +85,7 @@ uiDeleteSong[song_]:=CreateDialog[Column[{"", Row[{ Button[text[["Confirm"]], index=Delete[index,song]; - DeleteFile[path<>"Meta\\"<>song<>".meta"]; + DeleteFile[path<>"Meta\\"<>song<>".json"]; DialogReturn[refresh;uiPlaylist["All"]], ImageSize->100], Spacer[20], diff --git a/Lib/uiUser.wl b/Lib/uiUser.wl index 998a1d7..9e48244 100644 --- a/Lib/uiUser.wl +++ b/Lib/uiUser.wl @@ -1,10 +1,11 @@ (* ::Package:: *) -uiSettings:=DynamicModule[{choices}, +uiSettings:=DynamicModule[{choices,langDict}, choices=userInfo; + langDict=#->caption[Association[Import[path<>"Lang\\"<>#<>".json"]][["LanguageName"]],"Text"]&/@langList; CreateDialog[Column[{Spacer[{40,40}], caption["_Settings","Title"],Spacer[1], - Grid[{ + Row[{Spacer[40],Grid[{ {caption["_ChooseIdentity","Text"], RadioButtonBar[Dynamic@choices[["Developer"]],{ False->caption["_NormalUser","Text"], @@ -20,26 +21,26 @@ uiSettings:=DynamicModule[{choices}, {caption["_ChooseLanguage","Text"], RadioButtonBar[Dynamic@choices[["Language"]],langDict]} } - ],Spacer[1], - Row[{Spacer[80], + ],Spacer[40]}],Spacer[1], + Row[{ Button[text[["Save"]], - langData=Association@Import[path<>"Lang\\"<>choices[["Language"]]<>".json"]; - tagName=Association@langData[["TagName"]]; - instrName=Association@langData[["Instrument"]]; - text=Association@langData[["Caption"]]; - aboutInfo=Association@text[["AboutQYMP"]]; userInfo=choices; Export[userPath<>"Default.json",Normal@userInfo]; + refreshLanguage; DialogReturn[QYMP], ImageSize->150], Spacer[10], Button[text[["Return"]],DialogReturn[QYMP],ImageSize->150], - Spacer[80]}],Spacer[{40,40}] + }],Spacer[{40,40}] },Center,ItemSize->Full], Background->styleColor[["Background"]],WindowTitle->text[["Settings"]]] ]; +(* ::Input:: *) +(*uiSettings;*) + + (* ::Input:: *) (*uiPlayer["Touhou\\Dream_Battle"]*) diff --git a/QYMP.wl b/QYMP.wl index cf5a942..7323e71 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -5,13 +5,13 @@ path=NotebookDirectory[]; -<<(path<>"Lib\\library.wl") -<<(path<>"Lib\\assets.wl") -<<(path<>"Lib\\uiUser.wl") -<<(path<>"Lib\\uiDeve.wl") -<<(path<>"Lib\\qymToken.wl") -<<(path<>"Lib\\qysToken.wl") -<<(path<>"Lib\\parser.wl") +<<(path<>"Lib\\library.wl") (* library *) +<<(path<>"Lib\\assets.wl") (* graphics *) +<<(path<>"Lib\\uiUser.wl") (* UI for common users *) +<<(path<>"Lib\\uiDeve.wl") (* UI for developers *) +<<(path<>"Lib\\qymToken.wl") (* QYM tokenizer *) +<<(path<>"Lib\\qysToken.wl") (* QYS tokenizer *) +<<(path<>"Lib\\parser.wl") (* parser *) (* temporary function *) @@ -24,7 +24,6 @@ version=201; userPath=$HomeDirectory<>"\\AppData\\Local\\QYMP\\"; cloudPath="http://qymp.ob-studio.cn/assets/"; If[!DirectoryQ[userPath],CreateDirectory[userPath]]; -If[!DirectoryQ[userPath<>"export\\"],CreateDirectory[userPath<>"export\\"]]; If[!DirectoryQ[userPath<>"buffer\\"],CreateDirectory[userPath<>"buffer\\"]]; If[!DirectoryQ[userPath<>"images\\"],CreateDirectory[userPath<>"images\\"]]; template=<|"Version"->version,"Language"->"chs","Developer"->False,"Player"->"Old"|>; @@ -39,8 +38,6 @@ If[userInfo[["Version"]]"Buffer.json"],Export[userPath<>"Buffer.json",{}]]; bufferHash=Association@Import[userPath<>"Buffer.json"]; -If[!FileExistsQ[userPath<>"ErrorLog.json"],Export[userPath<>"ErrorLog.json",{}]]; -errorLog=Association@Import[userPath<>"ErrorLog.json"]; If[!FileExistsQ[userPath<>"Favorite.json"],Export[userPath<>"Favorite.json",{}]]; favorite=Import[userPath<>"Favorite.json"]; If[!FileExistsQ[userPath<>"Image.json"],Export[userPath<>"Image.json",{}]]; @@ -60,18 +57,8 @@ styleDict=Normal@Module[{outcome={}}, If[KeyExistsQ[#,"FontWeight"],AppendTo[outcome,FontWeight->ToExpression@#[["FontWeight"]]]]; If[KeyExistsQ[#,"FontColor"],AppendTo[outcome,FontColor->styleColor[[#[["FontColor"]]]]]]; outcome]&/@styleData; -langList={"chs"(*,"eng"*)}; (* languages *) -langDict=#->caption[Association[Import[path<>"Lang\\"<>#<>".json"]][["LanguageName"]],"Text"]&/@langList; -langData=Association@Import[path<>"Lang\\"<>userInfo[["Language"]]<>".json"]; -tagName=Association@langData[["TagName"]]; -instrName=Association@langData[["Instrument"]]; -text=Association@langData[["Caption"]]; -aboutInfo=Association@text[["AboutQYMP"]]; -metaInfoTags={"Format","TrackCount","Duration","Instruments"}; (* tags *) -textInfoTags={"SongName","Lyricist","Composer","Adapter","Comment","Abstract","Origin"}; -otherInfoTags={"Format","Image","Uploader","Tags"}; -imageTags={"Title","Painter","PainterID","IllustID","URL"}; -aboutTags={"Version","Producer","Website"}; +dictionary=Association/@AssociationMap[Import[path<>"Lang\\"<>#<>".json"]&,langList]; (* languages *) +refreshLanguage; (* ::Input::Initialization:: *) From 13cb24705787eab1b76545c4f660039a536eaf04 Mon Sep 17 00:00:00 2001 From: NN708 Date: Sun, 21 Jan 2018 12:21:51 +0800 Subject: [PATCH 47/54] Fix a bug --- Lib/uiUser.wl | 2 +- Meta/Diving_Girl.json | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Meta/Diving_Girl.json diff --git a/Lib/uiUser.wl b/Lib/uiUser.wl index 9e48244..d5286e2 100644 --- a/Lib/uiUser.wl +++ b/Lib/uiUser.wl @@ -30,7 +30,7 @@ uiSettings:=DynamicModule[{choices,langDict}, DialogReturn[QYMP], ImageSize->150], Spacer[10], - Button[text[["Return"]],DialogReturn[QYMP],ImageSize->150], + Button[text[["Return"]],DialogReturn[QYMP],ImageSize->150] }],Spacer[{40,40}] },Center,ItemSize->Full], Background->styleColor[["Background"]],WindowTitle->text[["Settings"]]] diff --git a/Meta/Diving_Girl.json b/Meta/Diving_Girl.json new file mode 100644 index 0000000..fee646a --- /dev/null +++ b/Meta/Diving_Girl.json @@ -0,0 +1,13 @@ +{ + "SongName": "潜海姑娘", + "Lyricist": "", + "Composer": "王立平", + "Adapter": "", + "Comment": "", + "Abstract": "", + "Origin": "", + "Image": "", + "Uploader": "", + "Tags": [], + "Format": "qym" +} \ No newline at end of file From bb42d45326bb875dcac4d4e905ca63d3a7d69d0b Mon Sep 17 00:00:00 2001 From: NN708 Date: Sun, 21 Jan 2018 12:29:22 +0800 Subject: [PATCH 48/54] update website --- Lang/chs.json | 2 +- Lang/eng.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lang/chs.json b/Lang/chs.json index f301346..0b5de83 100644 --- a/Lang/chs.json +++ b/Lang/chs.json @@ -102,7 +102,7 @@ "AboutQYMP": { "Version": "1.5", "Producer": "鄂毕工作室", - "Website": "www.qymp.tk" + "Website": "http://qymp.ob-studio.cn/" }, "Section": "章节&1", "Track": "音轨&1", diff --git a/Lang/eng.json b/Lang/eng.json index 33345d4..25d71ee 100644 --- a/Lang/eng.json +++ b/Lang/eng.json @@ -102,7 +102,7 @@ "AboutQYMP": { "Version": "1.5", "Producer": "Ob Studio", - "Website": "www.qymp.tk" + "Website": "http://qymp.ob-studio.cn/" }, "Section": "Section &1", "Track": "Track &1", From 62863c51afc7ac5089ed9cc071b0a6d1a2ffad42 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sun, 21 Jan 2018 15:30:08 +0800 Subject: [PATCH 49/54] New Song: Hana ni Kaze MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增了一首歌曲《月に叢雲華に風》 2. 播放界面增加了对标签"Origin"的支持 --- Lib/library.wl | 4 - Lib/parser.wl | 22 ++- Lib/uiUser.wl | 7 +- Meta/Touhou/TH11-Chireiden/Hana_ni_Kaze.json | 13 ++ Playlists/Touhou.qyl | 1 + .../{ => TH11-Chireiden}/Hana_ni_Kaze.qys | 185 ++++++++++++++++-- color.json | 2 +- 7 files changed, 205 insertions(+), 29 deletions(-) create mode 100644 Meta/Touhou/TH11-Chireiden/Hana_ni_Kaze.json rename Songs/Touhou/{ => TH11-Chireiden}/Hana_ni_Kaze.qys (56%) diff --git a/Lib/library.wl b/Lib/library.wl index 57dd416..b855cc5 100644 --- a/Lib/library.wl +++ b/Lib/library.wl @@ -171,10 +171,6 @@ updateBuffer:=Module[{updates={},song,filename,hash,audio,messages,bufferList}, audio=QYMParse[filename] ]; messages=Values[Options[audio,MetaInformation]][[1]][["Messages"]]; - If[KeyExistsQ[errorLog,song], - errorLog[[song]]=messages, - AppendTo[errorLog,song->messages] - ]; Export[userPath<>"Buffer\\"<>song<>".buffer",audio,"MP3"], {i,Length@updates}], Panel[Column[{Spacer[{4,4}], diff --git a/Lib/parser.wl b/Lib/parser.wl index 1b2735c..d11d266 100644 --- a/Lib/parser.wl +++ b/Lib/parser.wl @@ -335,19 +335,31 @@ parse[tokenizer_,sections_]:=Module[ (* ::Input:: *) -(*debug[#Messages]&@parse[QYS`Tokenize[path<>"Songs\\Touhou\\Hana_ni_Kaze.qys"],All]*) +(*debug[#Messages]&@parse[QYS`Tokenize[path<>"Songs\\Touhou\\Hana_ni_Kaze.qys"],9]*) (* ::Input:: *) (*AudioStop[];AudioPlay[#[[2]]]&@*) (*EchoFunction["time: ",#[[1]]&]@*) -(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\test.qys"],5]]];*) +(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\temp.qys"],All]]];*) (* ::Input:: *) (*AudioStop[];AudioPlay[#[[2]]]&@*) (*EchoFunction["time: ",#[[1]]&]@*) -(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\Touhou\\Hana_ni_Kaze.qys"],{5,6}]]];*) +(*Timing[integrate[#MusicClips,#Effects]&[parse[QYS`Tokenize[path<>"Songs\\Touhou\\Hana_ni_Kaze.qys"],9]]];*) + + +(* ::Input:: *) +(*EmitSound@Sound@SoundNote[0,1,"GuitarDistorted"]*) + + +(* ::Input:: *) +(*EmitSound@Sound@SoundNote[0,1,"Ocarina"]*) + + +(* ::Input:: *) +(*QYMP;*) debug[messages_]:=Module[{output={},sectionOutput}, @@ -442,10 +454,6 @@ integrate[tracks_,effects_]:=Module[ (*AudioStop[];*) -(* ::Input:: *) -(*EmitSound@Sound@SoundNote[12,1,"SopranoSax"]*) - - (* ::Input:: *) (*EmitSound@Sound@SoundNote["HighTom",1]*) diff --git a/Lib/uiUser.wl b/Lib/uiUser.wl index d5286e2..5cf7a67 100644 --- a/Lib/uiUser.wl +++ b/Lib/uiUser.wl @@ -143,9 +143,8 @@ uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, Spacer[{40,40}]}]}],Nothing],Spacer[48], Column[Join[{Spacer[{60,60}], If[index[[song,"Comment"]]!="", - If[textLength@index[[song,"SongName"]]>16||textLength@index[[song,"Comment"]]>16, - Column, - Row + If[textLength@index[[song,"Comment"]]>16, + Column,Row ][{ caption[index[[song,"SongName"]],"Title"], caption[" ("<>index[[song,"Comment"]]<>")","TitleComment"] @@ -156,7 +155,7 @@ uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, Column[If[index[[song,#]]!="", caption[tagName[[#]]<>": "<>index[[song,#]],"Text"], Nothing - ]&/@{"Composer","Lyricist","Adapter"},Alignment->Center], + ]&/@{"Origin","Composer","Lyricist","Adapter"},Alignment->Center], Spacer[1], If[index[[song,"Abstract"]]!="", Column[caption[#,"Text"]&/@StringSplit[index[[song,"Abstract"]],"\n"],Center], diff --git a/Meta/Touhou/TH11-Chireiden/Hana_ni_Kaze.json b/Meta/Touhou/TH11-Chireiden/Hana_ni_Kaze.json new file mode 100644 index 0000000..e463442 --- /dev/null +++ b/Meta/Touhou/TH11-Chireiden/Hana_ni_Kaze.json @@ -0,0 +1,13 @@ +{ + "SongName": "月于丛云花于风", + "Lyricist": "かませ虎", + "Composer": "ZUN", + "Adapter": "Iceon", + "Comment": "月に叢雲花に風", + "Abstract": "《幻想万华镜·红雾异变之章·中篇》插曲", + "Origin": "ラストリモート", + "Image": "", + "Uploader": "", + "Tags": [], + "Format": "qys" +} \ No newline at end of file diff --git a/Playlists/Touhou.qyl b/Playlists/Touhou.qyl index 2a4396b..fc1ae7c 100644 --- a/Playlists/Touhou.qyl +++ b/Playlists/Touhou.qyl @@ -14,6 +14,7 @@ {"Index": "地灵殿二面BOSS曲", "Song": "TH11-Chireiden\\Ryokugann_No_Jealousy"}, {"Index": "地灵殿六面BOSS曲", "Song": "TH11-Chireiden\\Nuclear_Fusion"}, {"Index": "地灵殿EX面BOSS曲", "Song": "TH11-Chireiden\\Hartmann_No_Youkai_Otome"}, + {"Index": "地灵殿改编曲", "Song": "TH11-Chireiden\\Hana_ni_Kaze"}, {"Index": "星莲船六面道中曲", "Song": "Houkainohi"}, {"Index": "绀珠传一面道中曲", "Song": "TH15-Kanjuden\\Wasuregataki"}, {"Index": "绀珠传一面BOSS曲", "Song": "TH15-Kanjuden\\Usagi_ha_Mai_Orita"}, diff --git a/Songs/Touhou/Hana_ni_Kaze.qys b/Songs/Touhou/TH11-Chireiden/Hana_ni_Kaze.qys similarity index 56% rename from Songs/Touhou/Hana_ni_Kaze.qys rename to Songs/Touhou/TH11-Chireiden/Hana_ni_Kaze.qys index 48476e7..f8c3558 100644 --- a/Songs/Touhou/Hana_ni_Kaze.qys +++ b/Songs/Touhou/TH11-Chireiden/Hana_ni_Kaze.qys @@ -18,7 +18,7 @@ <0.3>0-\ 0-|0-|0-|0-|5$-|4M-|5$-^|%-`| -<0.7>0-\ +<0.6>0-\ 0-|0-|0-|0-|0-|0-|0-|03b__4__5#_| <0.4>0-\ @@ -42,7 +42,7 @@ 1o-^|%2o|5,o-^|%1o__[35]__7,o__[35]__\ 1o-^|%7,o|1o_.7,o_.6,__5#,__^|%-`| -<1.0>\ +<0.8>\ 23_5.3_2_^|%-..5_^|%_4_3_2_(3~)7,15,^|%-2_3_5_3_\ 5.6.-^|%.1'7_6_5_|5--6_5#_^|%---`| @@ -57,13 +57,26 @@ //-------------------- Section C -------------------- <1=bE> -<1.0>\ +<1.0>\ 6,-3-|7,--6,_7,_|1.2.7,|1--3_5_\ 6.5.4|51'75|(2^)3---^|%---`\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0.54_3b_4_|0---|0.54_3b_1#_\ +0---|0.3b2_3b_5_|4_.5_.5#_7b_.5#_.7b_|5---^|%-0-| + +<1.0>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ 3-5-|2.-5#6_|7_5_3_1'_5_3_2'|1'71'6_7_\ -1'_7_6_5_6.1'_^|1'_7_6_5_6_7_3_5_|6---^|%---`\ -1-02-023b^|%-05-43b4|1#-03b-04-^|%-05-43b1#\ -1-02-023b^|%-03b-23b5|4.5.5#7b.5#.7b|5---^|%-`23| +1'_7_6_5_6.1'_^|1'_7_6_5_6_7_3_5_|6---^|%---`\ +10_20_2_3b_^|%-0-|1#0_3b0_4^|%-0-\ +10_20_2_3b_^|%-0-|4_.5_.5#_7b_.5#_.7b_|5---^|%-0-| + +<1.0>\ +0-|0-|0-|0-|0-|0-|0-|0-\ +0-|0-|0-|0-|0-|0-|0-|0-\ +0-|0-|0-|0-|0-|0-|0-|0-|02_3_| <0.4>\ 6---[63']1'--|[5#7]--3'[5#7]'---|[51']351'351'3'|[4#2']--3'[36]'---\ @@ -163,24 +176,37 @@ 6.%.%-%%%|6.%.%-%%%|6.%.%-%%%|6.6.61'373\ 4.%.%-%%%|4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%| -<1.0>\ +<0.8>\ 1'71'1'---`7^|%1'75---`5|{43217,12176564543|23217,1217,6,7,12345}\ -6,1-2-321^|%--5--45|1'7-5--6-|5#-| +6,1-2-321^|%--5--45|1'7-5--6-|5#-`| <0.1>\ 6.%.%-%%%|6.%.%-%%%|6.%.%-%%%|6.6.61'575\ 4.%.%-%%%|4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%| -//-------------------- Section F -------------------- +//-------------------- Section F(C') -------------------- <1=bE> -<1.0>\ +<1.0>\ 6,-3-|7,--6,_7,_|1.2.7,|1--3_5_\ 6.5.4|51'75|(2^)3---^|%---`\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ +0---|0.54_3b_4_|0---|0.54_3b_1#_\ +0---|0.3b2_3b_5_|4_.5_.5#_7b_.5#_.7b_|5---^|%-0-| + +<1.0>\ +0---|0---|0---|0---\ +0---|0---|0---|0---\ 3-5-|2.-5#6_|7_5_3_1'_5_3_2'|1'71'6_7_\ -1'_7_6_5_6.1'_^|1'_7_6_5_6_7_3_5_|6---^|%---`\ -1-02-023b^|%-05-43b4|1#-03b-04-^|%-05-43b1#\ -1-02-023b^|%-03b-23b5|4.5.5#7b.5#.7b|5---^|%-`23| +1'_7_6_5_6.1'_^|1'_7_6_5_6_7_3_5_|6---^|%---`\ +10_20_2_3b_^|%-0-|1#0_3b0_4^|%-0-\ +10_20_2_3b_^|%-0-|4_.5_.5#_7b_.5#_.7b_|5---^|%-0-| + +<1.0>\ +0-|0-|0-|0-|0-|0-|0-|0-\ +0-|0-|0-|0-|0-|0-|0-|0-\ +0-|0-|0-|0-|0-|0-|0-|0-|02_3_| <0.4>\ 6---[63']1'--|[5#7]--3'[5#7]'---|[51']351'351'3'|[4#2']--3'[36]'---\ @@ -218,4 +244,137 @@ 050%0%0%|0%0%3bo55o5|05#0%0%0%|0%0%5o5#1#o5#\ 050%0%0%|0%0%3bo55o5|5#.%.%-%%%|5.%.%-%%%|6.%.%-%%%| +//-------------------- Section G(D') -------------------- +<1=bA> + +<1.0>\ +1-13|(3~)217,^%-|2-(3~)234|(3~)321^%7,\ +1.32_1_7,_|5,_2,_5,.6,7,_|1-..1_^|%_7,_6,_5,_3,_5,.\ +1-13|(3~)217,^%-|2-(3~)234|(3~)321^%7,\ +1.32_1_7,_|5,_2,_5,.6,7,_|6,---^|%---`\ +0-|0-|0-|0-|0-|0-|0-|0-\ +0-|0-|0-|0-|0-|0-|0-|0-| + +<0.8>\ +0-|0-|0-|0-|0-|0-|0-|0-\ +0-|0-|0-|0-|0-|0-|0..6^|%5326,.5,.3,\ +6,---7,--6,^|%--2-17,5,|2,--3,--2'3'^|%-7,5,-13,5,\ +135357'-6'|{5'6'5'4'3'2'1'7671'76543|2-6,7,12342-123-1-}|13,,5,,1,3,5,12\ +32116,6,-6,|1232--11|{7,-1,3,6,13676317,6,3,1,}|1236'-36,-\ +6-------`|6.7.1'2'.1'.7|6,.2.35.6.7|1'--3'----`| + +<0.4>{2*\ + 17,15----^|%7,15-7,15|3237----^|%735-1o35\ + 1o357-1o35|1o357-1o35|1o351o-1o3_1'_[51']_1'_|{13,5,7,13571'75317,5,3,}\ + 17,15----^|%7,17o-7,15|2'o237----^|%7351'o1o7o5\ + [6o1']357-1o6o5|[5o1']357-1o2o5|1o35[5o1']-1'o7o5|{1o3,5,7,13571'75317,5,3,}\ +}| + +<0.2>{2*\ + 4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ + 4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ + 4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ + 4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ +}| + +<0.5>{2*\ + 6-61'|(3~)765^%-|7-(3~)71'2'|(3~)1'76^65\ + 6.1'7_6_5_|2_--67_|6---^|%---`\ + 6-61'|(3~)765^%-|7-(3~)71'2'|(3~)1'76^65\ + 6.1'7_6_5_|2_--65_|1'---^|%---`\ +}| + +<0.4>{2*\ + 4-`|5-`|5#-`|6-`|4-`|5-`|6-^|6-`\ + 4-`|5-`|5#-`|6-`|4-`|5-`|6-^|6-`\ +}| + +<0.1>{2*\ + 4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ + 4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ + 4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ + 4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ +}| + +//-------------------- Section H(xC) -------------------- +<1=bE> + +<1.0>\ +0---|0.54_3b_4_|0---|0.54_3b_1#_\ +0---|0.3b2_3b_5_|4_.5_.5#_7b_.5#_.7b_|5---^|%-0-| + +<1.0>\ +10_20_2_3b_^|%-0-|1#0_3b0_4^|%-0-\ +10_20_2_3b_^|%-0-|4_.5_.5#_7b_.5#_.7b_|5---^|%-0-| + +<1.0>\ +0-|0-|0-|0-|0-|0-|0-|0-|02_3_| + +<0.4>\ +[1M,1]0-[25m],0-%[3,5,13]|0---3b'o05'o0|[1#m,1]0-[3bp5#],0-4o'0|0[4,5#,14]0-5o'01#o'0\ +{1'(3=)5}|5_3b_1_3b_1_5,_1_5,_3bo05o0|4o01#o0|1'0_2o0_5o|6o---| + +<0.4>\ +050%0%0%|05053bo55o5|05#05#0-[45#1'4']''[3673']b''|05#05#5o5#1#o5#\ +050%0%0%|05051'(3=)5---|5#(3=)1#-------|{525252522'7575252}|6o.6.6-666| + +<0.3>\ +1o0-2o0-2o3bo|0---5'03b'0|1#o0-3bo0-4o3bo|04o0-3bo01#o0\ +1o0-2o0-2o3bo|04o0-3bo05o0|4o0--1#o0--|1'0-2o0-5o0|6o-`| + +<0.4>\ +1o0-2o0-2o3bo|05050505|1#o0-3bo0-4o3bo|04o05#0%0%\ +1o502p052o[3bo5]|0[4o5]05o0%0%|[5#4].5#.5#1#5#5#5#|[51'].5.[52']-55o5|6o.6.6-666| + +<0.1>\ +050%0%0%|0%0%3bo55o5|05#0%0%0%|0%0%5o5#1#o5#\ +050%0%0%|0%0%3bo55o5|5#.%.%-%%%|5.%.%-%%%|6.%.%-%%%| + +//-------------------- Section I(D2+) -------------------- +<1=bA> + +<1.0>{2*\ + 1-13|(3~)217,^%-|2-(3~)234|(3~)321^%7,\ + 1.32_1_7,_|5,_2,_5,.6,7,_|1-..1_^|%_7,_6,_5,_3,_5,.\ + 1-13|(3~)217,^%-|2-(3~)234|(3~)321^%7,\ + 1.32_1_7,_|5,_2,_5,.6,7,_|6,---^|%---`\ +}|0-|0-|0-|0-|0-|0-|0-|0-| + +<0.4>{2*\ + 17,15----^|%7,15-7,15|3237----^|%735-1o35\ + 1o357-1o35|1o357-1o35|1o351o-1o3_1'_[51']_1'_|{13,5,7,13571'75317,5,3,}\ + 17,15----^|%7,17o-7,15|2'o237----^|%7351'o1o7o5\ + [6o1']357-1o6o5|[5o1']357-1o2o5|1o35[5o1']-1'o7o5|{1o3,5,7,13571'75317,5,3,}\ +}\ +{<0.6>4,M-13|(3~)217,^%-|2-(3~)234|(3~)321^%7,\ +1.32_1_7,_|5,_2,_5,.6,_6,_7,_|[46],---^|%---}| + +<0.2>{2*\ + 4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ + 4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ + 4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ + 4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ +}\ +{<0.4>[4o,6],13[14]----|5o,,7,25-257|5#o,,7,2[35#]----|6o,,136-316,\ +4o,,6,1[36]----|5o,,7,25-27,5,|[6,1]-^|%-}| + +<0.5>{2*\ + 6-61'|(3~)765^%-|7-(3~)71'2'|(3~)1'76^65\ + 6.1'7_6_5_|2_--67_|6---^|%---`\ + 6-61'|(3~)765^%-|7-(3~)71'2'|(3~)1'76^65\ + 6.1'7_6_5_|2_--65_|1'---^|%---`\ +}|0-|0-|0-|0-|0-|0-|0-|0-| + +<0.4>{2*\ + 4-`|5-`|5#-`|6-`|4-`|5-`|6-^|6-`\ + 4-`|5-`|5#-`|6-`|4-`|5-`|6-^|6-`\ +}|0-|0-|0-|0-|0-|0-|0-|0-| + +<0.1>{2*\ + 4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ + 4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ + 4.%.%-%%%|5.%.%-%%%|5#.%.%-%%%|6.%.%-%%%\ + 4.%.%-%%%|5.%.%-%%%|6.%.%-%%%|6.%.%-%%-\ +}|0-|0-|0-|0-|0-|0-|0-|0-| + diff --git a/color.json b/color.json index bc1281d..9df57e3 100644 --- a/color.json +++ b/color.json @@ -2,7 +2,7 @@ "StyleColor": { "Default": "#000000", "Background": "#F9F9F9", - "Comment": "#707070", + "Comment": "#707070", "Index": "#303030" }, "ButtonColor": { From 8c4466338d878850c4a294d9f76d5a83a5da4ba5 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Sun, 21 Jan 2018 20:14:44 +0800 Subject: [PATCH 50/54] Add some adjustments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 优化了assets库中的代码 2. 为“进入歌单”配上了新的图标 3. 加入了显示歌单Comment的功能 --- Lib/assets.wl | 198 ++++++++++++++++-------------- Lib/uiControls.wl | 97 +++++++++++++++ Lib/{uiDeve.wl => uiDeveloper.wl} | 0 Lib/uiUser.wl | 109 ++-------------- QYMP.wl | 3 +- color.json | 7 +- 6 files changed, 212 insertions(+), 202 deletions(-) create mode 100644 Lib/uiControls.wl rename Lib/{uiDeve.wl => uiDeveloper.wl} (100%) diff --git a/Lib/assets.wl b/Lib/assets.wl index 1775d3b..28edae0 100644 --- a/Lib/assets.wl +++ b/Lib/assets.wl @@ -1,18 +1,99 @@ (* ::Package:: *) -button[name_,style_]:=If[style=="Default", - Mouseover[button[name,"Basic"],button[name,"Mouseover"]], - Block[{scheme=buttonColor[[style]]},Graphics[{ +(* basic graphics *) +squareRounded[t_,r_,scheme_]:=If[r==1, + GraphicsGroup[{ + scheme[["Grounding"]],Disk[{0,0},1-t], + scheme[["Margin"]],Thickness[t],Circle[{0,0},1-t] + }], + GraphicsGroup[{ scheme[["Grounding"]], - Disk[{0,0},1], - scheme[["Margin"]],Thickness[0.06], - Circle[{0,0},0.94], + Rectangle[{t-1,t-1},{1-t,1-t},RoundingRadius->{r-t,r-t}], + scheme[["Margin"]],Thickness[t],CapForm["Round"], + Circle[{r-1,r-1},r-t,{Pi,3Pi/2}],Circle[{1-r,1-r},r-t,{0,Pi/2}], + Circle[{1-r,r-1},r-t,{-Pi/2,0}],Circle[{r-1,1-r},r-t,{Pi/2,Pi}], + Line[{{r-1,t-1},{1-r,t-1}}],Line[{{r-1,1-t},{1-r,1-t}}], + Line[{{t-1,r-1},{t-1,1-r}}],Line[{{1-t,r-1},{1-t,1-r}}] + }] +]; + + +(* progress bar *) +progressBar[prog_,len_]:=Graphics[{ + CapForm["Round"],JoinForm["Round"], + Texture[Table[{c,1-c,1},{c,1/100,1/2,1/100}]], + Polygon[{{-0.04,-0.96},{-0.04,0.96},{prog*len,0.96},{prog*len,-0.96}}, + VertexTextureCoordinates->{{0},{0},{1},{1}} + ], + RGBColor["#00FFFF"], + Disk[{0,0},0.96,{Pi/2,3Pi/2}], + Rectangle[{0,-0.96},{0.2,0.96}], + RGBColor["#B0B0B0"],Thickness[0.004], + Circle[{0,0},0.96,{Pi/2,3Pi/2}], + Circle[{len,0},0.96,{-Pi/2,Pi/2}], + Line[{{0,0.96},{len,0.96}}], + Line[{{0,-0.96},{len,-0.96}}], + RGBColor["#F0F0F0"], + Disk[{prog*len,0},1.56], + RGBColor["#0088FF"], + Disk[{prog*len,0},0.56], + RGBColor["#909090"],Thickness[0.004], + Circle[{prog*len,0},1.6], + Circle[{prog*len,0},0.56] +}]; + + +(* page selector *) +pageSelectorNumber[num_Integer,style_,size_]:=If[style=="Default", + Mouseover[pageSelectorNumber[num,"Basic",size],pageSelectorNumber[num,"Mouseover",size]], + Block[{scheme=pageSelectorColor[[style]]},Graphics[{ + squareRounded[0.06,0.3,scheme], + Text[num,BaseStyle->{ + FontWeight->If[StringContainsQ[style,"Current"],Bold,Plain], + FontSize->size, + FontColor->scheme[["Body"]] + }] + }]] +]; +pageSelectorButton[name_,style_]:=If[style=="Default", + Mouseover[pageSelectorButton[name,"Basic"],pageSelectorButton[name,"Mouseover"]], + Block[{scheme=pageSelectorColor[[style]]},Graphics[{ + squareRounded[0.06,0.3,scheme], scheme[["Body"]], - buttonData[[name]] + pageSelectorData[name] }]] ]; +pageSelectorData=<| + "Prev"->GraphicsGroup[{ + Thickness[0.08],CapForm["Round"],JoinForm["Round"], + Line[{{0.32,0.48},{-0.36,0},{0.32,-0.48}}] + }], + "Next"->GraphicsGroup[{ + Thickness[0.08],CapForm["Round"],JoinForm["Round"], + Line[{{-0.32,0.48},{0.36,0},{-0.32,-0.48}}] + }], + "First"->GraphicsGroup[{ + Thickness[0.08],CapForm["Round"],JoinForm["Round"], + Line[{{-0.4,-0.48},{-0.4,0.48}}], + Line[{{0.44,0.48},{-0.16,0},{0.44,-0.48}}] + }], + "Last"->GraphicsGroup[{ + Thickness[0.08],CapForm["Round"],JoinForm["Round"], + Line[{{0.4,-0.48},{0.4,0.48}}], + Line[{{-0.44,0.48},{0.16,0},{-0.44,-0.48}}] + }] +|>; +(* button *) +button[name_]:=button[name,"Default"]; +button[name_,style_]:=If[style=="Default", + Mouseover[button[name,"Basic"],button[name,"Mouseover"]], + Block[{scheme=buttonColor[[style]]},Graphics[{ + squareRounded[0.06,1,scheme], + scheme[["Body"]],buttonData[[name]] + }]] +]; buttonData=<| "Play"->GraphicsGroup[{ Thickness[0.08],JoinForm["Round"],CapForm["Round"], @@ -68,103 +149,30 @@ buttonData=<| Line[{{-0.12,-0.32},{-0.32,-0.12}}] }], "PrevSong"->GraphicsGroup[{ - CapForm["Round"],JoinForm["Round"], + Thickness[0.06],CapForm["Round"],JoinForm["Round"], Line[{{-0.32,-0.36},{-0.32,0.36}}], Triangle[{{0.36,-0.36},{0.36,0.36},{-0.16,0}}], Line[{{0.36,-0.36},{0.36,0.36},{-0.16,0},{0.36,-0.36}}] }], "NextSong"->GraphicsGroup[{ - CapForm["Round"],JoinForm["Round"], + Thickness[0.06],CapForm["Round"],JoinForm["Round"], Line[{{0.32,-0.36},{0.32,0.36}}], Triangle[{{-0.36,-0.36},{-0.36,0.36},{0.16,0}}], Line[{{-0.36,-0.36},{-0.36,0.36},{0.16,0},{-0.36,-0.36}}] - }] -|>; - - -(* ::Input:: *) -(*Row[button[#,"Default"]&/@Keys[buttonData],ImageSize->{3000,60}]*) - - -pageSelectorData=<| - "Prev"->GraphicsGroup[{ - Thickness[0.08],CapForm["Round"],JoinForm["Round"], - Line[{{0.32,0.48},{-0.36,0},{0.32,-0.48}}] - }], - "Next"->GraphicsGroup[{ - Thickness[0.08],CapForm["Round"],JoinForm["Round"], - Line[{{-0.32,0.48},{0.36,0},{-0.32,-0.48}}] - }], - "First"->GraphicsGroup[{ - Thickness[0.08],CapForm["Round"],JoinForm["Round"], - Line[{{-0.4,-0.48},{-0.4,0.48}}], - Line[{{0.44,0.48},{-0.16,0},{0.44,-0.48}}] }], - "Last"->GraphicsGroup[{ - Thickness[0.08],CapForm["Round"],JoinForm["Round"], - Line[{{0.4,-0.48},{0.4,0.48}}], - Line[{{-0.44,0.48},{0.16,0},{-0.44,-0.48}}] - }] -|>; - - -pageSelectorTemplate:=GraphicsGroup[{ - scheme[["Grounding"]], - Rectangle[{-0.94,-0.94},{0.94,0.94},RoundingRadius->{0.14,0.14}], - scheme[["Margin"]],Thickness[0.06],CapForm["Round"],JoinForm["Round"], - Circle[{-0.7,-0.7},0.24,{Pi,3Pi/2}], - Circle[{0.7,-0.7},0.24,{-Pi/2,0}], - Circle[{-0.7,0.7},0.24,{Pi/2,Pi}], - Circle[{0.7,0.7},0.24,{0,Pi/2}], - Line[{{-0.7,-0.94},{0.7,-0.94}}], - Line[{{-0.7,0.94},{0.7,0.94}}], - Line[{{-0.94,-0.7},{-0.94,0.7}}], - Line[{{0.94,-0.7},{0.94,0.7}}] -}]; -pageSelector[num_Integer,style_,size_]:=Switch[style, - "Default", - Mouseover[pageSelector[num,"Basic",size],pageSelector[num,"Mouseover",size]], - "Current", - Mouseover[pageSelector[num,"Current-Basic",size],pageSelector[num,"Current-Mouseover",size]], - _, - Block[{scheme=pageSelectorColor[[style]]},Graphics[{ - pageSelectorTemplate, - Text[num,BaseStyle->{ - FontWeight->If[StringContainsQ[style,"Current"],Bold,Plain], - FontSize->size, - FontColor->scheme[["Body"]] - }] - }]] -]; -pageSelector[name_,style_]:=If[style=="Default", - Mouseover[pageSelector[name,"Basic"],pageSelector[name,"Mouseover"]], - Block[{scheme=pageSelectorColor[[style]]},Graphics[{ - pageSelectorTemplate, - scheme[["Body"]], - pageSelectorData[name] + "EnterPlaylist"->With[{l=0.36,w=0.44,a=0.12,q=0.08,p=-0.16,l1=-0.16,w1=0.24,w2=0.08}, + GraphicsGroup[{ + Thickness[0.06],CapForm["Round"],JoinForm["Round"], + Line[{{l,p-0.16},{l,-w},{-l,-w},{-l,w},{l-0.2,w},{l,w-0.2},{l,p+0.16}}], + Thickness[0.04], + Line[{{q,p},{0.52,p}}],Line[{{q+a,p-a},{q,p},{q+a,p+a}}], + Line[{{l1,w1},{0.08,w1}}],Line[{{l1,w2},{0.08,w2}}], + Line[{{l1,-w2},{-0.04,-w2}}],Line[{{l1,-w1},{-0.04,-w1}}] }]] -]; +|>; -progressBar[prog_,len_]:=Graphics[{ - CapForm["Round"],JoinForm["Round"], - Texture[Table[{c,1-c,1},{c,1/100,1/2,1/100}]], - Polygon[{{-0.04,-0.96},{-0.04,0.96},{prog*len,0.96},{prog*len,-0.96}}, - VertexTextureCoordinates->{{0},{0},{1},{1}} - ], - RGBColor["#00FFFF"], - Disk[{0,0},0.96,{Pi/2,3Pi/2}], - Rectangle[{0,-0.96},{0.2,0.96}], - RGBColor["#B0B0B0"],Thickness[0.004], - Circle[{0,0},0.96,{Pi/2,3Pi/2}], - Circle[{len,0},0.96,{-Pi/2,Pi/2}], - Line[{{0,0.96},{len,0.96}}], - Line[{{0,-0.96},{len,-0.96}}], - RGBColor["#F0F0F0"], - Disk[{prog*len,0},1.56], - RGBColor["#0088FF"], - Disk[{prog*len,0},0.56], - RGBColor["#909090"],Thickness[0.004], - Circle[{prog*len,0},1.6], - Circle[{prog*len,0},0.56] -}]; +(* ::Input:: *) +(*buttonNames=Keys[buttonData];*) +(*buttonNamePaged=Partition[buttonNames,UpTo@Ceiling[Length@buttonNames/Ceiling[Length@buttonNames/8]]];*) +(*Grid[button/@#&/@buttonNamePaged,ItemSize->{6,6},Spacings->{.5,0}]*) diff --git a/Lib/uiControls.wl b/Lib/uiControls.wl new file mode 100644 index 0000000..f01d62e --- /dev/null +++ b/Lib/uiControls.wl @@ -0,0 +1,97 @@ +(* ::Package:: *) + +uiPlayerControlsOld:={ + Row[{ + Dynamic[Style[timeDisplay[current["Position"]],20]], + Spacer[8], + ProgressIndicator[Dynamic[current["Position"]/duration],ImageSize->{240,16}], + Spacer[8], + Style[timeDisplay[duration],20] + }],Spacer[1], + Row[{Button[ + Dynamic[Switch[current["State"], + "Playing",text[["Pause"]], + "Paused"|"Stopped",text[["Play"]] + ]], + Switch[current["State"], + "Playing",current["State"]="Paused", + "Paused"|"Stopped",current["State"]="Playing" + ], + ImageSize->80], + Spacer[20], + Button[text[["Stop"]],current["State"]="Stopped",ImageSize->80], + Spacer[20], + Button[text[["Return"]],AudioStop[];DialogReturn[uiPlaylist[currentPlaylist]],ImageSize->80] + }] +}; + + +uiPlayerControlsNew:={ + Row[{ + Column[{Style[Dynamic[timeDisplay[current["Position"]]],20],Spacer[1]}], + Spacer[8], + Magnify[progressBar[Dynamic[current["Position"]/duration],40],4], + Spacer[8], + Column[{Style[timeDisplay[duration],20],Spacer[1]}] + },ImageSize->Full,Alignment->Center], + Row[{ + DynamicModule[{style="Default"}, + Dynamic@Switch[current["State"], + "Playing",EventHandler[button["Pause",style],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";current["State"]="Paused") + }], + "Paused"|"Stopped",EventHandler[button["Play",style],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";current["State"]="Playing") + }] + ] + ], + Spacer[20], + DynamicModule[{style="Default"}, + EventHandler[Dynamic@button["Stop",style],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";current["State"]="Stopped") + }] + ], + Spacer[20], + DynamicModule[{style="Default"}, + EventHandler[Dynamic@button["ArrowL",style],{ + "MouseDown":>(style="Clicked";), + "MouseUp":>(style="Default"; + AudioStop[]; + DialogReturn[uiPlaylist[currentPlaylist]]; + ) + }] + ] + },ImageSize->{300,60},Alignment->Center] +}; + + +uiPageSelector:=Row[{ + Dynamic@If[page<=1,pageSelectorButton["Prev","Disabled"], + DynamicModule[{style="Default"}, + EventHandler[Dynamic@pageSelectorButton["Prev",style],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";page--;) + }] + ]], + Spacer[20], + Row[Flatten@Array[{ + Dynamic@If[page==#,pageSelectorNumber[#,"Current",32], + DynamicModule[{style="Default"}, + EventHandler[Dynamic@pageSelectorNumber[#,style,32],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";page=#;) + }] + ] + ],Spacer[6]}&,pageCount]], + Spacer[14], + Dynamic@If[page>=pageCount,pageSelectorButton["Next","Disabled"], + DynamicModule[{style="Default"}, + EventHandler[Dynamic@pageSelectorButton["Next",style],{ + "MouseDown":>(style="Clicked"), + "MouseUp":>(style="Default";page++;) + }] + ]] +},ImageSize->{500,60},Alignment->Center]; diff --git a/Lib/uiDeve.wl b/Lib/uiDeveloper.wl similarity index 100% rename from Lib/uiDeve.wl rename to Lib/uiDeveloper.wl diff --git a/Lib/uiUser.wl b/Lib/uiUser.wl index 5cf7a67..b99526f 100644 --- a/Lib/uiUser.wl +++ b/Lib/uiUser.wl @@ -45,74 +45,6 @@ uiSettings:=DynamicModule[{choices,langDict}, (*uiPlayer["Touhou\\Dream_Battle"]*) -uiPlayerControlsOld:={ - Row[{ - Dynamic[Style[timeDisplay[current["Position"]],20]], - Spacer[8], - ProgressIndicator[Dynamic[current["Position"]/duration],ImageSize->{240,16}], - Spacer[8], - Style[timeDisplay[duration],20] - }],Spacer[1], - Row[{Button[ - Dynamic[Switch[current["State"], - "Playing",text[["Pause"]], - "Paused"|"Stopped",text[["Play"]] - ]], - Switch[current["State"], - "Playing",current["State"]="Paused", - "Paused"|"Stopped",current["State"]="Playing" - ], - ImageSize->80], - Spacer[20], - Button[text[["Stop"]],current["State"]="Stopped",ImageSize->80], - Spacer[20], - Button[text[["Return"]],AudioStop[];DialogReturn[uiPlaylist[currentPlaylist]],ImageSize->80] - }] -}; - - -uiPlayerControlsNew:={ - Row[{ - Column[{Style[Dynamic[timeDisplay[current["Position"]]],20],Spacer[1]}], - Spacer[8], - Magnify[progressBar[Dynamic[current["Position"]/duration],40],4], - Spacer[8], - Column[{Style[timeDisplay[duration],20],Spacer[1]}] - },ImageSize->Full,Alignment->Center], - Row[{ - DynamicModule[{style="Default"}, - Dynamic@Switch[current["State"], - "Playing",EventHandler[button["Pause",style],{ - "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";current["State"]="Paused") - }], - "Paused"|"Stopped",EventHandler[button["Play",style],{ - "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";current["State"]="Playing") - }] - ] - ], - Spacer[20], - DynamicModule[{style="Default"}, - EventHandler[Dynamic@button["Stop",style],{ - "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";current["State"]="Stopped") - }] - ], - Spacer[20], - DynamicModule[{style="Default"}, - EventHandler[Dynamic@button["ArrowL",style],{ - "MouseDown":>(style="Clicked";), - "MouseUp":>(style="Default"; - AudioStop[]; - DialogReturn[uiPlaylist[currentPlaylist]]; - ) - }] - ] - },ImageSize->{300,60},Alignment->Center] -}; - - uiPlayer[song_]:=Module[{image,audio,imageExist,aspectRatio}, AudioStop[]; If[index[[song,"Image"]]!="", @@ -190,35 +122,6 @@ WindowTitle->text[["About"]],Background->styleColor[["Background"]]]; (*uiAbout;*) -uiPageSelector:=Row[{ - Dynamic@If[page<=1,pageSelector["Prev","Disabled"], - DynamicModule[{style="Default"}, - EventHandler[Dynamic@pageSelector["Prev",style],{ - "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";page--;) - }] - ]], - Spacer[20], - Row[Flatten@Array[{ - Dynamic@If[page==#,pageSelector[#,"Current",32], - DynamicModule[{style="Default"}, - EventHandler[Dynamic@pageSelector[#,style,32],{ - "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";page=#;) - }] - ] - ],Spacer[6]}&,pageCount]], - Spacer[14], - Dynamic@If[page>=pageCount,pageSelector["Next","Disabled"], - DynamicModule[{style="Default"}, - EventHandler[Dynamic@pageSelector["Next",style],{ - "MouseDown":>(style="Clicked"), - "MouseUp":>(style="Default";page++;) - }] - ]] -},ImageSize->{500,60},Alignment->Center]; - - QYMP:=DynamicModule[{playlist}, pageCount=Ceiling[Length@playlists/16]; If[pageData[["Main"]]>pageCount,pageData[["Main"]]=pageCount]; @@ -229,7 +132,7 @@ QYMP:=DynamicModule[{playlist}, Row[{Spacer[40],caption["_QYMP","BigTitle"]},Alignment->Left,ImageSize->320], Row[{ DynamicModule[{style="Default"}, - EventHandler[Dynamic@button["Play",style],{ + EventHandler[Dynamic@button["EnterPlaylist",style],{ "MouseDown":>(style="Clicked"), "MouseUp":>(style="Default";DialogReturn[pageData[["Main"]]=page;playlist;uiPlaylist[playlist]];) }] @@ -288,7 +191,9 @@ uiPlaylist[playlist_]:=DynamicModule[{song}, page=pageData[[playlist]]; CreateDialog[Column[{Spacer[{40,40}], Row[{ - Row[{Spacer[40],caption[playlistInfo[["Title"]],"BigTitle"]},Alignment->Left,ImageSize->480], + Row[{ + Spacer[40],caption[playlistInfo[["Title"]],"BigTitle"] + },Alignment->Left,ImageSize->480], Row[{ DynamicModule[{style="Default"}, EventHandler[Dynamic@button["Play",style],{ @@ -322,6 +227,10 @@ uiPlaylist[playlist_]:=DynamicModule[{song}, ], Spacer[40]},Alignment->Right,ImageSize->{480,56}] }], + If[playlistInfo[["Comment"]]!="", + Row[{Spacer[40],caption[playlistInfo[["Comment"]],"Subtitle"]},Alignment->Left,ImageSize->960], + Nothing + ], Spacer[1], Dynamic@Row[{Spacer[60],SetterBar[Dynamic@song, #[["Song"]]->Row[{ @@ -331,7 +240,7 @@ uiPlaylist[playlist_]:=DynamicModule[{song}, caption[#[["Index"]],"SongIndex"], Spacer[16] },ImageSize->playlistInfo[["IndexWidth"]],Alignment->Center], - Nothing + Spacer[4] ], caption[index[[#[["Song"]],"SongName"]],"SongName"], If[KeyExistsQ[index[[#[["Song"]]]],"Comment"], diff --git a/QYMP.wl b/QYMP.wl index 7323e71..87be9bc 100644 --- a/QYMP.wl +++ b/QYMP.wl @@ -7,8 +7,9 @@ path=NotebookDirectory[]; <<(path<>"Lib\\library.wl") (* library *) <<(path<>"Lib\\assets.wl") (* graphics *) +<<(path<>"Lib\\uiControls.wl") (* controls *) <<(path<>"Lib\\uiUser.wl") (* UI for common users *) -<<(path<>"Lib\\uiDeve.wl") (* UI for developers *) +<<(path<>"Lib\\uiDeveloper.wl") (* UI for developers *) <<(path<>"Lib\\qymToken.wl") (* QYM tokenizer *) <<(path<>"Lib\\qysToken.wl") (* QYS tokenizer *) <<(path<>"Lib\\parser.wl") (* parser *) diff --git a/color.json b/color.json index 9df57e3..cc6bda5 100644 --- a/color.json +++ b/color.json @@ -28,7 +28,7 @@ } }, "PageSelectorColor": { - "Current-Basic": { + "Current": { "Grounding": "#1979CA", "Margin": "#1979CA", "Body": "#F9F9F9" @@ -43,11 +43,6 @@ "Margin": "#1979CA", "Body": "#F9F9F9" }, - "Current-Mouseover": { - "Grounding": "#1979CA", - "Margin": "#1979CA", - "Body": "#F9F9F9" - }, "Mouseover": { "Grounding": "#9BCBF2", "Margin": "#1979CA", From 52cee83667a14937860427f26c2186af22327160 Mon Sep 17 00:00:00 2001 From: NN708 Date: Sun, 21 Jan 2018 21:08:34 +0800 Subject: [PATCH 51/54] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A4=A7=E9=87=8F?= =?UTF-8?q?=E6=96=87=E4=BB=B6=201.=20=E6=8D=A2=E8=A1=8C=E4=BA=86=E2=80=A6?= =?UTF-8?q?=E2=80=A6=202.=20=E6=B6=88=E9=99=A4=E5=90=8C=E9=9F=B3=E8=BD=A8?= =?UTF-8?q?=E4=B8=AD=E4=BD=BF=E7=94=A8=E4=B8=A4=E7=A7=8D=E4=B9=90=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Songs/Hana_no_Ko_Lunlun.qym | 37 ++++++++++++++++++++++++++++--- Songs/March_of_the_Volunteers.qym | 10 ++++++++- Songs/NSFZ_School_Song.qym | 11 ++++++++- Songs/Red_Star_Song.qym | 34 ++++++++++++++++++++++++++-- Songs/Socialism_is_Good.qym | 6 ++++- Songs/Sunny_Light.qym | 4 ++-- Songs/The_East_is_Red.qym | 4 +++- Songs/The_Internationale.qym | 16 ++++++++++++- 8 files changed, 110 insertions(+), 12 deletions(-) diff --git a/Songs/Hana_no_Ko_Lunlun.qym b/Songs/Hana_no_Ko_Lunlun.qym index 4d767d7..865c6a3 100644 --- a/Songs/Hana_no_Ko_Lunlun.qym +++ b/Songs/Hana_no_Ko_Lunlun.qym @@ -2,6 +2,37 @@ //千家和也 词 //小林亜星 曲 <1=A><4/4><118> -<80%>3_4_|5_0_3'_0_1'_0_3_4_|5_0_3'_0_1'_0_3'_4'_|3'_0_2'_0_3'_0_2'_0_|1'--3_4_|5_5_5_5_3'_2'_1'_7_|6_6_4_5_66_1'_|7_7_77_7_6_5_|#46_5_05|3'--2'_3'_|4'6-6_1'_|77_7_7_7_6_ 5_ |1'--0|<1=C>6_6_6_7_1'7_6_|5_5_5_6_5-|4_4_4_3_23_4_|3_3_3_4_5-|6_6_6_7_1'7_6_|5_5_5_6_5-|#4_#4_#4_#4_0_#4_#5_6_|7---|<1=A>3'_3'_3'_3'_3'_3'_2'_3'_|4'_6_^600|2'_2'_2'_2'_2'1'_2'_|3'_5_^500|3'_3'_3'_3'_3'_3'_2'_3'_|4'_4'_4'_4'_66_1'_|7_7_05_5_3'_2'_|1'--3_4_|5_0_3'_0_1'_0_3_4_|5_0_3'_0_1'_0_3'_4'_|3'_0_2'_0_3'_0_2'_0_|1'--|| -<40%>3_4_|5_0_1'_0_5_ 0_3_4_|5_0_1'_0_5_ 0_1'_2'_|1'_0_7_ 0_7_ 0_7_ 0_|1'--1_2_|3_3_3_3_5_ 4_ 3_ 2_|4_4_2_3_44_6_ |5_5_55_5_4_3_|2 4_3_05|1'--b7_b7_|6 4-4_6_ |55_5_5_5_4_ 4_ |3-- 0|<1=C>1_1_1_2_3 2_1_|3_3_3_4_3-|2_2_2_3_21_2_|1_1_1_2_3-|1_1_1_2_3 2_1_|3_3_3_4_3-|2_ 2_ 2_ 2_ 0_2_ 3_#4_|5---|<1=A>1'_1'_1'_1'_1'_1'_7_ 1'_|6_ 4_^400|7_ 7_ 7_ 7_ 7 6_ 7_ |5_ 3_^300|1'_1'_1'_1'_1'_1'_7_ 1'_|2'_2'_2'_2'_66_6_ |5_5_05_5_6_ 7_ |1'--1_2_|3_0_1'_0_5_ 0_1_2_|3_0_1'_0_5_ 0_5_ 6_ |5_ 0_5_ 0_6_ 0_7_ 0_|1'--|| -<40%>3_4_|5_0_1'_0_5_ 0_3_4_|5_0_1'_0_5_ 0_6_ 6_ |5_ 0_5_ 0_5_ 0_4_ 0_|3-- 1_2_|3_3_3_3_5_ 4_ 3_ 2_|4_4_2_3_44_6_ |5_5_55_5_4_3_|2 4_3_05|1'--5_ 5_ |1 1-1_1_ |22_2_2_2_7,_7,_|1-- 0|<1=C>1_1_1_2_3 2_1_|3_3_3_4_3-|2_2_2_3_21_2_|1_1_1_2_3-|1_1_1_2_3 2_1_|3_3_3_4_3-|2_ 2_ 2_ 2_ 0_2_ 3_#4_|5---|<1=A>1'_1'_1'_1'_1'_1'_7_ 1'_|6_ 4_^400|7_ 7_ 7_ 7_ 7 6_ 7_ |5_ 3_^300|5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ |6_ 6_ 6_ 6_ 44_4_ |2_2_02_2_4_ 4_ |3-- 1_2_|3_0_1'_0_5_ 0_1_2_|3_0_1'_0_5_ 0_5_ 6_ |5_ 0_5_ 0_6_ 0_7_ 0_|1'--|| \ No newline at end of file +<80%>3_4_|5_0_3'_0_1'_0_3_4_|5_0_3'_0_1'_0_3'_4'_|3'_0_2'_0_3'_0_2'_0_|1'--3_4_| +<40%>3_4_|5_0_1'_0_5_ 0_3_4_|5_0_1'_0_5_ 0_1'_2'_|1'_0_7_ 0_7_ 0_7_ 0_|1'--1_2_| +<40%>3_4_|5_0_1'_0_5_ 0_3_4_|5_0_1'_0_5_ 0_6_ 6_ |5_ 0_5_ 0_5_ 0_4_ 0_|3-- 1_2_| + +<80%>5_5_5_5_3'_2'_1'_7_|6_6_4_5_66_1'_|7_7_77_7_6_5_|#46_5_05| +<40%>3_3_3_3_5_ 4_ 3_ 2_|4_4_2_3_44_6_ |5_5_55_5_4_3_|2 4_3_05| +<40%>3_3_3_3_5_ 4_ 3_ 2_|4_4_2_3_44_6_ |5_5_55_5_4_3_|2 4_3_05| + +<80%>3'--2'_3'_|4'6-6_1'_|77_7_7_7_6_ 5_ |1'--0| +<40%>1'--b7_b7_|6 4-4_6_ |55_5_5_5_4_ 4_ |3-- 0| +<40%>1'--5_ 5_ |1 1-1_1_ |22_2_2_2_7,_7,_|1-- 0| + +<1=C> +<80%>6_6_6_7_1'7_6_|5_5_5_6_5-|4_4_4_3_23_4_|3_3_3_4_5-| +<40%>1_1_1_2_3 2_1_|3_3_3_4_3-|2_2_2_3_21_2_|1_1_1_2_3-| +<40%>1_1_1_2_3 2_1_|3_3_3_4_3-|2_2_2_3_21_2_|1_1_1_2_3-| + +<80%>6_6_6_7_1'7_6_|5_5_5_6_5-|#4_#4_#4_#4_0_#4_#5_6_|7---| +<40%>1_1_1_2_3 2_1_|3_3_3_4_3-|2_ 2_ 2_ 2_ 0_2_ 3_#4_|5---| +<40%>1_1_1_2_3 2_1_|3_3_3_4_3-|2_ 2_ 2_ 2_ 0_2_ 3_#4_|5---| + +<1=A> +<80%>3'_3'_3'_3'_3'_3'_2'_3'_|4'_6_^600|2'_2'_2'_2'_2'1'_2'_|3'_5_^500| +<40%>1'_1'_1'_1'_1'_1'_7_ 1'_|6_ 4_^400|7_ 7_ 7_ 7_ 7 6_ 7_ |5_ 3_^300| +<40%>1'_1'_1'_1'_1'_1'_7_ 1'_|6_ 4_^400|7_ 7_ 7_ 7_ 7 6_ 7_ |5_ 3_^300| + + +<80%>3'_3'_3'_3'_3'_3'_2'_3'_|4'_4'_4'_4'_66_1'_|7_7_05_5_3'_2'_|1'--3_4_| +<40%>1'_1'_1'_1'_1'_1'_7_ 1'_|2'_2'_2'_2'_66_6_ |5_5_05_5_6_ 7_ |1'--1_2_| +<40%>5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ |6_ 6_ 6_ 6_ 44_4_ |2_2_02_2_4_ 4_ |3-- 1_2_| + +<80%>5_0_3'_0_1'_0_3_4_|5_0_3'_0_1'_0_3'_4'_|3'_0_2'_0_3'_0_2'_0_|1'--|| +<40%>3_0_1'_0_5_ 0_1_2_|3_0_1'_0_5_ 0_5_ 6_ |5_ 0_5_ 0_6_ 0_7_ 0_|1'--|| +<40%>3_0_1'_0_5_ 0_1_2_|3_0_1'_0_5_ 0_5_ 6_ |5_ 0_5_ 0_6_ 0_7_ 0_|1'--|| \ No newline at end of file diff --git a/Songs/March_of_the_Volunteers.qym b/Songs/March_of_the_Volunteers.qym index 316ba79..45ade44 100644 --- a/Songs/March_of_the_Volunteers.qym +++ b/Songs/March_of_the_Volunteers.qym @@ -2,4 +2,12 @@ //田汉 词 //聂耳 曲 <1=G><2/4><96> -1_.3__5_5_|65|3._1__(3)5_5_5_|31|(3)5,_5,_5,_(3)5,_5,_5,_|10_5,_|1.1_|1_.1__5,_6,__7,__|11|0_3_1_2__3__|55|3_.3__1_.3__|5_.3__2|2-|65|23|5_3_0_5_|3_2__3__1|30|5,_.6,__1_1_|3_.3__5_5_|2_2__2__6,|2.5,_|1.1_|3.3_|5-|1_.3__5_5_|65|3_.1__(3)5_5_5_|3_0_1_0_|5,1|3_.1__(3)5_5_5_|3_0_1_0_|5,1|5,1|5,1|10|| \ No newline at end of file +1_.3__5_5_|65|3._1__(3)5_5_5_|31|(3)5,_5,_5,_(3)5,_5,_5,_|10_5,_| + +1.1_|1_.1__5,_6,__7,__|11|0_3_1_2__3__|55|3_.3__1_.3__|5_.3__2|2-| + +65|23|5_3_0_5_|3_2__3__1|30|5,_.6,__1_1_|3_.3__5_5_|2_2__2__6,| + +2.5,_|1.1_|3.3_|5-|1_.3__5_5_|65|3_.1__(3)5_5_5_|3_0_1_0_| + +5,1|3_.1__(3)5_5_5_|3_0_1_0_|5,1|5,1|5,1|10|| \ No newline at end of file diff --git a/Songs/NSFZ_School_Song.qym b/Songs/NSFZ_School_Song.qym index 3227b03..38d1291 100644 --- a/Songs/NSFZ_School_Song.qym +++ b/Songs/NSFZ_School_Song.qym @@ -1,4 +1,13 @@ //南师附中校歌 //柳诒徵 词 <1=C><4/4><110> -3|1.^2_35|6.1'_76|5--3|6.^5_2_^4_3|5.4_32|1--3_^4_|5.6_51'|7.6_53|2.3_#4^6|5--5|1'.^5_3_^4_5|0_5,_1_2_35^|52_^4_32|6--3_^#4_|5---|<2/4>5.^4_|3^5|6.5_|1'1'|6.1'_|65|5^2_^4_|3^2|1.^2_|3^5|6.5_|1'_^2'_3'|2'.2'_|3'2'|1'^6_^7_|1'-|| \ No newline at end of file +3|1.^2_35|6.1'_76|5--3|6.^5_2_^4_3| + +5.4_32|1--3_^4_|5.6_51'|7.6_53|2.3_#4^6|5--5| + +1'.^5_3_^4_5|0_5,_1_2_35^|52_^4_32|6--3_^#4_|5---| + +<2/4> +5.^4_|3^5|6.5_|1'1'|6.1'_|65|5^2_^4_|3^2| + +1.^2_|3^5|6.5_|1'_^2'_3'|2'.2'_|3'2'|1'^6_^7_|1'-|| \ No newline at end of file diff --git a/Songs/Red_Star_Song.qym b/Songs/Red_Star_Song.qym index 6c30106..0ca7dfa 100644 --- a/Songs/Red_Star_Song.qym +++ b/Songs/Red_Star_Song.qym @@ -2,5 +2,35 @@ //魏宝贵、邬大为 词 //傅庚辰 曲 <1=D><2/4><100> -{Piano}5.5__5__|5.5__5__|1'_2'__1'__6_1'__6__|5_6__5__3_5__3__|2_5,_1__2__3__4__|{VoiceAahs}5_.5__5_^6_|5-|63_^2_|1-|1_.1__6|6.^1'_|6_^5_4_^3_|2-|5_.5__1'|1'-|66_.5__|3-|2_.2__6_5_|4_^3_2_^1_|5-^|5-|5_.5__1'|1'-|2'2'_.1'__|6-|5_.1'__6_5_|33_^2_|1-^|10|3.^5_|1_^7,_^6,_^5,_|1-^|11_2_|3 1'|76_^5_|6-^ |6- |00 |0 0|05^|4^3^ |2-^|2-^ |23^|5^6|1'.^7_|6^5_^3_|1'-^|1'1'_2'_|3'2'_^1'_|37 |6-^ |6- |2'-|1'.^6_|3'-^|3'2'_.3'__|2'1'|3_^5_6_^5_|1'-^|1'0|5_.5__5_^6_|5-|63_^2_|1-|1_.1__6|6.^1'_|6_^5_4_^3_|2-|5_.5__1'_1'_|1'-|66_.^5__|3-|2_2__2__6_5_|4_^3_2_^1_|5-^|5-|5_.5__1'_1'_|1'-|2'2'_.^1'__|6-|5_5__1'__6_5_|3_^5_6_^5_|1'-^|1'-|| -{Piano}5.5__5__|5.5__5__|1'_2'__1'__6_1'__6__|5_6__5__3_5__3__|2_5,_1__2__3__4__|{VoiceAahs}5_.5__5_^6_|5-|63_^2_|1-|1_.1__6|6.^1'_|6_^5_4_^3_|2-|3_.3__6 |6- |44_.3__|3-|2_.2__6_5_|4_^3_2_^1_|5-^|5-|3_.3__6 |6- |7 7_. 6 __|6-|3_.5__ 6_5_|33_^2_|1-^|10|00 |0 0 |03^|2^1^ |7,-^|7,-^ |7,1^|2^3|6.^1'_|4^3|2-^|23_5_|62'|1'7_^6_|5-^|5- |1'.^7_|6^5_^3_|1'3^|5^6^ |1'-^ |1'-^|1'3^|7^6|7- |6- |#5-^|#56_. 6__ |6 6 |3_^5_4_^2_|1-^ |1 0|5_.5__5_^6_|5-|63_^2_|1-|1_.1__6|6.^1'_|6_^5_4_^3_|2-|3_.3__6_ 6_ |6- |44_.^3__|3-|2_2__2__6_5_|4_^3_2_^1_|5-^|5-|3_.3__6_ 6_ |6- |7 7_.^ 6 __|6-|3_3__5__ 6_5_|3_^5_4_^2_|1-^ |1- || \ No newline at end of file +{Piano}5.5__5__|5.5__5__|1'_2'__1'__6_1'__6__|5_6__5__3_5__3__|2_5,_1__2__3__4__| +{Piano}5.5__5__|5.5__5__|1'_2'__1'__6_1'__6__|5_6__5__3_5__3__|2_5,_1__2__3__4__| + +{VoiceAahs}5_.5__5_^6_|5-|63_^2_|1-|1_.1__6|6.^1'_|6_^5_4_^3_|2-| +{VoiceAahs}5_.5__5_^6_|5-|63_^2_|1-|1_.1__6|6.^1'_|6_^5_4_^3_|2-| + +{VoiceAahs}5_.5__1'|1'-|66_.5__|3-|2_.2__6_5_|4_^3_2_^1_|5-^|5-| +{VoiceAahs}3_.3__6 |6- |44_.3__|3-|2_.2__6_5_|4_^3_2_^1_|5-^|5-| + +{VoiceAahs}5_.5__1'|1'-|2'2'_.1'__|6-|5_.1'__6_5_|33_^2_|1-^|10| +{VoiceAahs}3_.3__6 |6- |7 7_. 6 __|6-|3_.5__ 6_5_|33_^2_|1-^|10| + +{VoiceAahs}3.^5_|1_^7,_^6,_^5,_|1-^|11_2_|3 1'|76_^5_|6-^ |6- | +{VoiceAahs}00 |0 0 |03^|2^1^ |7,-^|7,-^ |7,1^|2^3| + +{VoiceAahs}00 |0 0|05^|4^3^ |2-^|2-^ |23^|5^6| +{VoiceAahs}6.^1'_|4^3|2-^|23_5_|62'|1'7_^6_|5-^|5- | + +{VoiceAahs}1'.^7_|6^5_^3_|1'-^|1'1'_2'_|3'2'_^1'_|37 |6-^ |6- | +{VoiceAahs}1'.^7_|6^5_^3_|1'3^|5^6^ |1'-^ |1'-^|1'3^|7^6| + +{VoiceAahs}2'-|1'.^6_|3'-^|3'2'_.3'__|2'1'|3_^5_6_^5_|1'-^|1'0| +{VoiceAahs}7- |6- |#5-^|#56_. 6__ |6 6 |3_^5_4_^2_|1-^ |1 0| + +{VoiceAahs}5_.5__5_^6_|5-|63_^2_|1-|1_.1__6|6.^1'_|6_^5_4_^3_|2-| +{VoiceAahs}5_.5__5_^6_|5-|63_^2_|1-|1_.1__6|6.^1'_|6_^5_4_^3_|2-| + +{VoiceAahs}5_.5__1'_1'_|1'-|66_.^5__|3-|2_2__2__6_5_|4_^3_2_^1_|5-^|5-| +{VoiceAahs}3_.3__6_ 6_ |6- |44_.^3__|3-|2_2__2__6_5_|4_^3_2_^1_|5-^|5-| + +{VoiceAahs}5_.5__1'_1'_|1'-|2'2'_.^1'__|6-|5_5__1'__6_5_|3_^5_6_^5_|1'-^|1'-|| +{VoiceAahs}3_.3__6_ 6_ |6- |7 7_.^ 6 __|6-|3_3__5__ 6_5_|3_^5_4_^2_|1-^ |1- || \ No newline at end of file diff --git a/Songs/Socialism_is_Good.qym b/Songs/Socialism_is_Good.qym index 4e7dac9..2f76bbd 100644 --- a/Songs/Socialism_is_Good.qym +++ b/Songs/Socialism_is_Good.qym @@ -2,4 +2,8 @@ //希扬 词 //李焕之 曲 <1=G><2/4><100> -3_3_3_5_|3.^2_|1_6,_1_2_|30|3_3_3_5_|65_^6_|6,_6,_6,_1_|2-|3_.2__1_0_|1_.6,__5,_0_|3_.5__3_2_|1_.2__1_2_|36,_^1_|5,-|3_.5__3_5_|66_^5_|6-|3_23_|6_0_5_0_|3_0_2_0_|6_.5__3_^2_|1.^2_|6_.5__3_^2_|10|| \ No newline at end of file +3_3_3_5_|3.^2_|1_6,_1_2_|30|3_3_3_5_|65_^6_|6,_6,_6,_1_|2-| + +3_.2__1_0_|1_.6,__5,_0_|3_.5__3_2_|1_.2__1_2_|36,_^1_|5,-| + +3_.5__3_5_|66_^5_|6-|3_23_|6_0_5_0_|3_0_2_0_|6_.5__3_^2_|1.^2_|6_.5__3_^2_|10|| \ No newline at end of file diff --git a/Songs/Sunny_Light.qym b/Songs/Sunny_Light.qym index 021760e..ad7019b 100644 --- a/Songs/Sunny_Light.qym +++ b/Songs/Sunny_Light.qym @@ -2,5 +2,5 @@ //李幼容 词 //徐锡宜 曲 <1=G><2/4><132> -{Piano}35_5_^|5_5_4|5,4_4_^|4_4_3|35_5_^|5_5_4|5,4_4_^|4_4_3|3_3_5_5_|4_4_2|5,_5,_6,_^7,_|1-|{VoiceAahs}5,5,|1_1_0|3_.^4__5_4_|3_1_0|2_2^3_|2_^0_^6,_^5,_|5,-^|5,.0_|5,5,|1_1_0|3_.^4__5_4_|3_1_0|2_2^3_|2_^6,_^0_^5,_|1-^|1.0_|66|4.6_|5_56_|5_4_3|2_2_2_1_|2_13_|5_5_5_^6_|5-|35_5_^|5_5_4|5,4_4_^|4_4_3|35_5_^|5_5_4|5,4_4_^|4_4_3|3_3_5|4_4_2|5,_5,_4_4_|3-|3_3_5_5_|4_4_2|5,_5,_6,_^7,_|1-|3_3_5|4_4_2 |5,_5,_4_4_|3-|3_3_5_5_|4_4_2 |[1.]5,_5,_6,_^7,_|1-:||[2.]5,.5,_|4 ^3 |1-^|1-^|1-^|10|| -{Piano}35_5_^|5_5_4|5,4_4_^|4_4_3|35_5_^|5_5_4|5,4_4_^|4_4_3|3_3_5_5_|4_4_2|5,_5,_6,_^7,_|1-|{VoiceAahs}5,5,|1_1_0|3_.^4__5_4_|3_1_0|2_2^3_|2_^0_^6,_^5,_|5,-^|5,.0_|5,5,|1_1_0|3_.^4__5_4_|3_1_0|2_2^3_|2_^6,_^0_^5,_|1-^|1.0_|66|4.6_|5_56_|5_4_3|2_2_2_1_|2_13_|5_5_5_^6_|5-|13_3_^|3_3_2|5,2_2_^|2_2_1|13_3_^|3_3_2|5,2_2_^|2_2_1|3_3_5|4_4_2|5,_5,_4_4_|3-|3_3_5_5_|4_4_2|5,_5,_6,_^7,_|1-|1_1_3|2_2_7,|5,_5,_2_2_|1-|1_1_3_3_|2_2_7,|[1.]5,_5,_6,_^7,_|1-:||[2.]5,.5,_|6,^7,|1-^|1-^|1-^|10|| \ No newline at end of file +{Piano}35_5_^|5_5_4|5,4_4_^|4_4_3|35_5_^|5_5_4|5,4_4_^|4_4_3|3_3_5_5_|4_4_2|5,_5,_6,_^7,_|1-|5,5,|1_1_0|3_.^4__5_4_|3_1_0|2_2^3_|2_^0_^6,_^5,_|5,-^|5,.0_|5,5,|1_1_0|3_.^4__5_4_|3_1_0|2_2^3_|2_^6,_^0_^5,_|1-^|1.0_|66|4.6_|5_56_|5_4_3|2_2_2_1_|2_13_|5_5_5_^6_|5-|35_5_^|5_5_4|5,4_4_^|4_4_3|35_5_^|5_5_4|5,4_4_^|4_4_3|3_3_5|4_4_2|5,_5,_4_4_|3-|3_3_5_5_|4_4_2|5,_5,_6,_^7,_|1-|3_3_5|4_4_2 |5,_5,_4_4_|3-|3_3_5_5_|4_4_2 |[1.]5,_5,_6,_^7,_|1-:||[2.]5,.5,_|4 ^3 |1-^|1-^|1-^|10|| +{Piano}35_5_^|5_5_4|5,4_4_^|4_4_3|35_5_^|5_5_4|5,4_4_^|4_4_3|3_3_5_5_|4_4_2|5,_5,_6,_^7,_|1-|5,5,|1_1_0|3_.^4__5_4_|3_1_0|2_2^3_|2_^0_^6,_^5,_|5,-^|5,.0_|5,5,|1_1_0|3_.^4__5_4_|3_1_0|2_2^3_|2_^6,_^0_^5,_|1-^|1.0_|66|4.6_|5_56_|5_4_3|2_2_2_1_|2_13_|5_5_5_^6_|5-|13_3_^|3_3_2|5,2_2_^|2_2_1|13_3_^|3_3_2|5,2_2_^|2_2_1|3_3_5|4_4_2|5,_5,_4_4_|3-|3_3_5_5_|4_4_2|5,_5,_6,_^7,_|1-|1_1_3|2_2_7,|5,_5,_2_2_|1-|1_1_3_3_|2_2_7,|[1.]5,_5,_6,_^7,_|1-:||[2.]5,.5,_|6,^7,|1-^|1-^|1-^|10|| \ No newline at end of file diff --git a/Songs/The_East_is_Red.qym b/Songs/The_East_is_Red.qym index e2de2b8..d936478 100644 --- a/Songs/The_East_is_Red.qym +++ b/Songs/The_East_is_Red.qym @@ -1,4 +1,6 @@ //东方红 //陕北民歌 <1=F><2/4><90> -55_^6_|2-|11_^6,_|2-|55|6_^1'_6_5_|11_^6,_|2-|52|17,_^6,_|5,5|23_2_|11_^6,_|2_3_2_1_|2_^1_7,_^6,_|5,-^|5,0|| \ No newline at end of file +55_^6_|2-|11_^6,_|2-|55|6_^1'_6_5_|11_^6,_|2-| + +52|17,_^6,_|5,5|23_2_|11_^6,_|2_3_2_1_|2_^1_7,_^6,_|5,-^|5,0|| \ No newline at end of file diff --git a/Songs/The_Internationale.qym b/Songs/The_Internationale.qym index fc51e8a..72e45f7 100644 --- a/Songs/The_Internationale.qym +++ b/Songs/The_Internationale.qym @@ -2,4 +2,18 @@ //欧仁·鲍狄埃 词 //皮埃尔·狄盖特 曲 <1=bB><4/4><88> -5|1'.7_2'_1'_5_3_|6.^6_40_6_|2'.1'_7_6_5_4_|3--5|1'.7_2'_1'_5_3_|6-4_6_2'_^1'_|72'4'^7|1'-^1'_0_3'_2'_|7-6_7_1'_6_|7-5_5_#4_5_|6.6_2'.^1'_|7-^7_0_2'2'.7_5_5_#4_5_|3'-1'_6_7_1'_|72'1'6|5-5_0_3'_2'_|1'-5.3_|6-4_0_2'_.1'__|7-65|5-^5_0_5|3'-2'5|1'-7.7_|6.#5_62'|2'-^2'_0_3'_.2'__|1'-5.3_|6-4_0_2'_.1'__|7-65|3'--3'|5'-4'3'|2'.^3'_4'0_4'_|3'.3'_2'.2'_|1'--|| \ No newline at end of file +5|1'.7_2'_1'_5_3_|6.^6_40_6_|2'.1'_7_6_5_4_|3--5| + +1'.7_2'_1'_5_3_|6-4_6_2'_^1'_|72'4'^7|1'-^1'_0_3'_2'_| + +7-6_7_1'_6_|7-5_5_#4_5_|6.6_2'.^1'_| + +7-^7_0_2'2'.7_5_5_#4_5_|3'-1'_6_7_1'_|72'1'6|5-5_0_3'_2'_| + +1'-5.3_|6-4_0_2'_.1'__|7-65|5-^5_0_5| + +3'-2'5|1'-7.7_|6.#5_62'|2'-^2'_0_3'_.2'__| + +1'-5.3_|6-4_0_2'_.1'__|7-65|3'--3'| + +5'-4'3'|2'.^3'_4'0_4'_|3'.3'_2'.2'_|1'--|| \ No newline at end of file From 26cdabd8137a79071910157065e9aa2bc50baf99 Mon Sep 17 00:00:00 2001 From: NN708 Date: Sun, 21 Jan 2018 21:13:51 +0800 Subject: [PATCH 52/54] =?UTF-8?q?=E6=BC=8F=E7=BD=91=E4=B9=8B=E9=B1=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Songs/Kaze_No_Sumu_Machi.qym | 42 +++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/Songs/Kaze_No_Sumu_Machi.qym b/Songs/Kaze_No_Sumu_Machi.qym index ace8706..16a38e9 100644 --- a/Songs/Kaze_No_Sumu_Machi.qym +++ b/Songs/Kaze_No_Sumu_Machi.qym @@ -1,4 +1,44 @@ //风居住的街道 //矶村由纪子 曲 <1=C><4/4><72> -b7_1'_2'4'2'|1'b75b7|2'4'1'b7_1'_|2'--0|b7_1'_2'4'2'|1'b75b7|2'4'1'6|5-^5_0_5_b7_|2'_1'_2'.4'_2'_5_|1'b7-5_b7_|2'_1'_2'.5'_4'_1'_|2'-^2'_0_5_b7_|2'_1'_2'.4'_2'_5_|1'b7-5_b7_|b7.1'_54|5-^5_0_5'_b7'_|2''_1''_2''.4''_2''_5'_|1''b7'-5'_b7'_|2''_1''_2''.5''_4''_1''_|2''-^2''_0_5'_b7'_|2''_1''_2''.4''_2''_5'_|1''b7'-5'_b7'_|b7'.1''_5'4'|5'__^4'__^5'_^5^'.0_b7_b2'_|4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|4'_b3'_4'.b7'_b6'_b3'_|b3'_4'_^4'.0_b7_b2'_|4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|b2'.b3'_b7b6|b7__^b6__^b7_^b7^b7_0_4'_b7'_|b2'.b2'_b3'4'|b7--4'_b7'_|b2'.b2'_b3'4'_b6'_|4'__^b6'__^4'_^4'-4'_b6'_|b7'.b6'_b7'b2''_1''_|b7'.b6'_4'4'_b7'_|b2'.b2'_b3'4'|b7-^b7_0_4'_b7'_|b2'.b2'_b3'4'|b7--4'_b7'_|b2'.b2'_b3'4'_b6'_|4'__^b6'__^4'_^4'-4'_b6'_|b7'.b6'_b7'b2''_1''_|b7'.b6'_4'4'_b7'_|b2'.b2'_b3'4'|b7-^b7_0_5_b7_|2'_1'_2'.4'_2'_5_|1'b7-5_b7_|2'_1'_2'.5'_4'_1'_|2'-^2'_0_5_b7_|2'_1'_2'.4'_2'_5_|1'b7-5_b7_|b7.1'_54|5-^5_02'_|2''5'_2''_1''_4'_b7'_6'_|5'5'__^6'__^b7'__^1''__2''_1''_b7'_6'_|5'5''4''1''_4''_|2''-^2''_0_5'__^6'__^b7'__^1''__|2''.5''_4''6''__5''__4''_|2''-^2''_0_5'__^6'__^b7'__^6'__|b7'5'_b7'_6'4'_2'_|5'-^5'_0_b7_b2'_|4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|4'_b3'_4'.b7'_b6'_b3'_|b3'_4'_^4'.0_b7_b2'_|4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|b2'.b3'_b7.b6_|b7__^b6__^b7_^b7^b7_0_b7_b2'_|4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|4'_b3'_4'.b7'_b6'_b3'_|4'^4'.0_b7_b2'_|4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|b2'.b3'_b7.b6_|b7-^b7_0_b7'_b2''_|b2''.b3''_b7'b6'|b7'__^b6'__^b7'_^b7'--|| \ No newline at end of file +b7_1'_2'4'2'|1'b75b7|2'4'1'b7_1'_|2'--0| + +b7_1'_2'4'2'|1'b75b7|2'4'1'6|5-^5_0_5_b7_| + +2'_1'_2'.4'_2'_5_|1'b7-5_b7_|2'_1'_2'.5'_4'_1'_|2'-^2'_0_5_b7_| + +2'_1'_2'.4'_2'_5_|1'b7-5_b7_|b7.1'_54|5-^5_0_5'_b7'_| + +2''_1''_2''.4''_2''_5'_|1''b7'-5'_b7'_|2''_1''_2''.5''_4''_1''_|2''-^2''_0_5'_b7'_| + +2''_1''_2''.4''_2''_5'_|1''b7'-5'_b7'_|b7'.1''_5'4'|5'__^4'__^5'_^5^'.0_b7_b2'_| + +4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|4'_b3'_4'.b7'_b6'_b3'_|b3'_4'_^4'.0_b7_b2'_| + +4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|b2'.b3'_b7b6|b7__^b6__^b7_^b7^b7_0_4'_b7'_| + +b2'.b2'_b3'4'|b7--4'_b7'_|b2'.b2'_b3'4'_b6'_|4'__^b6'__^4'_^4'-4'_b6'_| + +b7'.b6'_b7'b2''_1''_|b7'.b6'_4'4'_b7'_|b2'.b2'_b3'4'|b7-^b7_0_4'_b7'_| + +b2'.b2'_b3'4'|b7--4'_b7'_|b2'.b2'_b3'4'_b6'_|4'__^b6'__^4'_^4'-4'_b6'_| + +b7'.b6'_b7'b2''_1''_|b7'.b6'_4'4'_b7'_|b2'.b2'_b3'4'|b7-^b7_0_5_b7_| + +2'_1'_2'.4'_2'_5_|1'b7-5_b7_|2'_1'_2'.5'_4'_1'_|2'-^2'_0_5_b7_| + +2'_1'_2'.4'_2'_5_|1'b7-5_b7_|b7.1'_54|5-^5_02'_| + +2''5'_2''_1''_4'_b7'_6'_|5'5'__^6'__^b7'__^1''__2''_1''_b7'_6'_|5'5''4''1''_4''_|2''-^2''_0_5'__^6'__^b7'__^1''__| + +2''.5''_4''6''__5''__4''_|2''-^2''_0_5'__^6'__^b7'__^6'__|b7'5'_b7'_6'4'_2'_|5'-^5'_0_b7_b2'_| + +4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|4'_b3'_4'.b7'_b6'_b3'_|b3'_4'_^4'.0_b7_b2'_| + +4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|b2'.b3'_b7.b6_|b7__^b6__^b7_^b7^b7_0_b7_b2'_| + +4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|4'_b3'_4'.b7'_b6'_b3'_|4'^4'.0_b7_b2'_| + +4'_b3'_4'.b6'_4'_b7_|b3'b2'-b7_b2'_|b2'.b3'_b7.b6_|b7-^b7_0_b7'_b2''_| + +b2''.b3''_b7'b6'|b7'__^b6'__^b7'_^b7'--|| \ No newline at end of file From 331d1ed19524497463ef857a0b4ac55beb40380d Mon Sep 17 00:00:00 2001 From: NN708 Date: Mon, 22 Jan 2018 22:54:47 +0800 Subject: [PATCH 53/54] =?UTF-8?q?=E7=90=B6=E9=9F=B3=E8=AE=B0=E5=8F=B7?= =?UTF-8?q?=E5=B0=B1=E5=AE=9A=E4=B8=BA=20$=20=E5=90=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/qymToken.wl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/qymToken.wl b/Lib/qymToken.wl index c9c4040..726110a 100644 --- a/Lib/qymToken.wl +++ b/Lib/qymToken.wl @@ -140,13 +140,13 @@ trackTokenizer[track_]:=StringCases[track,{ "Type"->"Tie" }, (* Note *) - pitches:((pitch~~"&")...~~pitch)~~durOp:durOp:>{ + arpeggio:("$"...)~~pitches:((pitch~~"&")...~~pitch)~~durOp:durOp:>{ "Type"->"Note", "Pitches"->getPitch[StringDelete[pitches,"&"]], "SemitonesCount"->0, "OctavesCount"->0, "Staccato"->False, - "Arpeggio"->False, + "Arpeggio"->(StringLength[arpeggio]==1), "DurationOperators"->durOp }, (* Space *) From ff9391ca934adce233620840f09865e64e05f0d8 Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Mon, 22 Jan 2018 23:19:05 +0800 Subject: [PATCH 54/54] Add some adjustments --- Songs/Noushyou_Sakuretsu_Garu.qys | 313 ++++++++++++------------------ Songs/Touhou/Dream_Battle.qys | 209 ++------------------ Songs/Touhou/Houkainohi.qys | 7 +- 3 files changed, 144 insertions(+), 385 deletions(-) diff --git a/Songs/Noushyou_Sakuretsu_Garu.qys b/Songs/Noushyou_Sakuretsu_Garu.qys index a91db9e..58f9e24 100644 --- a/Songs/Noushyou_Sakuretsu_Garu.qys +++ b/Songs/Noushyou_Sakuretsu_Garu.qys @@ -42,128 +42,104 @@ x0x0x0x0x0x0x0x0|x0x0x0x0x0x0x0x0\ x0x0x0x0x0x0x0x0|x0x0x0x0x0x0x0x0\ x0x0x0x0x0x0x0x0|x0x0x0x0x0x0x0x0| -//----------Section 2-3---------- +//----------Section 2A---------- <150><4/4> -<1=bA,>\ +<1=bA,>\ 56-66-56-66-5665|6-6-6-6666661'665\ 6-6-6-6566666665|6-6-1'1'2'2'2#'-2#'-2'1'65\ 56-66-56-66-5665|6-6-6-6666661'665\ -6-6-6-656-6-6-65|56661'6652'1'6-56-1'\ -{\ -23561'2'3'5'6'5'3'2'1'653|23561'2'3'5'7b'6'5'3'7b653\ -23561'2'3'5'6'5'3'2'1'653|23561'2'3'5'7b'6'5'3'7b653}\ -\ -56666-65-6666665|6-6-6-6566661'1'2'2'\ -6666566656665665|6-6-1'1'2'2'2#'-2#'-2'1'65\ -5666666566666555|666-6-6566661'1'2'2'\ -6-6-6-656-6-5665|61'656--5#\ -{\ -2'-^2'-1'-7-1'7^|7-5-5-35-6666666\ -6-6565656-656565|666666662'-3'-5556\ -1'-1'6777677|77777771'2'-3'-5-6-\ -(12~)666665666665|6666666666662'-1'-}| +6-6-6-656-6-6-65|56661'6652'1'6-56-1'| -<1=bA,,>\ +<1=bA,,>\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ -6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ -6,[36]6,[36]6,[36]6,[36]|7b,[47b]7b,[47b]7b,[47b]7b,[47b]\ -6,[36]6,[36]6,[36]6,[36]|7b,[47b]7b,[47b]5,[25]3,[7,3]\ -6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ -6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ -6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ -6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ -2[62']2[62']3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ -4[14]'4[14]'3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ -4[14]'4[14]'3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ -[41'4']-[373']-|[6,36]---| +6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]| -<1=bA,,><0.6>\ -6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ -6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ -6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ -6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ +<0.5>\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx| + +<0.1>\ +0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ +0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x| + +//----------Section 2B---------- +<150><4/4> + +<1=bA,>\ +23561'2'3'5'6'5'3'2'1'653|23561'2'3'5'7b'6'5'3'7b653\ +23561'2'3'5'6'5'3'2'1'653|23561'2'3'5'7b'6'5'3'7b653| + +<1=bA,,>\ 6,[36]6,[36]6,[36]6,[36]|7b,[47b]7b,[47b]7b,[47b]7b,[47b]\ -6,[36]6,[36]6,[36]6,[36]|7b,[47b]7b,[47b]5,[25]3,[7,3]\ -6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ +6,[36]6,[36]6,[36]6,[36]|7b,[47b]7b,[47b]5,[25]3,[7,3]| + +<0.5>\ +xxxx|xxxx|xxxx|xxxx| + +//----------Section 3A---------- +<150><4/4> + +<1=Ab,>\ +56666-65-6666665|6-6-6-6566661'1'2'2'\ +6666566656665665|6-6-1'1'2'2'2#'-2#'-2'1'65\ +5666666566666555|666-6-6566661'1'2'2'\ +6-6-6-656-6-5665|61'656--5#| + +<1=Ab,,>\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ 6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]\ +6,[36]6,[36]6,[36]6,[36]|4,[14]4,[14]3,[7,3]3,[7,3]| + +<0.5>\ +xxxx|xxxx|xxxx|xxxx\ +xxxx|xxxx|xxxx|xxxx| + +<0.1>\ +0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ +0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x| + +//----------Section 3B---------- +<150><4/4> + +<1=Ab,>\ +2'-^2'-1'-7-1'7^|7-5-5-35-6666666\ +6-6565656-656565|666666662'-3'-5556\ +1'-1'6777677|77777771'2'-3'-5-6-\ +(12~)666665666665|6666666666662'-1'-| + +<1=Ab,,,>\ 2[62']2[62']3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ 4[14]'4[14]'3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ 4[14]'4[14]'3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ [41'4']-[373']-|[6,36]---| <0.5>\ -xxxx|xxxx|xxxx|xxxx\ -xxxx|xxxx|xxxx|xxxx\ -xxxx|xxxx|xxxx|xxxx\ -xxxx|xxxx|xxxx|xxxx\ -xxxx|xxxx|xxxx|xxxx\ x---|x---|x---|x---\ x---|x---|xxxx|xxxxx_x_x_x_x_x_x_x_| -<0.1>\ -0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ -0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ -0---|0---|0---|0---\ -0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ -0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ -\ +<0.1>\ x-x-|x-x-|x-x-|x-x-\ x-x-|x-x-|x-x-|x-x-| -<0.4>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -\ +<0.4>\ 0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ 0x0x0x0x|0x0x0x0x|0---|0---| //----------Section 4---------- <150><4/4> -<1=Bb><0.7>\ +<1=Bb><0.7>\ 3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ 666-666666666665|666666663'-2'-2'-1'-\ 3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ 666-666666666661'|2'2'2'1'2'2'2'1'2'-3'-5-6-^\ <3/4>6--| -<1=Bb>\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666665|666666663'-2'-2'-1'-\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666661'|2'2'2'1'2'2'2'1'2'-3'-5-6-^\ -<3/4>6--| - -<1=Bb><0.4>\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666665|666666663'-2'-2'-1'-\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666661'|2'2'2'1'2'2'2'1'2'-3'-5-6-^\ -<3/4>6--| - -<1=Bb,><0.6>\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]5,[25]5,[25]|4,[14]4,[14]5,[25]5,[25]\ -<3/4>0--| - -<1=Bb,>\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]5,[25]5,[25]|4,[14]4,[14]5,[25]5,[25]\ -<3/4>0--| - -<1=Bb,>\ +<1=Bb,><0.6>\ [4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ 4,[14]4,[14]3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ [4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ @@ -229,119 +205,106 @@ x0-|x0-|x0-|x0-\ 0xx|0xx|0xx|0x_x_x_x_\ 0--|0--|0--|0--| -//----------Section 6-7---------- +//----------Section 6A---------- <150><4/4> -<1=bA>\ -{\ -6'---|0---|5'---|0---}\ +<1=bA>6'---|0---|5'---|0---| + +<0.6><1=bA,,,>65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5| + +<0.4>x-x-|x-x-|x-x-|x-x-| + +<0.3>0x0x|0x0x_x_|0x0x|0x0x__x_x__| + +//----------Section 6B---------- +<150><4/4> + +<1=bA>\ 566-6-6566666-66|6-6-6-656661'--65\ 6666666666666665|666-1'1'2'2'2#'-3'-2'1'65\ 566-6-6566666-66|6-6-6-656-6-1'-2'-\ -6-666-556-666665|6-66-1'662'1'6-56-1'\ -{\ +6-666-556-666665|6-66-1'662'1'6-56-1'| + +<1=bA,,,>\ +65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ +65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5| + +<0.4>\ +x-x-|x-x-|x-x-|x-x-\ +x-x-|x-x-|x-x-|x-x-| + +<0.3>\ +0x0x|0x0x_x_|0x0x|0x0x__x_x__\ +0x0x|0x0x_x_|0x0x|0x0x__x_x__| + +//----------Section 6C---------- +<150><4/4> + +<1=bA,>\ 65671'671'2'3'2'1'71'75|461'71'6435#75#371'2'7\ -65671'671'2'3'4'2'5'4'3'4'|3'1'61'72'1'75#72'5#4'5#3'5#}\ -\ +65671'671'2'3'4'2'5'4'3'4'|3'1'61'72'1'75#72'5#4'5#3'5#| + +<1=bA,,,>\ +65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5| + +<0.4>\ +x-x-|x-x-|x-x-|x-x-| + +<0.3>\ +0x0x|0x0x_x_|0x0x|0x0x__x_x__| + +//----------Section 7A---------- +<150><4/4> + +<1=bA>\ 66-66-65-6666665|666666656-661'1'2'2'\ 666666666-666-6-|56-61'1'2'2'2#'2#'3'-2'1'65\ 6666666656-60---|666-6-6566661'1'2'2'\ -6-6-6-656-6-5665|61'656--5#\ -{\ +6-6-6-656-6-5665|61'656--5#| + +<1=bA,,,>\ +65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ +65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5| + +<0.4>\ +x-x-|x-x-|x-x-|x-x-\ +x-x-|x-x-|x-x-|x-x-| + +<0.3>\ +0x0x|0x0x_x_|0x0x|0x0x__x_x__\ +0x0x|0x0x_x_|0x0x|0x0x__x_x__| + +//----------Section 7B---------- +<150><4/4> + +<1=bA,>\ 2'-^2'-1'-7-1'7^|7-5-5-35-6666666\ 6-6565656-656565|666666662'-3'-5556\ 1'-1'6777677|77777771'2'-3'-5-6-\ -(12~)666665666665|6666666666662'-1'-}| +(12~)666665666665|6666666666662'-1'-| <1=bA,,,><0.6>\ -65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -65671'.1'_0-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -2[62']2[62']3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ -4[14]'4[14]'3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ -4[14]'4[14]'3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ -[41'4']-[373']-|[6,36]---| - -<1=bA,,,><0.6>\ -65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -65671'.1'_^%-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ -65671'.1'_0-|4.4.43.3.5|65671'.1'_^%-|4.4.43.3.5\ 2[62']2[62']3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ 4[14]'4[14]'3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ 4[14]'4[14]'3[73']3[73']|6,[36]6,[36]6,[36]6,[36]\ [41'4']-[373']-|[6,36]---| -<0.4>\ -x-x-|x-x-|x-x-|x-x-\ -x-x-|x-x-|x-x-|x-x-\ -x-x-|x-x-|x-x-|x-x-\ -x-x-|x-x-|x-x-|x-x-\ -x-x-|x-x-|x-x-|x-x-\ -x-x-|x-x-|x-x-|x-x-\ -0---|0---|0---|0---\ -0---|0---|0---|0---| - -<0.3>\ -0x0x|0x0x_x_|0x0x|0x0x__x_x__\ -0x0x|0x0x_x_|0x0x|0x0x__x_x__\ -0x0x|0x0x_x_|0x0x|0x0x__x_x__\ -0---|0---|0---|0---\ -0x0x|0x0x_x_|0x0x|0x0x__x_x__\ -0x0x|0x0x_x_|0x0x|0x0x__x_x__\ -\ +<0.3>\ 0x0x0x0x|0x0x0x0x|0x0x0x0x|0x0x0x0x\ 0x0x0x0x|0x0x0x0x|0---|0---| <0.6>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ x---|x---|x---|x---\ x---|x---|xxxx|xxxxx_x_x_x_x_x_x_x_| <0.3>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ x-x-|x-x-|x-x-|x-x-\ x-x-|x-x-|x-x-|x-x-| //----------Section 8-9---------- <150><4/4> -<1=Bb><0.7>\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666665|666666663'-2'-2'-1'-\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666661'|2'2'2'1'2'2'2'1'2'-3'-5-6-<1=B>\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666665|666666663'-2'-2'-1'-\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666661'|2'2'2'1'2'2'2'1'2'-3'-5-6-| - -<1=Bb>\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666665|666666663'-2'-2'-1'-\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666661'|2'2'2'1'2'2'2'1'2'-3'-5-6-<1=B>\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666665|666666663'-2'-2'-1'-\ -3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ -666-666666666661'|2'2'2'1'2'2'2'1'2'-3'-5-6-| - -<1=Bb><0.4>\ +<1=Bb><0.7>\ 3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ 666-666666666665|666666663'-2'-2'-1'-\ 3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ @@ -351,27 +314,7 @@ x-x-|x-x-|x-x-|x-x-| 3'3'2'2'2'1'2'2'2'1'|2'-3'-2'1'-6-----5-5\ 666-666666666661'|2'2'2'1'2'2'2'1'2'-3'-5-6-| -<1=Bb,><0.6>\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]5,[25]5,[25]|4,[14]4,[14]5,[25]5,[25]<1=B,>\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]5,[25]5,[25]|4,[14]4,[14]5,[25]5,[25]| - -<1=Bb,>\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]5,[25]5,[25]|4,[14]4,[14]5,[25]5,[25]<1=B,>\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -[4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ -4,[14]4,[14]5,[25]5,[25]|4,[14]4,[14]5,[25]5,[25]| - -<1=Bb,>\ +<1=Bb,>\ [4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ 4,[14]4,[14]3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ [4,14]-[4,14]-3,[7,3]3,[7,3]|6,[36]6,[36]5,[25]5,[25]\ diff --git a/Songs/Touhou/Dream_Battle.qys b/Songs/Touhou/Dream_Battle.qys index b83f73c..b27faf9 100644 --- a/Songs/Touhou/Dream_Battle.qys +++ b/Songs/Touhou/Dream_Battle.qys @@ -49,94 +49,7 @@ //-------------------- Section B -------------------- <1=G><160><4/4> -\ -[13].[36]_[13]-|[31'].5__6__[27]_[31']_[7,5]_[16]_|[13].[36]_[13]-|[31']---\ -[13].[36]_[13]-|[31'].5__6__[37]_[31']_[363']_[7,5]_|[16].[63']_[16]-^|%---\ -[6,1].[13]_[6,1]-|[16].2__3__[7,5]_[7,2]_[57],_[7,2]_|[3,1].[13]_[3,1]-|[16]---\ -[6,1].[13]_[6,1]-|[16].5__6__[27]_[31']_[363']_[25]_|[16].[63']_[16]-^|%---\ -[13].[36]_[13]-|[31'].5__6__[27]_[31']_[7,5]_[16]_|[13].[36]_[13]-|[31']---\ -[13].[36]_[13]-|[31'].5__6__[37]_[31']_[363']_[7,5]_|[16].[63']_[16]-^|%---\ -[6,1].[13]_[6,1]-|[16].2__3__[7,5]_[7,2]_[57],_[7,2]_|[3,1].[13]_[3,1]-|[16]---\ -[6,1].[13]_[6,1]-|[16].5__6__[27]_[31']_[363']_[25]_|[16].[63']_[16]-^|%---| - -<0.3>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -[13].[36]_[13]-|[31'].5__6__[27]_[31']_[7,5]_[16]_|[13].[36]_[13]-|[31']---\ -[13].[36]_[13]-|[31'].5__6__[37]_[31']_[363']_[7,5]_|[16].[63']_[16]-^|%---\ -[6,1].[13]_[6,1]-|[16].2__3__[7,5]_[7,2]_[57],_[7,2]_|[3,1].[13]_[3,1]-|[16]---\ -[6,1].[13]_[6,1]-|[16].5__6__[27]_[31']_[363']_[25]_|[16].[63']_[16]-^|%---| - -<0.4>\ -0.--[31'3']_|0%0.%_|0---|0-371'2'71'67563523\ -0-6,7,136371--0-31'|7276517,16,7,317,27,6,|0---[31'3']---0-[272']---67|1'3726157,1236,2345\ -0.--[31'3']_|0%0.%_|0---|0-371'2'71'67563523\ -0-6,7,136371--0-31'|7276517,16,7,317,27,6,|0---[31'3']---0-[272']---67|1'3726157,1236,2345\ -6,,2,3,5,6,23562'3'5'3'2'62'|3'5'3'2'65326,5,3,2,1,2,1,7,,|4,,6,7,14671'4'6'7'1''7'1''6'7'|4'6'7'1''7'6'4'1'6546572'5'\ -6,,2,3,5,6,23562'3'5'3'2'62'|3'5'3'2'65326,5,3,2,1,2,1,7,,|4,,6,7,14671'4'6'7'1''7'1''6'7'|4'6'7'1''7'6'4'1'6546572'5'\ -6,,2,3,5,6,23562'3'5'3'2'62'|3'5'3'2'65326,5,3,2,1,2,1,7,,|4,,6,7,14671'4'6'7'1''7'1''6'7'|4'6'7'1''7'6'4'1'6546572'5'\ -6,,2,3,5,6,23562'3'5'3'2'62'|3'5'3'2'65326,5,3,2,1,2,1,7,,|4,,6,7,14671'4'6'7'1''7'1''6'7'|4'6'7'1''7'6'4'1'6546572'5'| - -<0.2>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -6---^|%---|4---^|4--5\ -6---^|%---|4---^|4--5\ -6---^|%---|4---^|4--5\ -6---^|%---|4---^|4--5| - -<0.5>\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]| - - -//-------------------- Section C -------------------- -<1=bA><160><4/4> - -\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -[16]%%_.%_.%_|0_[7,5]_%%_.%_.[13]_|0%%_.%_.%_|0_%_%%_.%_.[7,5]_\ -[16]%%_.%_.%_|0_[27]_%%_.%_.[35#]_|0%%_.%_.%_|0_[5#3']_%%_.%_.%_| - -<0.3>\ -1'2'3'6'3'5'2'3'1'2'71'6756|23131'75635671'2'3'4'|3'1'3'2'72'1'61'7565231|27,16,7,5,6,3,5,2,3,6,2,3,6,7,\ -3236032356703236|32371'3726157,3212|5#,6,7,35#673'75#'65#'5#673|5#67,5#3217,17,7,6,7,6,5#,3,\ -1'2'3'6'3'5'2'3'1'2'71'6756|23131'75635671'2'3'4'|3'1'3'2'72'1'61'7565231|27,16,7,5,6,3,5,2,3,6,2,3,6,7,\ -3236032356703236|32371'3726157,3212|5#,6,7,35#673'75#'65#'5#673|5#67,5#3217,17,7,6,7,6,5#,3,| - -\ -4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|6,136316,136316,136'|316,136316,1363'4'3'1'\ -4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|5#,7,27,5#,7,37,5#,7,35#75#35#|73'75#3'5#'75#'65#'5#5#'2'75#3'\ -4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|6,136316,136316,136'|316,136316,1363'4'3'1'\ -4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|5#,7,27,5#,7,37,5#,7,35#75#35#|73'75#3'5#'75#65#'5#5#'2'75#-| - -<0.2>\ -4---|5---|6---|6---\ -4---|5---|5#---|5#---\ -[44']---|[55']---|[66']---|[66']---\ -[44']---|[55']---|[55']#---|[55']#---| - -<0.3>\ -4---|5.--6_^|%---^|%.--4_^\ -4---|5.--5#_^|%---^|%---\ -4---|5.--6_^|%---^|%.--4_^\ -4---|5.--5#_^|%---^|%---| - -//-------------------- Section D -------------------- -<1=F><160><4/4> - -<0.6>\ +<0.8>\ [13].[36]_[13]-|[31'].5__6__[27]_[31']_[7,5]_[16]_|[13].[36]_[13]-|[31']---\ [13].[36]_[13]-|[31'].5__6__[37]_[31']_[363']_[7,5]_|[16].[63']_[16]-^|%---\ [6,1].[13]_[6,1]-|[16].2__3__[7,5]_[7,2]_[57],_[7,2]_|[3,1].[13]_[3,1]-|[16]---\ @@ -156,104 +69,6 @@ [6,1].[13]_[6,1]-|[16].2__3__[7,5]_[7,2]_[57],_[7,2]_|[3,1].[13]_[3,1]-|[16]---\ [6,1].[13]_[6,1]-|[16].5__6__[27]_[31']_[363']_[25]_|[16].[63']_[16]-^|%---| -<0.3>\ -0.--[31'3']_|0%0.%_|0---|0-371'2'71'67563523\ -0-6,7,136371--0-31'|7276517,16,7,317,27,6,|0---[31'3']---0-[272']---67|1'3726157,1236,2345\ -0.--[31'3']_|0%0.%_|0---|0-371'2'71'67563523\ -0-6,7,136371--0-31'|7276517,16,7,317,27,6,|0---[31'3']---0-[272']---67|1'3726157,1236,2345\ -6,,2,3,5,6,23562'3'5'3'2'62'|3'5'3'2'65326,5,3,2,1,2,1,7,,|4,,6,7,14671'4'6'7'1''7'1''6'7'|4'6'7'1''7'6'4'1'6546572'5'\ -6,,2,3,5,6,23562'3'5'3'2'62'|3'5'3'2'65326,5,3,2,1,2,1,7,,|4,,6,7,14671'4'6'7'1''7'1''6'7'|4'6'7'1''7'6'4'1'6546572'5'\ -6,,2,3,5,6,23562'3'5'3'2'62'|3'5'3'2'65326,5,3,2,1,2,1,7,,|4,,6,7,14671'4'6'7'1''7'1''6'7'|4'6'7'1''7'6'4'1'6546572'5'\ -6,,2,3,5,6,23562'3'5'3'2'62'|3'5'3'2'65326,5,3,2,1,2,1,7,,|4,,6,7,14671'4'6'7'1''7'1''6'7'|4'6'7'1''7'6'4'1'6546572'5'| - -<0.2>\ -6---^|%---|4---^|%--5\ -6---^|%---|4---^|%--5\ -6---^|%---|4---^|%--5\ -6---^|%---|4---^|%--5\ -[6,6]---^|%---|[4,4]---^|%--[5,5]\ -[6,6]---^|%---|[4,4]---^|%--[5,5]\ -[6,6]---^|%---|[4,4]---^|%--[5,5]\ -[6,6]---^|%---|[4,4]---^|%--[5,5]| - -<0.2>\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]\ -6,[136]6,[136]6,[136]6,[136]|6,[136]6,[136]6,[136]5,[7,25]|4,[6,14]4,[6,14]4,[6,14]4,[6,14]|4,[6,14]4,[6,14]4,[6,14]5,[7,25]| - -//-------------------- Section A -------------------- -<1=G><160><4/4> - -<0.6>\ -[16]%%_.%_.%_|0_[7,5]_%%_.%_.[13]_|0%%_.%_.%_|0_%_%%_.%_.[7,5]_\ -[16]%%_.%_.%_|0_[27]_%%_.%_.[36]_|0%%_.%_.%_|0_%_%%_.%_.%_\ -[16]%%_.%_.%_|0_[7,5]_%%_.%_.[13]_|0%%_.%_.%_|0_%_%%_.%_.[7,5]_\ -[16]%%_.%_.%_|0_[27]_%%_.%_.[35#]_|0%%_.%_.%_|0_[5#3']_%%_.%_.%_\ -0---|0---|0---|0---| - -<0.4>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -1'2'3'6'3'5'2'3'1'2'71'6756|23131'75635671'2'3'4'|3'1'3'2'72'1'61'7565231|27,16,7,5,6,3,5,2,3,6,2,3,6,7,\ -3236032356703236|32371'3726157,3212|5#,6,7,35#673'75#'65#'5#673|5#67,5#3217,17,7,6,7,6,5#,3,\ -5#675#675#675#675#675#|671'2'3'5#'7'3''5#'6'7'3''5#'6'7'3''|5#'3''5#'2''5#'1''5#'7'3'5#'2'3'1'2'71'|675#635#237,15#,6,0---| - -\ -4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|6,136316,136316,136'|316,136316,1363'4'3'1'\ -4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|6,136316,136316,136'|316,136316,1363'4'3'1'\ -4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|6,136316,136316,136'|316,136316,1360-2'1'\ -4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|5#,7,27,5#,7,37,5#,7,35#75#35#|73'75#3'5#'75#65#'5#5#'2'75#-\ -5#,6,7,35#,6,7,35#363731'3|73635#363731'37363|5#363731'373635#363|731'30--| - -<0.3>\ -4---|5.--6_^|%---^|%.--4_^\ -4---|5.--6_^|%---^|%---\ -4---|5.--6_^|%---^|%.--4_^\ -4---|5.--5#_^|%---^|%---\ -0---|0---|0---|0---| - -<0.8>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0--[6,1]_[7,2]_| - -<0.5>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0--6,__3__7,__3__| - -//-------------------- Section B -------------------- -<1=G><160><4/4> - -\ -[13].[36]_[13]-|[31'].5__6__[27]_[31']_[7,5]_[16]_|[13].[36]_[13]-|[31']---\ -[13].[36]_[13]-|[31'].5__6__[37]_[31']_[363']_[7,5]_|[16].[63']_[16]-^|%---\ -[6,1].[13]_[6,1]-|[16].2__3__[7,5]_[7,2]_[57],_[7,2]_|[3,1].[13]_[3,1]-|[16]---\ -[6,1].[13]_[6,1]-|[16].5__6__[27]_[31']_[363']_[25]_|[16].[63']_[16]-^|%---\ -[13].[36]_[13]-|[31'].5__6__[27]_[31']_[7,5]_[16]_|[13].[36]_[13]-|[31']---\ -[13].[36]_[13]-|[31'].5__6__[37]_[31']_[363']_[7,5]_|[16].[63']_[16]-^|%---\ -[6,1].[13]_[6,1]-|[16].2__3__[7,5]_[7,2]_[57],_[7,2]_|[3,1].[13]_[3,1]-|[16]---\ -[6,1].[13]_[6,1]-|[16].5__6__[27]_[31']_[363']_[25]_|[16].[63']_[16]-^|%---| - -<0.3>\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -0---|0---|0---|0---\ -[13].[36]_[13]-|[31'].5__6__[27]_[31']_[7,5]_[16]_|[13].[36]_[13]-|[31']---\ -[13].[36]_[13]-|[31'].5__6__[37]_[31']_[363']_[7,5]_|[16].[63']_[16]-^|%---\ -[6,1].[13]_[6,1]-|[16].2__3__[7,5]_[7,2]_[57],_[7,2]_|[3,1].[13]_[3,1]-|[16]---\ -[6,1].[13]_[6,1]-|[16].5__6__[27]_[31']_[363']_[25]_|[16].[63']_[16]-^|%---| - <0.4>\ 0.--[31'3']_|0%0.%_|0---|0-371'2'71'67563523\ 0-6,7,136371--0-31'|7276517,16,7,317,27,6,|0---[31'3']---0-[272']---67|1'3726157,1236,2345\ @@ -286,33 +101,33 @@ //-------------------- Section C -------------------- -<1=bA><160><4/4> +<1=bA,><160><4/4> -\ +\ 0---|0---|0---|0---\ 0---|0---|0---|0---\ [16]%%_.%_.%_|0_[7,5]_%%_.%_.[13]_|0%%_.%_.%_|0_%_%%_.%_.[7,5]_\ [16]%%_.%_.%_|0_[27]_%%_.%_.[35#]_|0%%_.%_.%_|0_[5#3']_%%_.%_.%_| -<0.3>\ +<0.4>\ 1'2'3'6'3'5'2'3'1'2'71'6756|23131'75635671'2'3'4'|3'1'3'2'72'1'61'7565231|27,16,7,5,6,3,5,2,3,6,2,3,6,7,\ 3236032356703236|32371'3726157,3212|5#,6,7,35#673'75#'65#'5#673|5#67,5#3217,17,7,6,7,6,5#,3,\ 1'2'3'6'3'5'2'3'1'2'71'6756|23131'75635671'2'3'4'|3'1'3'2'72'1'61'7565231|27,16,7,5,6,3,5,2,3,6,2,3,6,7,\ 3236032356703236|32371'3726157,3212|5#,6,7,35#673'75#'65#'5#673|5#67,5#3217,17,7,6,7,6,5#,3,| -\ +\ 4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|6,136316,136316,136'|316,136316,1363'4'3'1'\ 4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|5#,7,27,5#,7,37,5#,7,35#75#35#|73'75#3'5#'75#'65#'5#5#'2'75#3'\ 4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|6,136316,136316,136'|316,136316,1363'4'3'1'\ 4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|5#,7,27,5#,7,37,5#,7,35#75#35#|73'75#3'5#'75#65#'5#5#'2'75#-| -<0.2>\ +<0.2>\ 4---|5---|6---|6---\ 4---|5---|5#---|5#---\ [44']---|[55']---|[66']---|[66']---\ [44']---|[55']---|[55']#---|[55']#---| -<0.3>\ +<0.3>\ 4---|5.--6_^|%---^|%.--4_^\ 4---|5.--5#_^|%---^|%---\ 4---|5.--6_^|%---^|%.--4_^\ @@ -321,7 +136,7 @@ //-------------------- Section D -------------------- <1=F><160><4/4> -<0.6>\ +<0.6>\ [13].[36]_[13]-|[31'].5__6__[27]_[31']_[7,5]_[16]_|[13].[36]_[13]-|[31']---\ [13].[36]_[13]-|[31'].5__6__[37]_[31']_[363']_[7,5]_|[16].[63']_[16]-^|%---\ [6,1].[13]_[6,1]-|[16].2__3__[7,5]_[7,2]_[57],_[7,2]_|[3,1].[13]_[3,1]-|[16]---\ @@ -374,28 +189,28 @@ //-------------------- Section A -------------------- <1=G><160><4/4> -<0.6>\ +<0.4>\ [16]%%_.%_.%_|0_[7,5]_%%_.%_.[13]_|0%%_.%_.%_|0_%_%%_.%_.[7,5]_\ [16]%%_.%_.%_|0_[27]_%%_.%_.[36]_|0%%_.%_.%_|0_%_%%_.%_.%_\ [16]%%_.%_.%_|0_[7,5]_%%_.%_.[13]_|0%%_.%_.%_|0_%_%%_.%_.[7,5]_\ [16]%%_.%_.%_|0_[27]_%%_.%_.[35#]_|0%%_.%_.%_|0_[5#3']_%%_.%_.%_\ 0---|0---|0---|0---| -<0.4>\ +<0.2>\ 0---|0---|0---|0---\ 0---|0---|0---|0---\ 1'2'3'6'3'5'2'3'1'2'71'6756|23131'75635671'2'3'4'|3'1'3'2'72'1'61'7565231|27,16,7,5,6,3,5,2,3,6,2,3,6,7,\ 3236032356703236|32371'3726157,3212|5#,6,7,35#673'75#'65#'5#673|5#67,5#3217,17,7,6,7,6,5#,3,\ 5#675#675#675#675#675#|671'2'3'5#'7'3''5#'6'7'3''5#'6'7'3''|5#'3''5#'2''5#'1''5#'7'3'5#'2'3'1'2'71'|675#635#237,15#,6,0---| -\ +<0.8>\ 4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|6,136316,136316,136'|316,136316,1363'4'3'1'\ 4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|6,136316,136316,136'|316,136316,1363'4'3'1'\ 4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|6,136316,136316,136'|316,136316,1360-2'1'\ 4,6,16,4,6,16,4,15,14,16,1|5,7,52752'757257,25,7,|5#,7,27,5#,7,37,5#,7,35#75#35#|73'75#3'5#'75#65#'5#5#'2'75#-\ 5#,6,7,35#,6,7,35#363731'3|73635#363731'37363|5#363731'373635#363|731'30--| -<0.3>\ +<0.2>\ 4---|5.--6_^|%---^|%.--4_^\ 4---|5.--6_^|%---^|%---\ 4---|5.--6_^|%---^|%.--4_^\ diff --git a/Songs/Touhou/Houkainohi.qys b/Songs/Touhou/Houkainohi.qys index d04ed63..4dbb2d4 100644 --- a/Songs/Touhou/Houkainohi.qys +++ b/Songs/Touhou/Houkainohi.qys @@ -19,7 +19,8 @@ [35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ [35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ [35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_3'_|0[42']#--\ -<1=A,>[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ +<1=A,,>\ +[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ [35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_3'_|[42']#---\ [35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_\ [35]'_4'#_2'_6_5_4#_2'_[35]'_^|%_4'#_2'_6_5_4#_2'_3'_|5'_4'#_2'_6_5_4#_2'_3'_|[42']#---\ @@ -42,7 +43,7 @@ [35]'_4'#_2'_6_5_4#_2'_[35]'_^|%`_4'#_2'_6_5_4#_2'_3'_|[35]'_4'#_2'_6_5_4#_2'_[35]'_^|%`_4'#_2'_6_5_4#_2'_4'#_\ [7,37]'.`[76'].`7o^|%`_0_[76']`7o`[72'']`|[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[73'']`\ [57'].`[56'].`[57']^|%`_0_[56']`[57']`[52'']`|[57'].`[56'].`[57']^|%_[4#2'#6']-^%_3'_4'#_\ -<1=A>[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[72'']`|[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[73'']`\ +<1=A,>[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[72'']`|[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[73'']`\ [57'].`[56'].`[57']^|%`_0_[56']`[57']`[52'']`|[57'].`[56'].`[57']|[4#2'#6']--5'_6'_\ [7,37]'.`[76'].`7o^|%`_0_[76']`7o`[72'']`|[7,37]'.`[76'].`7o^|%`_0_[76']`7o`[73'']`\ [57'].`[56'].`[57']^|%`_0_[56']`[57']`[52'']`|[57'].`[56'].`[57']|[4#2'#6']---^\ @@ -88,7 +89,7 @@ 0---|0---|0---|0---\ 0---|0---|0---|0---\ 0---|0---|0---|0---\ -<1=A,>7---^|%---^|%62'4'#|6'-2''-\ +<1=A,,>7---^|%---^|%62'4'#|6'-2''-\ 3'`--[24#]'^|%`-3'-^|%`2'--^|%---\ 7---^|%---^|%62'4'#|6'-2''-\ 3'`--[24#]'^|%`-3'-^|%`2'--^|%---^\