它是什么?
这个模型使用遗传算法生成鼓节奏。利用西非鼓乐团的节奏“规则”,低音鼓、中音鼓和高音鼓的模式与进化共同创造出激动人心的节拍。这是该模型的“二拍”版本,每个染色体有4个“拍”。
在许多西非国家,音乐是文化的重要组成部分。在塞内加尔,鼓和打击乐器既是表演的焦点,也是仪式上的特色。西非鼓乐团的演出是场面宏大的活动,服装色彩鲜艳,鼓的形状和大小各异,音乐色彩丰富而富有韵律。这些表演是丰富、交叉和多韵律发展的舞台,因为许多“歌曲”只是即兴的框架。在塞内加尔,典型的乐团由三种不同的鼓组成:低音鼓称为dundun,中音鼓称为sabar,高音鼓称为djembe。在表演中,鼓手们倾听并与其他表演者融合,以创造出观众听到的丰富声音。节奏不断地根据独奏、集群和“强弱拍感”进行演变。该模型展示了一种尝试以西非鼓乐风格自动生成愉悦鼓节奏的方式。尽管大多数自动生成音乐的尝试都依赖于人类选择他们喜欢的节奏,但该模型尝试生成节奏,而不是明确询问人类是否喜欢特定的节奏。
遗传算法是计算机科学中用于解决优化和搜索问题的工具。它依赖于生物启发技术,以便在参数空间中“搜索”“最优解”。关键在于使用染色体等“遗传物质”代表给定问题。然后,算法使用选择、交叉和突变等技术来“进化”解决方案。
代码
extensions [ sound ]
globals [
chromosomes ; list of all possible chromosomes
random-who-list ; keeps a shuffled list for pretty-ness
generations ; number of generations we've seen
]
turtles-own [
my-chromosomes ; list to hold the chromosomes of a drummer
my-velocity ; the (int) velocity value of a drummer
my-instrument ; the (string) instrument for that turtle
mutation-rate ; variable to control "reproduction"
hits ; counts the number of drum hits for a turtle across its lifespan
hits-since-evolve ; the number of hits since a mutation or evolution
]
breed [ low-drums low-drummer ]
breed [ med-drums med-drummer ]
breed [ high-drums high-drummer ]
to setup
clear-all
; Make the view big enough to show 16 rows (each a drummer) and however many 'beats'
resize-world 0 ((num-chromosomes * 4) - 1) 0 15
set-globals
set-initial-turtle-variables
reset-ticks
update-view
end
; Procedure to play a pattern with evolution
to go
ask turtles [ play ]
; If we've reached the end of a pattern, do some evolution!
if (ticks mod (num-chromosomes * 4) = 0) and (ticks != 0) [
set generations generations + 1
go-evolve
]
update-view
tick
wait 60 / tempo-bpm / 4 ; This roughly sets tempo
end
; Procedure to play a pattern without any evolution
to go-no-evolve
ask turtles [ play ]
update-view
tick
wait 60 / tempo-bpm / 4
end
extensions [ sound ]
:导入了一个声音扩展,用于播放声音。globals
:定义了全局变量,包括染色体、随机who列表和代数等。turtles-own
:定义了海龟自己的变量,包括染色体、速度、乐器、变异率、击打次数和上次进化以来的击打次数等。breed [ low-drums low-drummer ]
、breed [ med-drums med-drummer ]
、breed [ high-drums high-drummer ]
:定义了三种不同类型的鼓手和鼓。to setup
:设置了模型的初始状态,包括清除所有元素、调整视图大小、设置全局变量、设置海龟的初始变量等。to go
:定义了在模拟中每个“步骤”要执行的操作,包括让海龟们演奏、检查是否需要进行进化等。to go-no-evolve
:定义了在模拟中每个“步骤”要执行的操作,不包括进化过程。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PLAY FUNCTIONS ;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to play-my-drum ; turtle procedure
let temp my-velocity
if sound? [
if solo? [ ; If you're a soloer, play out! Otherwise, be quiet!
ifelse who = soloer [
set temp my-velocity + 50
][
set temp my-velocity - 50
]
]
sound:play-drum my-instrument temp
]
end
to play ; turtle procedure
if item (ticks mod (num-chromosomes * 4)) my-pattern = 1 [
play-my-drum
set hits hits + 1
set hits-since-evolve hits-since-evolve + 1
]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; END PLAY FUNCTIONS ;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
这部分代码包含了与演奏相关的函数。
首先是to play-my-drum
过程,这是一个海龟过程,用于播放鼓声。它首先将当前速度存储在临时变量temp
中,然后检查是否允许播放声音。如果允许,它会根据海龟是否独奏以及海龟的身份来调整速度,并最终使用sound:play-drum
函数播放鼓声。
接下来是to play
过程,同样是一个海龟过程,用于播放音乐。它首先检查当前时间是否需要播放鼓声,并在需要时调用play-my-drum
过程来播放鼓声。然后它会增加击打次数和自进化以来的击打次数。
这些过程构成了模型中海龟演奏行为的定义。