Beatbox
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
WHAT IS IT?
This is a drum machine made with NetLogo. It uses the sound extension. You can make your own beats with it. Beats can be saved to disk and then loaded back in later.
HOW IT WORKS
Colored squares represent drum hits. The world is a "map" of the composition in which time moves from left to right. Each row of patches is a particular drum, and each column represents a moment in time.
HOW TO USE IT
To make a beat, first press the GO button to start the drum machine running. Then click the mouse in the view to add and remove drum hits.
You can adjust the speed of the music with the BPM (beats per minute) slider, and the volume using the VELOCITY slider. You can think of velocity as how fast the drumstick hits the drum. A faster hit makes a louder sound. The term "velocity" is standard in MIDI. (MIDI is the underlying music technology that NetLogo's sound extension uses.)
To silence an individual drum, click the white square to the left of the drum's name. To bring it back, click the same square again. This lets you experiment with the effect of adding or removing different drums from your beat.
NETLOGO FEATURES
For more information on the sound extension, and on extensions in general, see the "Sound" and "Extensions" sections of the NetLogo User Manual.
RELATED MODELS
Composer
Comments and Questions
;; this model uses the following command and reporters that ;; are part of the sound extension: ;; drums -- reports a list of the names of all available MIDI drums ;; play-drum -- hits a drum ;; and that's it! see the "Sound" section of the NetLogo User Manual ;; for more details on the sound extension. extensions [ sound ] ;; this is used to detect separate mouse clicks. once the mouse button is ;; pressed, we want that to be considered as only a single click until the ;; button is released again. globals [mouse-released?] ;; the "drummers" are the little white circles that move across the graphics ;; window. the "notes" are the colored squares. when a drummer passes ;; over a note, the drummer plays its drum. breed [ drummers drummer ] breed [ notes note ] ;; "instrument" is the name of a drummer's drum drummers-own [instrument] to setup clear-all set mouse-released? true set-default-shape drummers "circle" set-default-shape notes "square" ;; make the grid lines to help the user see the structure of the beat ask patches [ set plabel-color gray + 1 ] ask patches with [pycor mod 2 = 0 and pxcor != min-pxcor ] [ set pcolor gray - 4.8 ] turn-all-drums-on create-drummers world-height - 1 [ set color white set shape "circle" set size 0.2 set xcor -1 * max-pxcor set heading 90 ;; "who" is the turtle's id number. id numbers are assigned ;; starting from zero. each turtle has a different number, so ;; each turtle occupies a different row and gets a different drum. set ycor max-pycor - who - 1 set instrument item who sound:drums ask patch-ahead 8 [ set plabel [instrument] of myself ] ] label-beats reset-ticks end ;; this puts text in the top row and draws gray columns; ;; this is to help the user place drum hits to label-beats let text ["1" "e" "+" "a" "2" "e" "+" "a" "3" "e" "+" "a" "4" "e" "+" "a"] ;; this gets a bit tricky. basically we're stepping ;; through the string a character at a time, placing ;; one character on every other patch along the top edge. ;; when we hit a number, we turn that whole column ;; dark gray. let n 0 foreach text [ let x (-1 * max-pxcor + n + 1) ;; "?" is used inside foreach to refer to the ;; current item of the list we're looping through ask patch x max-pycor [ set plabel ? ] if member? ? ["1" "2" "3" "4"] [ ask patches with [pxcor = x] ;; subtracting from a color makes it darker [ set pcolor gray - 4.8 ] ] set n n + 2 ] end to turn-all-drums-on ask patches with [pxcor = min-pxcor and pycor != max-pycor] [ set pcolor white ] end to turn-all-drums-off ask patches with [pxcor = min-pxcor] [ set pcolor black ] end to go ;; there are eight patches per "beat" (four beats to a measure) ;; and sixty seconds in a minute, hence the 7.5 here ;; (because 60 divided by 8 is 7.5) every 7.5 / bpm [ ask drummers [ ;; check the white square on the left to see if this drum ;; is "on" or not. if it is, and if we're over a note, ;; then hit our drum if ([pcolor] of patch min-pxcor pycor = white) and (any? notes-here) [ sound:play-drum instrument velocity ] fd 1 ;; when we wrap around the right edge of the world, we ;; need to move an extra square in order to skip the first column if xcor = -1 * max-pxcor [ fd 1 ] ] tick ] ;; the edit procedure handles mouse clicks edit end to edit if not mouse-down? [ set mouse-released? true ] if mouse-released? and mouse-down? [ ask patch mouse-xcor mouse-ycor [ toggle ] set mouse-released? false ] end ;; if the user clicks on a note, remove it. ;; if the user clicks where there is no note, make one. ;; if the user clicks on the left column, turn ;; the patch white or black to indicate whether that drum ;; is on or off. to toggle ;; patch procedure if pycor != max-pycor [ ifelse pxcor = min-pxcor [ set pcolor ifelse-value (pcolor = black) [white] [black] ] [ ifelse any? notes-here [ ask notes-here [ die ] ] [ sprout-notes 1 ] ] ] end ;; return to the beginning of the measure (the left ;; side of the view) to rewind ask drummers [ set xcor -1 * max-pxcor ] reset-ticks end to load-file ;; we don't want the value the user chose for "file" to change when ;; the user hits the "load-file" button. "file" is a global variable, ;; and "import-world" wipes out the values of all global variables, ;; so we need to store the old value temporarily in a local variable, ;; in order to restore it once "import-world" is done. let old-value-of-file file import-world file set file old-value-of-file rewind end ;; we could just tell the user to choose "Export World" on the File ;; menu, but it seems a bit friendlier to provide this in a button to save-file export-world user-new-file end ; Public Domain: ; To the extent possible under law, Uri Wilensky has waived all ; copyright and related or neighboring rights to this model.
There are 10 versions of this model.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
Beatbox.png | preview | Preview for 'Beatbox' | over 12 years ago, by Uri Wilensky | Download |
This model does not have any ancestors.
This model does not have any descendants.