{
   "name" : "Galton Board Simulator",
   "author" : "Dindoléon",
   "description" : "https://scsynth.org/t/galton-board-sim/6202",
   "ancestor_list" : [],
   "labels" : [
      "gui"
   ],
   "is_private" : null,
   "id" : "1-5gl",
   "code" : "(\r\nvar win = Window();\r\nvar display = UserView().layout_(HLayout().margins_(30));\r\n\r\nvar availableNotes = [58, 60, 61, 63, 65, 66, 68, 70].midicps;\r\nvar timesNotesWerePlayed = Array.fill(availableNotes.size, { 0 });\r\nvar timers = Array.fill(availableNotes.size, { 0 });\r\n\r\nvar myFavoriteColor = Color(1, 0.333, 0.333);\r\nvar mySecondFavoriteColor = Color(1, 1, 1);\r\nvar blinkTime = 0.25;\r\n\r\nvar displayRatio = 0.1;\r\n\r\nvar playedNote;\r\n\r\navailableNotes.size.do({ |note, index|\r\n\tvar view = UserView();\r\n\tvar counterView = UserView().animate_(true).frameRate_(24);\r\n\tvar numberView = UserView().animate_(true);\r\n\tvar barSize = 0;\r\n\r\n\tcounterView.drawFunc_({ |view|\r\n\t\tbarSize = view.bounds.height * displayRatio * timesNotesWerePlayed[index];\r\n\t\tPen.fillColor_(\r\n\t\t\tColor(\r\n\t\t\t\tmyFavoriteColor.red +\r\n\t\t\t\t(mySecondFavoriteColor.red - myFavoriteColor.red * timers[index]),\r\n\t\t\t\tmyFavoriteColor.green +\r\n\t\t\t\t(mySecondFavoriteColor.green - myFavoriteColor.green * timers[index]),\r\n\t\t\t\tmyFavoriteColor.blue +\r\n\t\t\t\t(mySecondFavoriteColor.blue - myFavoriteColor.blue * timers[index]),\r\n\t\t\t)\r\n\t\t);\r\n\r\n\t\tPen.fillRect(\r\n\t\t\tRect(\r\n\t\t\t\t0, view.bounds.height - barSize,\r\n\t\t\t\tview.bounds.width, barSize\r\n\t\t\t)\r\n\t\t);\r\n\r\n\t\tif(timers[index] > 0)\r\n\t\t{ timers[index] = timers[index] - (blinkTime.reciprocal / view.frameRate) }\r\n\t\t{ timers[index] = 0 };\r\n\t});\r\n\r\n\tnumberView.drawFunc = { |view|\r\n\t\tPen.stringCenteredIn(\r\n\t\t\ttimesNotesWerePlayed[index].asString,\r\n\t\t\tRect(\r\n\t\t\t\t0, 0,\r\n\t\t\t\tview.bounds.width, view.bounds.height\r\n\t\t\t),\r\n\t\t\tFont.default.deepCopy.size_(view.bounds.height * 0.5),\r\n\t\t\tColor.white\r\n\t\t)\r\n\t};\r\n\r\n\tview.layout_(\r\n\t\tVLayout(\r\n\t\t\t[counterView, stretch: 6],\r\n\t\t\t[numberView, stretch: 1]\r\n\t\t).margins_(3)\r\n\t);\r\n\r\n\tdisplay.layout.add(view);\r\n});\r\n\r\nPbind(\r\n\t\\instrument, \\default,\r\n\t\\dur, 0.25,\r\n\r\n\t\\amp, 0.5,\r\n\t\\freq, Prand(availableNotes, inf),\r\n\r\n\t\\foo, Pfunc({ |event|\r\n\t\tplayedNote = availableNotes.indexOf(event.freq);\r\n\r\n\t\ttimesNotesWerePlayed[playedNote] = timesNotesWerePlayed[playedNote] + 1;\r\n\t\tif((timesNotesWerePlayed[playedNote] * displayRatio) >= 1)\r\n\t\t{ displayRatio = displayRatio / 2 };\r\n\r\n\t\ttimers[playedNote] = 1;\r\n\r\n\t\t0\r\n\t})\r\n).play;\r\n\r\ndisplay.drawFunc_({ |view|\r\n\tPen.fillColor_(myFavoriteColor);\r\n\tPen.fillRect(\r\n\t\tRect(\r\n\t\t\t0, 0,\r\n\t\t\tview.bounds.width, view.bounds.height\r\n\t\t)\r\n\t);\r\n\tPen.fillColor_(Color.black);\r\n\tPen.fillRect(\r\n\t\tRect(\r\n\t\t\t5, 5,\r\n\t\t\tview.bounds.width - 10, view.bounds.height - 10\r\n\t\t)\r\n\t);\r\n});\r\n\r\nwin.layout_(\r\n\t\tVLayout(display).margins_(0)\r\n);\r\n\r\nwin.front;\r\nCmdPeriod.doOnce({ win.close });\r\n)"
}
