Beatbox

Beatbox preview image

1 collaborator

Uri_dolphin3 Uri Wilensky (Author)

Tags

(This model has yet to be categorized with any tags)
Model group CCL | Visible to everyone | Changeable by group members (CCL)
Model was written in NetLogo 5.0.4 • Viewed 598 times • Downloaded 137 times • Run 1 time
Download the 'Beatbox' modelDownload this modelEmbed this model

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

Click to Run Model

;; 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.

Uploaded by When Description Download
Uri Wilensky over 12 years ago Updated to NetLogo 5.0.4 Download this version
Uri Wilensky almost 13 years ago Updated version tag Download this version
Uri Wilensky over 13 years ago Updated to NetLogo 5.0 Download this version
Uri Wilensky about 15 years ago Updated from NetLogo 4.1 Download this version
Uri Wilensky about 15 years ago Updated from NetLogo 4.1 Download this version
Uri Wilensky about 15 years ago Updated from NetLogo 4.1 Download this version
Uri Wilensky about 15 years ago Updated from NetLogo 4.1 Download this version
Uri Wilensky about 15 years ago Model from NetLogo distribution Download this version
Uri Wilensky about 15 years ago Beatbox Download this version
Uri Wilensky about 15 years ago Beatbox Download this version

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.