鼓节奏模型与代码(二)

它是什么?

这个模型使用遗传算法生成鼓节奏。利用西非鼓乐团的节奏“规则”,低音鼓、中音鼓和高音鼓的模式与进化共同创造出激动人心的节拍。这是该模型的“二拍”版本,每个染色体有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过程来播放鼓声。然后它会增加击打次数和自进化以来的击打次数。

这些过程构成了模型中海龟演奏行为的定义。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

异数时空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值