0

我正在使用 Ruby on Rails 构建一个 Web 应用程序,并且我的数据模型有用户,并且每个用户都可以创建键(音乐键,例如 A# 小调)。

键由和弦组成,和弦由音符组成。音符的数量是有限的,但和弦和键的数量是无限的(因为每个用户都可以创建自己的,允许重复)。

我目前的工作假设键、和弦和音符都将是数据库中的一个表(如果这听起来不对,请阻止我),并且我正在尝试确定它们中的每一个是否应该属于它上面的级别。

我希望能够选择一个键并查看其中的所有和弦,然后选择一个和弦并查看它所在的所有键(和弦/音符相同)。此外,我希望能够查看彼此独立的用户、键、和弦和音符的列表(索引)。这是否有助于使用 belongs_to :through 关联?

如果还不清楚,我是 RoR 初学者,所以任何指导/建议将不胜感激。提前致谢。

4

3 回答 3

1

我没有什么可以添加到早期的答案 Ruby 明智的。这更像是对您的问题的音乐理论评论,而不是对编程问题的回答。我一直在走你的路,学到了一些可能会影响你的设计选择的东西。对于如何将一组音符与琴键联系起来没有很好的答案,因为一系列音符的和弦含义是模棱两可的。相同的音符序列可以具有不同的线名称(和含义),具体取决于作曲家的使用方式或意图。更复杂的和弦问题会变得更糟。您可以轻松地从键到和弦再到音符,但如果不选择作曲家的大脑,就无法保证向后退。问题来自基本的音乐二分法,其中音符可以根据它们的谐波关系来定义(一个完美的五度有 3:2 比率)或它们在回火半音阶中的位置。(在钢琴上演奏的调律纯五度是 700 美分或大约 1.498 的比率。)调律音阶是必要的妥协,但是当你用它来表示乐曲时,重要的音乐理论信息就会丢失。对于回火音阶中的所有音程,可以有许多类似的完美调音的音程。例如,由这些比率定义的音程:3:2、40:27 和 243:160 都足够接近,可以转换为相同的调音音符,但要知道和弦是什么,您需要知道预期的比率。因为一旦你选择一个实际的音符,回火音符是一个近似值,你需要从音符到和弦的比率信息就会丢失。它是在作曲意义上定义和弦的比率。(在钢琴上演奏的调律纯五度是 700 美分或大约 1.498 的比率。)调律音阶是必要的妥协,但是当你用它来表示乐曲时,重要的音乐理论信息就会丢失。对于回火音阶中的所有音程,可以有许多类似的完美调音的音程。例如,由这些比率定义的音程:3:2、40:27 和 243:160 都足够接近,可以转换为相同的调音音符,但要知道和弦是什么,您需要知道预期的比率。因为一旦你选择一个实际的音符,回火音符是一个近似值,你需要从音符到和弦的比率信息就会丢失。它是在作曲意义上定义和弦的比率。(在钢琴上演奏的调律纯五度是 700 美分或大约 1.498 的比率。)调律音阶是必要的妥协,但是当你用它来表示乐曲时,重要的音乐理论信息就会丢失。对于回火音阶中的所有音程,可以有许多类似的完美调音的音程。例如,由这些比率定义的音程:3:2、40:27 和 243:160 都足够接近,可以转换为相同的调音音符,但要知道和弦是什么,您需要知道预期的比率。因为一旦你选择一个实际的音符,回火音符是一个近似值,你需要从音符到和弦的比率信息就会丢失。它是在作曲意义上定义和弦的比率。) 缓和音阶是必要的妥协,但是当您使用它来表示乐曲时,重要的音乐理论信息就会丢失。对于回火音阶中的所有音程,可以有许多类似的完美调音的音程。例如,由这些比率定义的音程:3:2、40:27 和 243:160 都足够接近,可以转换为相同的调音音符,但要知道和弦是什么,您需要知道预期的比率。因为一旦你选择一个实际的音符,回火音符是一个近似值,你需要从音符到和弦的比率信息就会丢失。它是在作曲意义上定义和弦的比率。) 缓和音阶是必要的妥协,但是当您使用它来表示乐曲时,重要的音乐理论信息就会丢失。对于回火音阶中的所有音程,可以有许多类似的完美调音的音程。例如,由这些比率定义的音程:3:2、40:27 和 243:160 都足够接近,可以转换为相同的调音音符,但要知道和弦是什么,您需要知道预期的比率。因为一旦你选择一个实际的音符,回火音符是一个近似值,你需要从音符到和弦的比率信息就会丢失。它是在作曲意义上定义和弦的比率。例如,由这些比率定义的音程:3:2、40:27 和 243:160 都足够接近,可以转换为相同的调音音符,但要知道和弦是什么,您需要知道预期的比率。因为一旦你选择一个实际的音符,回火音符是一个近似值,你需要从音符到和弦的比率信息就会丢失。它是在作曲意义上定义和弦的比率。例如,由这些比率定义的音程:3:2、40:27 和 243:160 都足够接近,可以转换为相同的调音音符,但要知道和弦是什么,您需要知道预期的比率。因为一旦你选择一个实际的音符,回火音符是一个近似值,你需要从音符到和弦的比率信息就会丢失。它是在作曲意义上定义和弦的比率。

这并不意味着至少对于更简单的和弦来说这是一项不可能完成的任务。对于三和弦,即使有倒位,通常也只有一个有用的选择,但是一旦添加了第七个,它就会变得混乱。你必须做出选择。将有一个最有可能的选择,它可能已经足够好了。我决定选择最和谐的和弦(大约是音程比中整数最小的和弦。)这意味着你不能 100% 可靠地尝试从组成它们的音符中推断出与关键相关的和弦名称。对于普通的爵士乐作品(爵士乐喜欢复杂的和弦),它几乎变成了一个绝望的案例。

如果您只是将数据用于带有回音调音的乐器的性能,它可能没有任何区别。在缓和音阶中,所有这些和弦听起来都是一样的。如果您尝试为 A Capella 调音(人声是无限可调的,并且趋向于完美调音)或试图理解作曲家的音乐意图,您会遇到麻烦。

于 2013-11-02T22:56:15.153 回答
1

has_many在存在一对多关系和has_many :through存在多对多关系时使用关系。例如,在您的描述中,您说和弦是由许多音符组成的,所以是和弦has_many音符。一个音符只有一个和弦还是have_many和弦?如果音符只有一个和弦,则has_many/belongs_to关系是合适的。

我刚刚做了一个维基百科搜索,发现 C 大调和弦由音符 C、E 和 G 组成。如果一个和弦has_many音符和一个音符belongs_to一个和弦,那么chord_id将存储在音符表中,一个音符不能have_many和弦。我假设一个音符has_many和弦,所以一个many_to_many关系可能更合适。

我创建了一个关于您可能会发现有用的关系的代码测验。many_to_many

于 2013-08-07T02:09:47.253 回答
0

接受答案提出我的权力。我不同意在many-to-many您的申请中建立关系。它的BAD数据库设计方法就是采取这种方式。我相信如果你有某种many-to-many关系,你会想要一个解析表来存储复合键chord_idnote_id这个表打破了多对多关系并解决了这种形式的基数,你可能会继续这里。因此,您可以有效地通过ChordNote 获得一个 Chord has_many notes ,然后在您的 Note 表中,您将通过ChordNote 获得一个 Note has_many chords 。你会注意到关键字through以下链接准确地解释了这种关系的建立有什么Has-Many-Through。我捍卫模型关联 Chord has_many Notes 和 Note has_many Chords 是正确的,因为这个 SO 问题为我的推理Why No Many To Many Relationships辩护。我只是不明白您为什么要使用多对多关联来设置应用程序。

因此,在说所有这些时,您的设置将是(如果您有一个多对多

class Chord < ActiveRecord::Base 
   Chord has_many :notes, :through ChordNote
end

和弦音符

class ChordNote < ActiveRecord::Base 
  belongs_to :chords
  belongs_to :notes
end

笔记

class Note < ActiveRecord::Base
  has_many :chords, :through => :ChordNote
end 
于 2013-08-07T03:18:12.093 回答