Browse Source

new samples, load refavtor, used samples

Johann Woelper 4 years ago
parent
commit
90006d3585
38 changed files with 633 additions and 409 deletions
  1. BIN
      media/cc0/8bit/blip1.wav
  2. BIN
      media/cc0/8bit/blip2.wav
  3. BIN
      media/cc0/8bit/boing1.wav
  4. BIN
      media/cc0/8bit/pongblip1.wav
  5. 0 0
      media/cc0/bass/bass_g_reese.wav
  6. BIN
      media/cc0/basslines/electronic/deep-wobble-140bpm-c.wav
  7. BIN
      media/cc0/basslines/electronic/electro-bassline-140-e.wav
  8. BIN
      media/cc0/basslines/electronic/wobble-sequence-140-f.wav
  9. BIN
      media/cc0/basslines/house/112bpm-catchy-reverb-synth-loop.wav
  10. BIN
      media/cc0/basslines/neuro/airy-reese-f.wav
  11. BIN
      media/cc0/basslines/neuro/dark-reese-f.wav
  12. BIN
      media/cc0/basslines/neuro/growly-f.wav
  13. BIN
      media/cc0/basslines/neuro/iljah__174-nocturnal.wav
  14. BIN
      media/cc0/basslines/neuro/kival__reese-413th.wav
  15. BIN
      media/cc0/basslines/neuro/koany-reese-f.wav
  16. BIN
      media/cc0/basslines/reggae/16445__kkz__redub.wav
  17. 0 0
      media/cc0/kick/kick_dnb.wav
  18. 0 0
      media/cc0/kick/kick_dubstep.wav
  19. 0 0
      media/cc0/kick/kick_edm.wav
  20. 0 0
      media/cc0/kick/kick_hardstyle.wav
  21. 0 0
      media/cc0/kick/kick_insane.wav
  22. 0 0
      media/cc0/kick/kick_low.wav
  23. 0 0
      media/cc0/kick/kick_rough.wav
  24. 0 0
      media/cc0/kick/kick_sub.wav
  25. 0 0
      media/cc0/kick/kick_synth.wav
  26. BIN
      media/cc0/synth/trap/bpm100-d-trap-synth.mp3
  27. BIN
      media/cc0/voice/choir-of-voices-single-chord.wav
  28. 46 31
      patterns/amen.pat
  29. 120 55
      patterns/berlin.pat
  30. 56 41
      patterns/cold sweat.pat
  31. 88 62
      patterns/funky drummer.pat
  32. 37 23
      patterns/impeach the president.pat
  33. 76 50
      patterns/it's a new day.pat
  34. 84 58
      patterns/walk this way.pat
  35. 45 30
      patterns/when the levee breaks.pat
  36. 0 21
      patterns/yjhfghj.pat
  37. 61 32
      src/base.rs
  38. 20 6
      src/main.rs

BIN
media/cc0/8bit/blip1.wav


BIN
media/cc0/8bit/blip2.wav


BIN
media/cc0/8bit/boing1.wav


BIN
media/cc0/8bit/pongblip1.wav


+ 0 - 0
media/cc0/bass/bass_g_reese.wav


BIN
media/cc0/basslines/electronic/deep-wobble-140bpm-c.wav


BIN
media/cc0/basslines/electronic/electro-bassline-140-e.wav


BIN
media/cc0/basslines/electronic/wobble-sequence-140-f.wav


BIN
media/cc0/basslines/house/112bpm-catchy-reverb-synth-loop.wav


BIN
media/cc0/basslines/neuro/airy-reese-f.wav


BIN
media/cc0/basslines/neuro/dark-reese-f.wav


BIN
media/cc0/basslines/neuro/growly-f.wav


BIN
media/cc0/basslines/neuro/iljah__174-nocturnal.wav


BIN
media/cc0/basslines/neuro/kival__reese-413th.wav


BIN
media/cc0/basslines/neuro/koany-reese-f.wav


BIN
media/cc0/basslines/reggae/16445__kkz__redub.wav


media/cc0/kick_dnb.wav → media/cc0/kick/kick_dnb.wav


media/cc0/kick_dubstep.wav → media/cc0/kick/kick_dubstep.wav


media/cc0/kick_edm.wav → media/cc0/kick/kick_edm.wav


media/cc0/kick_hardstyle.wav → media/cc0/kick/kick_hardstyle.wav


media/cc0/kick_insane.wav → media/cc0/kick/kick_insane.wav


media/cc0/kick_low.wav → media/cc0/kick/kick_low.wav


media/cc0/kick_rough.wav → media/cc0/kick/kick_rough.wav


media/cc0/kick_sub.wav → media/cc0/kick/kick_sub.wav


media/cc0/kick_synth.wav → media/cc0/kick/kick_synth.wav


BIN
media/cc0/synth/trap/bpm100-d-trap-synth.mp3


BIN
media/cc0/voice/choir-of-voices-single-chord.wav


+ 46 - 31
patterns/amen.pat

@@ -5,7 +5,7 @@
   "xsize": 64,
   "xsize": 64,
   "ysize": 4,
   "ysize": 4,
   "sounds": {
   "sounds": {
-    "2,2": {
+    "12,2": {
       "name": "ride_bell2.wav",
       "name": "ride_bell2.wav",
       "location": "media/cc0/ride_bell.wav",
       "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -13,9 +13,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "6,2": {
+    "14,2": {
       "name": "ride_bell2.wav",
       "name": "ride_bell2.wav",
       "location": "media/cc0/ride_bell.wav",
       "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -23,16 +24,7 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
-      "reverse": false
-    },
-    "12,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
-      "volume": 1.0,
-      "roll": 0,
-      "rollrate": 0,
-      "trim": 0,
-      "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "7,1": {
     "7,1": {
@@ -43,6 +35,7 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "10,2": {
     "10,2": {
@@ -53,29 +46,32 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,2": {
-      "name": "ride_bell2.wav",
-      "location": "media/cc0/ride_bell.wav",
+    "15,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,0": {
+    "10,0": {
       "name": "kick_rough.wav",
       "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,1": {
+    "12,1": {
       "name": "snare_jungle.wav",
       "name": "snare_jungle.wav",
       "location": "media/cc0/snare/snare_jungle.wav",
       "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -83,39 +79,43 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "15,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "4,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "0,0": {
     "0,0": {
       "name": "kick_rough.wav",
       "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,0": {
-      "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "0,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,2": {
+    "8,2": {
       "name": "ride_bell2.wav",
       "name": "ride_bell2.wav",
       "location": "media/cc0/ride_bell.wav",
       "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -123,19 +123,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "14,2": {
-      "name": "ride_bell2.wav",
-      "location": "media/cc0/ride_bell.wav",
+    "8,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,2": {
+    "6,2": {
       "name": "ride_bell2.wav",
       "name": "ride_bell2.wav",
       "location": "media/cc0/ride_bell.wav",
       "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -143,9 +145,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,2": {
+    "2,2": {
       "name": "ride_bell2.wav",
       "name": "ride_bell2.wav",
       "location": "media/cc0/ride_bell.wav",
       "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -153,6 +156,18 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
+      "reverse": false
+    },
+    "4,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     }
     }
   }
   }

+ 120 - 55
patterns/berlin.pat

@@ -5,17 +5,18 @@
   "xsize": 16,
   "xsize": 16,
   "ysize": 6,
   "ysize": 6,
   "sounds": {
   "sounds": {
-    "0,1": {
+    "10,1": {
       "name": "kick_low.wav",
       "name": "kick_low.wav",
-      "location": "media/cc0/kick_low.wav",
+      "location": "media/cc0/kick/kick_low.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "11,3": {
+    "9,3": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_closed.wav",
       "location": "media/cc0/hihiat_closed.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -23,49 +24,43 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "6,2": {
-      "name": "snare_sharp.wav",
-      "location": "media/cc0/snare/snare_sharp.wav",
-      "volume": 1.0,
-      "roll": 0,
-      "rollrate": 0,
-      "trim": 0,
-      "speed": 1.0,
-      "reverse": false
-    },
-    "2,1": {
-      "name": "kick_low.wav",
-      "location": "media/cc0/kick_low.wav",
+    "1,3": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_closed.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "14,2": {
-      "name": "snare_sharp.wav",
-      "location": "media/cc0/snare/snare_sharp.wav",
+    "3,3": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_closed.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,2": {
-      "name": "snare_sharp.wav",
-      "location": "media/cc0/snare/snare_sharp.wav",
+    "4,1": {
+      "name": "kick_low.wav",
+      "location": "media/cc0/kick/kick_low.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "7,3": {
+    "15,3": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_closed.wav",
       "location": "media/cc0/hihiat_closed.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -73,9 +68,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "9,3": {
+    "13,3": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_closed.wav",
       "location": "media/cc0/hihiat_closed.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -83,39 +79,43 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,1": {
+    "14,1": {
       "name": "kick_low.wav",
       "name": "kick_low.wav",
-      "location": "media/cc0/kick_low.wav",
+      "location": "media/cc0/kick/kick_low.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,1": {
-      "name": "kick_low.wav",
-      "location": "media/cc0/kick_low.wav",
+    "9,4": {
+      "name": "bass_1.wav",
+      "location": "media/cc0/bass/bass_1.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
-      "rollrate": 0,
+      "rollrate": 16,
       "trim": 0,
       "trim": 0,
-      "speed": 1.0,
+      "speed": 0.83,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "14,1": {
+    "2,1": {
       "name": "kick_low.wav",
       "name": "kick_low.wav",
-      "location": "media/cc0/kick_low.wav",
+      "location": "media/cc0/kick/kick_low.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "5,3": {
+    "11,3": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_closed.wav",
       "location": "media/cc0/hihiat_closed.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -123,29 +123,54 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "15,3": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_closed.wav",
+    "11,4": {
+      "name": "bass_1.wav",
+      "location": "media/cc0/bass/bass_1.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 16,
+      "trim": 0,
+      "speed": 0.83,
+      "category": "",
+      "reverse": false
+    },
+    "2,2": {
+      "name": "snare_sharp.wav",
+      "location": "media/cc0/snare/snare_sharp.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "3,3": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_closed.wav",
+    "8,4": {
+      "name": "bass_1.wav",
+      "location": "media/cc0/bass/bass_1.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 16,
+      "trim": 0,
+      "speed": 0.83,
+      "category": "",
+      "reverse": false
+    },
+    "12,1": {
+      "name": "kick_low.wav",
+      "location": "media/cc0/kick/kick_low.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "1,3": {
+    "5,3": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_closed.wav",
       "location": "media/cc0/hihiat_closed.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -153,59 +178,65 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,4": {
-      "name": "bass_303.wav",
-      "location": "media/cc0/bass/bass_303.wav",
+    "7,3": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_closed.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
-      "speed": 0.960125,
+      "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "6,1": {
     "6,1": {
       "name": "kick_low.wav",
       "name": "kick_low.wav",
-      "location": "media/cc0/kick_low.wav",
+      "location": "media/cc0/kick/kick_low.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,1": {
+    "0,1": {
       "name": "kick_low.wav",
       "name": "kick_low.wav",
-      "location": "media/cc0/kick_low.wav",
+      "location": "media/cc0/kick/kick_low.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,1": {
-      "name": "kick_low.wav",
-      "location": "media/cc0/kick_low.wav",
+    "14,2": {
+      "name": "snare_sharp.wav",
+      "location": "media/cc0/snare/snare_sharp.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "13,3": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_closed.wav",
+    "10,2": {
+      "name": "snare_sharp.wav",
+      "location": "media/cc0/snare/snare_sharp.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "2,2": {
+    "6,2": {
       "name": "snare_sharp.wav",
       "name": "snare_sharp.wav",
       "location": "media/cc0/snare/snare_sharp.wav",
       "location": "media/cc0/snare/snare_sharp.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -213,6 +244,40 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
+      "reverse": false
+    },
+    "0,4": {
+      "name": "bass_1.wav",
+      "location": "media/cc0/bass/bass_1.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 16,
+      "trim": 0,
+      "speed": 0.83,
+      "category": "",
+      "reverse": false
+    },
+    "8,1": {
+      "name": "kick_low.wav",
+      "location": "media/cc0/kick/kick_low.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "category": "",
+      "reverse": false
+    },
+    "10,4": {
+      "name": "bass_1.wav",
+      "location": "media/cc0/bass/bass_1.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 16,
+      "trim": 0,
+      "speed": 0.83,
+      "category": "",
       "reverse": false
       "reverse": false
     }
     }
   }
   }

+ 56 - 41
patterns/cold sweat.pat

@@ -5,17 +5,7 @@
   "xsize": 16,
   "xsize": 16,
   "ysize": 3,
   "ysize": 3,
   "sounds": {
   "sounds": {
-    "15,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
-      "volume": 1.0,
-      "roll": 0,
-      "rollrate": 0,
-      "trim": 0,
-      "speed": 1.0,
-      "reverse": false
-    },
-    "4,2": {
+    "6,2": {
       "name": "ride_bell2.wav",
       "name": "ride_bell2.wav",
       "location": "media/cc0/ride_bell.wav",
       "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -23,19 +13,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,2": {
-      "name": "ride_bell2.wav",
-      "location": "media/cc0/ride_bell.wav",
+    "4,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "7,1": {
+    "12,1": {
       "name": "snare_jungle.wav",
       "name": "snare_jungle.wav",
       "location": "media/cc0/snare/snare_jungle.wav",
       "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -43,9 +35,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,2": {
+    "4,2": {
       "name": "ride_bell2.wav",
       "name": "ride_bell2.wav",
       "location": "media/cc0/ride_bell.wav",
       "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -53,59 +46,65 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "6,2": {
-      "name": "ride_bell2.wav",
-      "location": "media/cc0/ride_bell.wav",
+    "10,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "14,2": {
-      "name": "ride_bell2.wav",
-      "location": "media/cc0/ride_bell.wav",
+    "8,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,2": {
-      "name": "ride_bell2.wav",
-      "location": "media/cc0/ride_bell.wav",
+    "15,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,0": {
+    "0,0": {
       "name": "kick_rough.wav",
       "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,0": {
-      "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "7,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "2,2": {
+    "0,2": {
       "name": "ride_bell2.wav",
       "name": "ride_bell2.wav",
       "location": "media/cc0/ride_bell.wav",
       "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -113,29 +112,32 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "12,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "2,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,2": {
+    "8,2": {
       "name": "ride_bell2.wav",
       "name": "ride_bell2.wav",
       "location": "media/cc0/ride_bell.wav",
       "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -143,16 +145,29 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,0": {
-      "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "10,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "category": "",
+      "reverse": false
+    },
+    "14,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     }
     }
   }
   }

+ 88 - 62
patterns/funky drummer.pat

@@ -5,27 +5,29 @@
   "xsize": 16,
   "xsize": 16,
   "ysize": 3,
   "ysize": 3,
   "sounds": {
   "sounds": {
-    "15,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "4,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "2,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "15,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "5,2": {
+    "6,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -33,39 +35,43 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "9,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "4,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "15,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "5,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "8,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "3,2": {
+    "11,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -73,69 +79,76 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "6,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "12,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "0,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "6,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "11,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "13,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "6,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "11,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "13,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "0,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,2": {
+    "14,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -143,9 +156,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "7,2": {
+    "10,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -153,19 +167,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "1,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "11,2": {
+    "3,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -173,9 +189,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,2": {
+    "7,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -183,9 +200,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "1,2": {
+    "9,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -193,29 +211,32 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "2,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "9,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "2,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,2": {
+    "12,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -223,46 +244,51 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "9,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "2,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "7,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "10,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "15,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "14,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "7,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     }
     }
   }
   }

+ 37 - 23
patterns/impeach the president.pat

@@ -5,7 +5,7 @@
   "xsize": 16,
   "xsize": 16,
   "ysize": 3,
   "ysize": 3,
   "sounds": {
   "sounds": {
-    "2,2": {
+    "10,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -13,19 +13,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,0": {
-      "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "2,2": {
+      "name": "hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,1": {
+    "4,1": {
       "name": "snare_organic.wav",
       "name": "snare_organic.wav",
       "location": "media/cc0/snare/snare_organic.wav",
       "location": "media/cc0/snare/snare_organic.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -33,19 +35,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "14,0": {
+    "8,0": {
       "name": "kick_rough.wav",
       "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,2": {
+    "14,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -53,29 +57,32 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "7,0": {
+    "0,0": {
       "name": "kick_rough.wav",
       "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,1": {
-      "name": "snare_organic.wav",
-      "location": "media/cc0/snare/snare_organic.wav",
+    "14,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,2": {
+    "4,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -83,19 +90,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,0": {
+    "7,0": {
       "name": "kick_rough.wav",
       "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,2": {
+    "0,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -103,9 +112,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "14,2": {
+    "8,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -113,9 +123,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,2": {
+    "6,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -123,19 +134,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "6,2": {
-      "name": "hihiat_real.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "12,1": {
+      "name": "snare_organic.wav",
+      "location": "media/cc0/snare/snare_organic.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,2": {
+    "12,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -143,6 +156,7 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     }
     }
   }
   }

+ 76 - 50
patterns/it's a new day.pat

@@ -5,17 +5,18 @@
   "xsize": 16,
   "xsize": 16,
   "ysize": 4,
   "ysize": 4,
   "sounds": {
   "sounds": {
-    "6,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "11,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,2": {
+    "11,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -23,9 +24,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,2": {
+    "0,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -33,19 +35,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "11,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
-      "volume": 1.0,
-      "roll": 0,
-      "rollrate": 0,
-      "trim": 0,
-      "speed": 1.0,
-      "reverse": false
-    },
-    "5,2": {
+    "10,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -53,6 +46,7 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "15,1": {
     "15,1": {
@@ -63,9 +57,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "15,2": {
+    "12,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -73,9 +68,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,2": {
+    "3,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -83,59 +79,65 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "11,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "10,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,0": {
+    "13,0": {
       "name": "kick_edm.wav",
       "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "5,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "2,0": {
     "2,0": {
       "name": "kick_edm.wav",
       "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "12,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "6,2": {
+    "15,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -143,19 +145,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "3,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "7,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "1,2": {
+    "9,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -163,19 +167,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "2,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "0,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "9,2": {
+    "8,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -183,16 +189,18 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "1,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "14,2": {
     "14,2": {
@@ -203,19 +211,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "13,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "2,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "7,2": {
+    "6,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -223,6 +233,7 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "9,1": {
     "9,1": {
@@ -233,6 +244,7 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "4,1": {
     "4,1": {
@@ -243,9 +255,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,2": {
+    "6,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "category": "",
+      "reverse": false
+    },
+    "7,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -253,16 +277,18 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "7,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "4,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     }
     }
   }
   }

+ 84 - 58
patterns/walk this way.pat

@@ -5,47 +5,51 @@
   "xsize": 16,
   "xsize": 16,
   "ysize": 4,
   "ysize": 4,
   "sounds": {
   "sounds": {
-    "11,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "3,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "2,0": {
+    "10,0": {
       "name": "kick_edm.wav",
       "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "7,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "7,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "6,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "9,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,2": {
+    "12,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -53,19 +57,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "15,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "1,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "14,2": {
+    "8,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -73,29 +79,32 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "12,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "6,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "9,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "3,2": {
+    "6,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -103,9 +112,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "2,2": {
+    "0,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -113,9 +123,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,1": {
+    "11,1": {
       "name": "snare_jungle.wav",
       "name": "snare_jungle.wav",
       "location": "media/cc0/snare/snare_jungle.wav",
       "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -123,49 +134,54 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "5,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "7,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "13,0": {
     "13,0": {
       "name": "kick_edm.wav",
       "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "4,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "7,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "0,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "1,2": {
+    "2,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -173,26 +189,29 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "9,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "10,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,1": {
-      "name": "snare_jungle.wav",
-      "location": "media/cc0/snare/snare_jungle.wav",
+    "14,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "4,2": {
     "4,2": {
@@ -203,19 +222,21 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "15,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "6,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,2": {
+    "11,2": {
       "name": "hihiat_closed.wav",
       "name": "hihiat_closed.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -223,46 +244,51 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "11,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "15,1": {
+      "name": "snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "9,2": {
-      "name": "hihiat_closed.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "2,0": {
+      "name": "kick_edm.wav",
+      "location": "media/cc0/kick/kick_edm.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "5,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,0": {
-      "name": "kick_edm.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "15,2": {
+      "name": "hihiat_closed.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     }
     }
   }
   }

+ 45 - 30
patterns/when the levee breaks.pat

@@ -5,24 +5,26 @@
   "xsize": 16,
   "xsize": 16,
   "ysize": 3,
   "ysize": 3,
   "sounds": {
   "sounds": {
-    "10,2": {
-      "name": "hihiat_real.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "12,1": {
+      "name": "snare_deep.wav",
+      "location": "media/cc0/snare/snare_deep.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "1,0": {
-      "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "4,2": {
+      "name": "hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "6,2": {
     "6,2": {
@@ -33,59 +35,65 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
     "11,0": {
     "11,0": {
       "name": "kick_rough.wav",
       "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "7,0": {
+    "1,0": {
       "name": "kick_rough.wav",
       "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "10,0": {
+    "7,0": {
       "name": "kick_rough.wav",
       "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,0": {
-      "name": "kick_rough.wav",
-      "location": "media/cc0/kick_rough.wav",
+    "0,2": {
+      "name": "hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,1": {
-      "name": "snare_deep.wav",
-      "location": "media/cc0/snare/snare_deep.wav",
+    "14,2": {
+      "name": "hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "14,2": {
+    "12,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -93,9 +101,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,2": {
+    "2,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -103,29 +112,32 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "0,2": {
-      "name": "hihiat_real.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "10,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "12,1": {
-      "name": "snare_deep.wav",
-      "location": "media/cc0/snare/snare_deep.wav",
+    "0,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick/kick_rough.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "8,2": {
+    "10,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -133,9 +145,10 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "2,2": {
+    "8,2": {
       "name": "hihiat_real.wav",
       "name": "hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "volume": 1.0,
@@ -143,16 +156,18 @@
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     },
     },
-    "4,2": {
-      "name": "hihiat_real.wav",
-      "location": "media/cc0/hihiat_real.wav",
+    "4,1": {
+      "name": "snare_deep.wav",
+      "location": "media/cc0/snare/snare_deep.wav",
       "volume": 1.0,
       "volume": 1.0,
       "roll": 0,
       "roll": 0,
       "rollrate": 0,
       "rollrate": 0,
       "trim": 0,
       "trim": 0,
       "speed": 1.0,
       "speed": 1.0,
+      "category": "",
       "reverse": false
       "reverse": false
     }
     }
   }
   }

+ 0 - 21
patterns/yjhfghj.pat

@@ -1,21 +0,0 @@
-{
-  "name": "yjhfghj",
-  "repeat": 0,
-  "resolution": 8,
-  "xsize": 8,
-  "ysize": 1,
-  "sounds": {},
-  "snds": {
-    "4,0": {
-      "name": "ride_crisp.wav",
-      "location": "media/cc0/ride_crisp.wav",
-      "volume": 1.0,
-      "roll": 0,
-      "rollrate": 16,
-      "trim": 0,
-      "speed": 1.0,
-      "category": "",
-      "reverse": false
-    }
-  }
-}

+ 61 - 32
src/base.rs

@@ -13,7 +13,8 @@ use crate::serde::ser::SerializeMap;
 use std::sync::MutexGuard;
 use std::sync::MutexGuard;
 // pub fn collect
 // pub fn collect
 use log::*;
 use log::*;
-
+use std::collections::hash_map::DefaultHasher;
+use std::hash::{Hash, Hasher};
 
 
 #[derive(Serialize, Deserialize, Clone, Default, Debug)]
 #[derive(Serialize, Deserialize, Clone, Default, Debug)]
 pub struct Sound {
 pub struct Sound {
@@ -36,6 +37,22 @@ pub struct Sound {
     pub reverse: bool
     pub reverse: bool
 }
 }
 
 
+impl PartialEq for Sound {
+    fn eq(&self, other: &Self) -> bool {
+        self.name == other.name
+        && self.volume == other.volume
+        && self.roll == other.roll
+        && self.speed == other.speed
+        && self.trim == other.trim
+    }
+}
+// impl Hash for Sound {
+//     fn hash<H: Hasher>(&self, state: &mut H) {
+//         self.name.hash(state);
+//         self.volume.hash(state);
+//     }
+// }
+
 impl AsRef<[u8]> for Sound {
 impl AsRef<[u8]> for Sound {
     fn as_ref(&self) -> &[u8] {
     fn as_ref(&self) -> &[u8] {
         &self.data
         &self.data
@@ -66,6 +83,13 @@ impl Sound {
         })
         })
     }
     }
 
 
+    pub fn extended_display(&self) -> String {
+        format!(
+            "{} V{} S{} R{} T{}", self.name.replace(".wav", ""), self.volume, self.speed, self.roll, self.trim
+        )
+
+    }
+
     pub fn duration(&self) -> Option<Duration> {
     pub fn duration(&self) -> Option<Duration> {
 
 
         // let file = File::open(&self.location).unwrap();
         // let file = File::open(&self.location).unwrap();
@@ -89,16 +113,6 @@ impl Sound {
     }
     }
 
 
     pub fn cloned(&self) -> Sound {
     pub fn cloned(&self) -> Sound {
-        // let mut s = Sound::default();
-        // s.data = self.data.clone();
-        // s.name = self.name.clone();
-        // s.location = self.location.clone();
-        // s.roll = self.roll;
-        // s.rollrate = self.rollrate;
-        // s.speed = self.speed;
-        // s.volume = self.volume;
-        // s.trim = self.trim;
-
         let mut clone = self.clone();
         let mut clone = self.clone();
         clone.active = Arc::from(Mutex::from(false));
         clone.active = Arc::from(Mutex::from(false));
         clone
         clone
@@ -282,10 +296,10 @@ pub struct Pattern {
     pub resolution: i32,
     pub resolution: i32,
     pub xsize: usize,
     pub xsize: usize,
     pub ysize: usize,
     pub ysize: usize,
-    #[serde(serialize_with="ser_sounds", deserialize_with="de_sounds")]
-    pub sounds: HashMap<(usize, usize), Sound>,
+    // #[serde(serialize_with="ser_sounds", deserialize_with="de_sounds")]
+    // pub sounds: HashMap<(usize, usize), Sound>,
     #[serde(serialize_with="ser_snds", deserialize_with="de_snds")]
     #[serde(serialize_with="ser_snds", deserialize_with="de_snds")]
-    pub snds: Arc<Mutex<HashMap<(usize, usize), Sound>>>
+    pub sounds: Arc<Mutex<HashMap<(usize, usize), Sound>>>
 }
 }
 
 
 /// Some basic defaults for a pattern.
 /// Some basic defaults for a pattern.
@@ -297,8 +311,8 @@ impl Default for Pattern {
             resolution: 8,
             resolution: 8,
             xsize: 8,
             xsize: 8,
             ysize: 1,
             ysize: 1,
-            sounds: HashMap::new(),
-            snds: Arc::new(Mutex::new(HashMap::new()))
+            // sounds: HashMap::new(),
+            sounds: Arc::new(Mutex::new(HashMap::new()))
         }
         }
     }
     }
 }
 }
@@ -349,7 +363,7 @@ impl Pattern {
         let device = device.clone();
         let device = device.clone();
         let delay = self.get_sample_spacing(bpm);
         let delay = self.get_sample_spacing(bpm);
         
         
-        let snds = self.snds.clone();
+        let snds = self.sounds.clone();
         thread::spawn(move || {
         thread::spawn(move || {
             
             
             // loop for repeats
             // loop for repeats
@@ -397,11 +411,11 @@ impl Pattern {
         }
         }
     }
     }
 
 
-    /// Replace all souds in a row by a new sound.
+    /// Replace all sounds in a row by a new sound.
     /// This only replaces the source, leaving other settings intact.
     /// This only replaces the source, leaving other settings intact.
     pub fn replace_sound_sources(&mut self, new_sound: &Sound, row: usize) {
     pub fn replace_sound_sources(&mut self, new_sound: &Sound, row: usize) {
         for x in 0..self.xsize {
         for x in 0..self.xsize {
-            if let Some(snd) = self.snds.lock().unwrap().get_mut(&(x, row)) {
+            if let Some(snd) = self.sounds.lock().unwrap().get_mut(&(x, row)) {
                 info!("replacing {} with {}", snd.name, new_sound.name);
                 info!("replacing {} with {}", snd.name, new_sound.name);
                 snd.location = new_sound.location.clone();
                 snd.location = new_sound.location.clone();
                 snd.data = new_sound.data.clone();
                 snd.data = new_sound.data.clone();
@@ -412,37 +426,51 @@ impl Pattern {
 
 
     /// Insert a sound
     /// Insert a sound
     pub fn insert_sound(&mut self, pos: &(usize, usize), snd: &Sound) {
     pub fn insert_sound(&mut self, pos: &(usize, usize), snd: &Sound) {
-        self.snds.lock().unwrap().insert(*pos, snd.clone());
+        self.sounds.lock().unwrap().insert(*pos, snd.clone());
     }
     }
 
 
     /// Remove a sound
     /// Remove a sound
     pub fn remove_sound(&mut self, pos: &(usize, usize)) {
     pub fn remove_sound(&mut self, pos: &(usize, usize)) {
-        self.snds.lock().unwrap().remove(pos);
+        self.sounds.lock().unwrap().remove(pos);
     }
     }
 
 
     /// Check if a pattern contains a sound
     /// Check if a pattern contains a sound
     pub fn contains_sound(&self, pos: &(usize, usize)) -> bool {
     pub fn contains_sound(&self, pos: &(usize, usize)) -> bool {
-        self.snds.lock().unwrap().contains_key(pos)
+        self.sounds.lock().unwrap().contains_key(pos)
     }
     }
 
 
-    /// Return a MutexGuard to the sounds
-    pub fn sounds(&self) -> MutexGuard<HashMap<(usize, usize), Sound>> {
-        self.snds.lock().unwrap()
-    }
 
 
     /// Get a sound from a pattern
     /// Get a sound from a pattern
     pub fn get_sound(&self, pos: &(usize, usize)) -> Option<Sound> {
     pub fn get_sound(&self, pos: &(usize, usize)) -> Option<Sound> {
-        self.snds.lock().unwrap()
+        self.sounds.lock().unwrap()
             .get(pos)
             .get(pos)
             .map(|s| s.clone())
             .map(|s| s.clone())
     }
     }
 
 
 
 
+    pub fn get_all_sounds(&self) -> Vec<Sound> {
+        let mut sounds = vec![];
+
+        for x in 0..self.xsize {
+            for y in 0..self.ysize {
+
+                if let Some(snd) = self.sounds.lock().unwrap().get_mut(&(x, y)) {
+                    if !sounds.contains(snd) {
+
+                        sounds.push(snd.clone());
+                    }
+                }
+        
+            }
+        }
+        sounds
+    }
+
     /// Replace all souds in a row by a new sound.
     /// Replace all souds in a row by a new sound.
     /// This only replaces the source, leaving other settings intact.
     /// This only replaces the source, leaving other settings intact.
     pub fn replace_sounds(&mut self, new_sound: &Sound, row: usize) {
     pub fn replace_sounds(&mut self, new_sound: &Sound, row: usize) {
         for x in 0..self.xsize {
         for x in 0..self.xsize {
-            if let Some(snd) = self.sounds.get_mut(&(x, row)) {
+            if let Some(snd) = self.sounds.lock().unwrap().get_mut(&(x, row)) {
                 *snd = new_sound.clone();
                 *snd = new_sound.clone();
             }
             }
         
         
@@ -454,7 +482,7 @@ impl Pattern {
         let mut names: HashMap<String, usize> = HashMap::new();
         let mut names: HashMap<String, usize> = HashMap::new();
 
 
         for x in 0..self.xsize {
         for x in 0..self.xsize {
-            if let Some(snd) = self.snds.lock().unwrap().get(&(x, row)) {
+            if let Some(snd) = self.sounds.lock().unwrap().get(&(x, row)) {
                 match names.get_mut(&snd.name) {
                 match names.get_mut(&snd.name) {
                     Some(v) => *v += 1,
                     Some(v) => *v += 1,
                     None => {names.insert(snd.name.clone(), 1);},
                     None => {names.insert(snd.name.clone(), 1);},
@@ -485,14 +513,14 @@ impl Pattern {
 
 
     /// Clear all sounds in a pattern.
     /// Clear all sounds in a pattern.
     pub fn clear_all(&mut self) {
     pub fn clear_all(&mut self) {
-        self.snds.lock().unwrap().clear();
+        self.sounds.lock().unwrap().clear();
     }
     }
 
 
     /// Reload all sounds in a pattern
     /// Reload all sounds in a pattern
     pub fn reload_sounds(&mut self) -> Pattern {
     pub fn reload_sounds(&mut self) -> Pattern {
         for x in 0..self.xsize {
         for x in 0..self.xsize {
             for y in 0..self.ysize {
             for y in 0..self.ysize {
-                if let Some(snd) = self.sounds.get_mut(&(x,y)) {
+                if let Some(snd) = self.sounds.lock().unwrap().get_mut(&(x,y)) {
                     // println!("RELOAD {:?}", &snd.name);
                     // println!("RELOAD {:?}", &snd.name);
                     match snd.updated_from_source() {
                     match snd.updated_from_source() {
                         Ok(newdata) => snd.data = newdata.data,
                         Ok(newdata) => snd.data = newdata.data,
@@ -501,7 +529,8 @@ impl Pattern {
                 }
                 }
             }
             }
         }
         }
-        self.snds = Arc::new(Mutex::new(self.sounds.clone()));
+        // TODO: is this line needed?
+        // self.sounds = Arc::new(Mutex::new(self.sounds.clone()));
         self.clone()
         self.clone()
     }
     }
 
 

+ 20 - 6
src/main.rs

@@ -223,13 +223,17 @@ fn main() {
             .size([800.0, 400.0], Condition::FirstUseEver)
             .size([800.0, 400.0], Condition::FirstUseEver)
             .position([0.0, 255.0], Condition::Appearing)
             .position([0.0, 255.0], Condition::Appearing)
             .build(ui, || {
             .build(ui, || {
-                let button_size: f32 = 32.0;
+                let button_size: f32 = 28.0;
 
 
-                if ui.small_button(&im_str!("increase length")) {active_pattern.extend_length(1);}
+                if ui.small_button(&im_str!("length + 1")) {active_pattern.extend_length(1);}
                 ui.same_line(0.0);
                 ui.same_line(0.0);
+                if ui.small_button(&im_str!("length + 4")) {active_pattern.extend_length(4);}
+                ui.same_line(0.0);
+                if ui.small_button(&im_str!("length + 8")) {active_pattern.extend_length(8);}
+                
                 if ui.small_button(&im_str!("add trk")) {active_pattern.extend_row(1);}
                 if ui.small_button(&im_str!("add trk")) {active_pattern.extend_row(1);}
                 ui.same_line(0.0);
                 ui.same_line(0.0);
-                if ui.small_button(&im_str!("save")) {active_pattern.save();}
+                if ui.small_button(&im_str!("save pattern")) {active_pattern.save();}
      
      
 
 
                 // The pattern name
                 // The pattern name
@@ -318,7 +322,16 @@ fn main() {
                     }
                     }
                 }
                 }
 
 
-                ui.text(im_str!("pat {} {}", pattern_col, pattern_row));
+
+                for used_snd in active_pattern.get_all_sounds() {
+                    if ui.small_button(&im_str!("{}", used_snd.extended_display())) {
+                        active_sound = Some(used_snd.clone());
+
+                        // active_pattern.play_ref(&dev, bpm);
+                    }
+                }
+
+
                 if ui.small_button(&im_str!("play")) {
                 if ui.small_button(&im_str!("play")) {
                     active_pattern.play_ref(&dev, bpm);
                     active_pattern.play_ref(&dev, bpm);
                     //active_pattern.play(&dev, bpm);
                     //active_pattern.play(&dev, bpm);
@@ -358,17 +371,18 @@ fn main() {
                     ui.drag_int(im_str!("roll"), &mut s.roll)
                     ui.drag_int(im_str!("roll"), &mut s.roll)
                         .min(0)
                         .min(0)
                         .max(32)
                         .max(32)
-                        .speed(0.01)
+                        .speed(0.04)
                         .build();
                         .build();
 
 
                     ui.drag_int(im_str!("roll rate"), &mut s.rollrate)
                     ui.drag_int(im_str!("roll rate"), &mut s.rollrate)
                         .min(0)
                         .min(0)
                         .max(32)
                         .max(32)
-                        .speed(0.01)
+                        .speed(0.04)
                         .build();
                         .build();
                     ui.checkbox(im_str!("reverse"), &mut s.reverse);
                     ui.checkbox(im_str!("reverse"), &mut s.reverse);
                         
                         
                     if ui.button(&im_str!("adjust speed to pattern"), [w, 0.0]) {
                     if ui.button(&im_str!("adjust speed to pattern"), [w, 0.0]) {
+                        dbg!(s.duration());
                         if let Some(sd) = s.duration() {
                         if let Some(sd) = s.duration() {
                             let ad = active_pattern.duration(bpm);
                             let ad = active_pattern.duration(bpm);
                             dbg!(&sd.as_millis());
                             dbg!(&sd.as_millis());