Ocaml:如何将音符转换为音乐和弦
我想从一个音符和一个ocaml列表中创建一个和弦 结构:Ocaml:如何将音符转换为音乐和弦,ocaml,music-notation,Ocaml,Music Notation,我想从一个音符和一个ocaml列表中创建一个和弦 结构: type objet_musical = | Note of (int * int * int) | Silence of int | Sequence of objet_musical list | Parallel of objet_musical list 名单呢 let transposition = [(0,4,7);(0,3,7);(0,4,8);(0,3,6)];; 非常感谢你的回答。 玛
type objet_musical =
| Note of (int * int * int)
| Silence of int
| Sequence of objet_musical list
| Parallel of objet_musical list
名单呢
let transposition = [(0,4,7);(0,3,7);(0,4,8);(0,3,6)];;
非常感谢你的回答。
玛丽大问题应该一小步解决。首先,让我们创建一个函数
transpose_objet
,该函数将接受一个具有单个转置的对象,即移位,并返回一个新对象,该对象按指定移位在俯仰中进行转置
(** [transpose_objet obj shift] takes a musical object [obj] and
transposes it pitch to a value [shift] *)
let rec transpose_objet obj shift : objet_musical = match obj with
| Note (h,v,d) -> Note (h + shift, v, d)
| Silence t -> Silence t
| Sequence objs ->
Sequence (List.map (fun obj -> transpose_objet obj shift) objs)
| Parallel objs ->
Parallel (List.map (fun obj -> transpose_objet obj shift) objs)
接下来,让我们尝试创建一个由三个换位组成的和弦。所以我们拿一个三连音和一个物体,平行播放(我想这就是和弦的意思)。我们将此函数命名为chord\u of_transposition
(** [chord_of_transposition obj tlist] takes a musical [obj] and a triplet,
where every element of triplet is a number to which the pitch
should be transposed, and creates a chord *)
let chord_of_transposition obj (t1,t2,t3) : objet_musical =
Parallel [transpose_objet obj t1;
transpose_objet obj t2;
transpose_objet obj t3]
有了这些方便的函数,我们可以处理一系列的组合三元组。让我们编写一个函数chords\u of_transpositions
,因此我们希望获取一个音乐对象和一系列转置,并从每个转置中创建一个和弦。我们希望它仍然是一个音乐对象,所以我们使用构造函数序列从结果列表中创建一个对象
(** [chords_of_transpositions obj transpositions] takes a list of
triplets, where each element of triplet is value by which a
musical object should be shifted and creates a sequence of musical
objects that will play a chords from each transposition. *)
let chords_of_transpositions obj ts : objet_musical =
Sequence (List.map (chord_of_transposition obj) ts)
作为练习,我建议您重写函数chord\u的构图
,不要有难看的重复(提示,使用List.map
)
作为第二个练习,尝试从transpose\u objet
函数中删除代码重复。您是否注意到,Parallel
和Sequence
子句的模式是相同的
作为第三个练习,请尝试重写代码,以便换位列表不是由三元组组成,而是由n-plet组成,如下所示:
let transposition = [[0;4;7];[0;3;7]; [0;8]; []; [0;3;6]]
let chordify om tp : objet_musical =
Sequence (List.map (chord_of_transposition om) tp)
其中空列表代表沉默
新问题的答案
问题:
我试试这个
let seq1= Sequence((Note(60,100,1000)):: (Note (64,100,500)):: (Note (62,100,500)):: (Silence(1000)):: (Note (67,100,1000)):: [])
及
你的建议呢
let chordify om tp : objet_musical= Sequence (List.map (chordify om)tp);;
测试呢
let test=chordify seq1转置
但顶级奥卡姆回归了
Error: This expression has type (int * int * int) list but an expression was expected of type int list list Type int * int * int is not compatible with type int list .
如何解决
答复
首先,我想指出的是,我们正开始大力推进这一进程。这是一个问答网站,不是论坛。我已经为你做了一些工作,但我看不出你在努力做好自己的一份工作。我来这里不是为了做你们的家庭作业,而是为了帮助你们解答有关OCaml和编程的一般问题。我的建议是从一本关于OCaml的好教科书开始,先学习它。只是尝试随机复制粘贴代码,直到编译不是一个好主意。现在,回到你的问题上来
首先,您可以使用一种更方便的表示法,而不是像1::2::3::[]
这样简单地构建列表:[1;2;3]
。因此,您的序列可以按以下方式重写:
let seq1 = Sequence [
Note (60,100,1000);
Note (64,100,500);
Note (62,100,500);
Silence (1000);
Note (67,100,1000)
]
接下来是函数
let chordify om tp : objet_musical =
Sequence (List.map (chordify om) tp)
指一些未绑定的符号chordify
。如果要在函数本身的主体内调用函数,则需要使其递归,即将rec
添加到let
表达式中:
let rec chordify om tp : objet_musical =
Sequence (List.map (chordify om) tp)
我认为,您已经两次意外地将此函数推到了OCaml顶级,因此有效地实现了以下定义
let chordify om tp : objet_musical =
Sequence (List.map (chordify om) tp)
let chordify om tp : objet_musical =
Sequence (List.map (chordify om) tp)
但是,你真正想做的是,不要调用函数cordify
,而是调用函数chord\u of_transposition
,该函数将根据一个特定的转置实例转换一个objet\u music
,如下所示:
let transposition = [[0;4;7];[0;3;7]; [0;8]; []; [0;3;6]]
let chordify om tp : objet_musical =
Sequence (List.map (chord_of_transposition om) tp)
因此,我们得出了一个定义,相当于我之前提供的换位和弦的定义。我必须将objet\u music与换位列表相关联。我必须将objet\u music与换位列表相关联。例如,如果note do=60,note*list=>和弦(60,64,67),那么现在我有两个问题:(1)note构造函数中的三元组(int*int*
int)是什么?它是否以某种方式与音高、八度、持续时间或音量相对应?(2) 换位表中的三胞胎是什么意思?您是否需要将每个object\u music
以三种不同的换位方式进行换位?三元组表示(高度、音量、持续时间)。是的,我想把列表中的每一个物体调换。高度是音高吗?我不明白第二部分:你有一个列表,里面有一个三元组,每个三元组代表一个单独的音高转换?你想以某种方式将一个应用到另一个,这样每个objet\u music
都将是三倍的?