Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml:如何将音符转换为音乐和弦_Ocaml_Music Notation - Fatal编程技术网

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)];; 非常感谢你的回答。 玛

我想从一个音符和一个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)];;
非常感谢你的回答。
玛丽

大问题应该一小步解决。首先,让我们创建一个函数
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
都将是三倍的?