用mathematica制作完整的曲子

如题所述

这个要用mathematica8.0 的。
你看程序(**)中说明,对照歌谱,把歌谱翻译成说明中定义的音符即可。

note[b_, x0_, t_, v_] :=
Module[{a = b},
Which[x0 == "1",
AppendTo[a, SoundNote[0, t, SoundVolume -> v]], x0 == "2",
AppendTo[a, SoundNote[2, t, SoundVolume -> v]], x0 == "3",
AppendTo[a, SoundNote[4, t, SoundVolume -> v]], x0 == "4",
AppendTo[a, SoundNote[5, t, SoundVolume -> v]], x0 == "5",
AppendTo[a, SoundNote[7, t, SoundVolume -> v]], x0 == "6",
AppendTo[a, SoundNote[9, t, SoundVolume -> v]], x0 == "7",
AppendTo[a, SoundNote[11, t, SoundVolume -> v]], x0 == "0",
AppendTo[a, SoundNote[None, t, SoundVolume -> v]], x0 == "-",
a[[-1, 2]] += t, x0 == "_", a[[-1, 2]] /= 2, x0 == "*",
a[[-1, 2]] *= 1.5, x0 == "t", a[[-1, 2]] /= 3, x0 == "%",
a[[-1, 2]] /= 5, x0 == ".", a[[-1, 1]] -= 12, x0 == "'",
a[[-1, 1]] += 12, x0 == "#", a[[-1, 1]] += 1, x0 == "b",
a[[-1, 1]] -= 1]; a];
noteh[b_, x0_] :=
Module[{h = b},
Which[x0 == "1", AppendTo[h, 0], x0 == "2", AppendTo[h, 2],
x0 == "3", AppendTo[h, 4], x0 == "4", AppendTo[h, 5],
x0 == "5", AppendTo[h, 7], x0 == "6", AppendTo[h, 9],
x0 == "7", AppendTo[h, 11], x0 == ".", h[[-1]] -= 12,
x0 == "'", h[[-1]] += 12, x0 == "#", h[[-1]] += 1, x0 == "b",
h[[-1]] -= 1]; h];

mf[s_, t_, x_] :=
Module[{lh = StringLength[x], xx = x, a = {}, v = 1, par = False,
h = {}, i, x0},
For[i = 1, i <= lh, i++, x0 = StringTake[xx, 1];
If[par, If[x0 == ")",
AppendTo[a, SoundNote[h, t, SoundVolume -> v]]; par = False;
h = {}, h = noteh[h, x0]],
If[x0 == "(", par = True,
v = Which[x0 == "p", 0.5, x0 == "P", 0.2, x0 == "m", 0.8,
x0 == "f", 1, True, v]; a = note[a, x0, t, v]]];
xx = StringDrop[xx, 1]];
Sound[Prepend[a, s], {0, Plus @@ (#[[2]] & /@ a)}]];
(*函数mf[s,t,x],s,t,x分别为乐器类型、时长单位(秒)、乐谱*)
m[t_, x_] := mf["Piano", t, x];
(*函数m[t,x],t,x分别为时长单位(秒)、乐谱,乐器类型默认为钢琴*)
ms[s_, x_] := mf[s, 0.5, x];
(*函数ms[s,x],s,x分别为乐器类型、乐谱,时长单位默认为0 .5秒*)
m0[x_] := m[0.5, x];
(*函数m0[x],x为乐谱,乐器类型默认为钢琴,时长单位默认为0 .5秒*)

以上定义了四个自定义函数:
函数mf[s,t,x],s,t,x分别为乐器类型、时长单位 (秒)、乐谱。
函数m[t,x],t,x分别为时长单位 (秒)、乐谱,乐器类型默认为钢琴。
函数ms[s,x],s,x分别为乐器类型、乐谱,时长单位默认为0 .5秒。
函数m0[x],x为乐谱,乐器类型默认为钢琴,时长单位默认为0 .5秒。
在Mathematica中输入以上内容,按【Shift】+【Enter】,即可利用以上函数写音乐。
乐谱格式为我在我所记得的那一点点简谱的基础上胡编乱造而成:
控制音高的符号:
1、2、3、4、5、6、7分别表示长度为一个单位的C、D、E、F、G、A、B。
.表示表示前一个音符降低八度。
'表示表示前一个音符升高八度。
b表示表示前一个音符降低半度
#表示表示前一个音符升高半度。
当一个音符后同时带上需要加上#(或b)和'(或.)时,需将#(或b)放在'(或.)前面。同一个音符后不能带多个#、b。
控制音长的符号:

-表示前一个音符长度增长一个单位。
_表示表示前一个音符长度减半。
*表示表示前一个音符长度变为原来的1.5倍。
t表示表示前一个音符长度变为原来的三分之一。
%表示表示前一个音符长度变为原来的五分之一。
控制音强的符号:

p表示此后的音强变为0.5(默认音强为1)。
P表示此后的音强变为0.2。
m表示此后的音强变为0.8。
f表示此后的音强变为1。
其他符号:
0表时长一个单位的休止符(休止符的长度可通过在0后添加控制音长的符号来控制)。
|表示小节线,只是为了阅读方便,可以不写。
(表示进入和声状态。
)表示退出和声状态。
和声的实现:用括号()将几个音符括在其中。括号内有效的字符只有1、2、3、4、5、6、7、0、b、#、'、.这些控制音高的符号。控制音长的符号-、_、*、t、%请添加在括号后面。
此外,还可以写成多个声部,然后用Sound[{ , , }]连接起来。

例子:

mf["Violin", 0.5,
"3_2#_3_|5_*4__30_4_3_2_|1_*7.__6.0_3_2#_3_|6_*5__40_2_5_4_|3-0_3_2#_
3_|5_*4__30_4_3_2_|1_*7.__6.0_6._7._1_|2_*3__40_2_7._1_|6.-0_6._7._1_|
2354_5_|3-0_6._7._1_|2365_4_|3-0_3_2#_3_|6_*5__40_2_1#_2_|5_*4__30_6._
7._1_|2437._1_|6.-"]
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-01-04

我在GitHub上做了一个Mathematica音乐播放器。需要Mathematica11.2支持。

程序有1000多行,就不放了,你直接下载网页链接即可。

主界面示意图:

播放界面示意图:

歌曲文件示意图:

语法可以参考网页链接以及网页链接

希望能对你有所帮助,也欢迎加入我们的开发小组(笑)……

第2个回答  2012-07-10
这个,你想怎么制作呢?自动生成吗?追问

是不是有个soundnote 好像有两个参数 怎么用啊 我想自己编码 可是怎么对照着歌谱编代码呢

相似回答