Browse Source

prior to snds -> sounds refactor

Johann Woelper 4 năm trước cách đây
mục cha
commit
77afa741d7

+ 3 - 3
Readme.md

@@ -11,9 +11,9 @@ What you can do now:
 - Sounds can be adjusted:
     - speed
     - volume
-    - trim (planned)
+    - trim
+    - roll
     - reverse (planned)
-    - roll (planned)
 - Patterns can be adjusted:
     - repeat
     - BPM
@@ -25,4 +25,4 @@ What you can do now:
 - Add your own sounds into the media folder
 
 What you can not do:
-- Export your song 
+- Export your song as audio 😭

media/cc0/snare_birch.wav → media/cc0/snare/snare_birch.wav


media/cc0/snare_deep.wav → media/cc0/snare/snare_deep.wav


media/cc0/snare_dry_wood.wav → media/cc0/snare/snare_dry_wood.wav


media/cc0/snare_dubstep.wav → media/cc0/snare/snare_dubstep.wav


media/cc0/snare_dubstep2.wav → media/cc0/snare/snare_dubstep2.wav


media/cc0/snare_flat.wav → media/cc0/snare/snare_flat.wav


media/cc0/snare_heavy.wav → media/cc0/snare/snare_heavy.wav


media/cc0/snare_high.wav → media/cc0/snare/snare_high.wav


media/cc0/snare_jungle.wav → media/cc0/snare/snare_jungle.wav


media/cc0/snare_lite.wav → media/cc0/snare/snare_lite.wav


media/cc0/snare_lowfi.wav → media/cc0/snare/snare_lowfi.wav


media/cc0/snare_organic.wav → media/cc0/snare/snare_organic.wav


media/cc0/snare_punchy.wav → media/cc0/snare/snare_punchy.wav


media/cc0/snare_sharp.wav → media/cc0/snare/snare_sharp.wav


+ 1 - 1
patterns/Rostock One.pat

@@ -1,7 +1,7 @@
 {
   "name": "Rostock One",
   "repeat": 8,
-  "resolution": 0,
+  "resolution": 8,
   "xsize": 8,
   "ysize": 3,
   "sounds": {}

+ 159 - 0
patterns/amen.pat

@@ -0,0 +1,159 @@
+{
+  "name": "amen",
+  "repeat": 1,
+  "resolution": 8,
+  "xsize": 64,
+  "ysize": 4,
+  "sounds": {
+    "2,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "reverse": false
+    },
+    "6,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 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,
+      "reverse": false
+    },
+    "7,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
+    },
+    "10,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "reverse": false
+    },
+    "4,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "reverse": false
+    },
+    "8,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "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,
+      "reverse": false
+    },
+    "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
+    },
+    "0,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "reverse": false
+    },
+    "10,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "reverse": false
+    },
+    "0,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "reverse": false
+    },
+    "14,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "reverse": false
+    },
+    "12,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "reverse": false
+    },
+    "8,2": {
+      "name": "ride_bell2.wav",
+      "location": "media/cc0/ride_bell.wav",
+      "volume": 1.0,
+      "roll": 0,
+      "rollrate": 0,
+      "trim": 0,
+      "speed": 1.0,
+      "reverse": false
+    }
+  }
+}

+ 4 - 4
patterns/berlin.pat

@@ -27,7 +27,7 @@
     },
     "6,2": {
       "name": "snare_sharp.wav",
-      "location": "media/cc0/snare_sharp.wav",
+      "location": "media/cc0/snare/snare_sharp.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -47,7 +47,7 @@
     },
     "14,2": {
       "name": "snare_sharp.wav",
-      "location": "media/cc0/snare_sharp.wav",
+      "location": "media/cc0/snare/snare_sharp.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -57,7 +57,7 @@
     },
     "10,2": {
       "name": "snare_sharp.wav",
-      "location": "media/cc0/snare_sharp.wav",
+      "location": "media/cc0/snare/snare_sharp.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -207,7 +207,7 @@
     },
     "2,2": {
       "name": "snare_sharp.wav",
-      "location": "media/cc0/snare_sharp.wav",
+      "location": "media/cc0/snare/snare_sharp.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,

+ 15 - 15
patterns/cold sweat.pat

@@ -7,7 +7,7 @@
   "sounds": {
     "15,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -17,7 +17,7 @@
     },
     "4,2": {
       "name": "ride_bell2.wav",
-      "location": "media\\cc0\\ride_bell.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -27,7 +27,7 @@
     },
     "10,2": {
       "name": "ride_bell2.wav",
-      "location": "media\\cc0\\ride_bell.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -37,7 +37,7 @@
     },
     "7,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -47,7 +47,7 @@
     },
     "12,2": {
       "name": "ride_bell2.wav",
-      "location": "media\\cc0\\ride_bell.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -57,7 +57,7 @@
     },
     "6,2": {
       "name": "ride_bell2.wav",
-      "location": "media\\cc0\\ride_bell.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -67,7 +67,7 @@
     },
     "14,2": {
       "name": "ride_bell2.wav",
-      "location": "media\\cc0\\ride_bell.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -77,7 +77,7 @@
     },
     "8,2": {
       "name": "ride_bell2.wav",
-      "location": "media\\cc0\\ride_bell.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -87,7 +87,7 @@
     },
     "10,0": {
       "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -97,7 +97,7 @@
     },
     "8,0": {
       "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -107,7 +107,7 @@
     },
     "2,2": {
       "name": "ride_bell2.wav",
-      "location": "media\\cc0\\ride_bell.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -117,7 +117,7 @@
     },
     "12,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -127,7 +127,7 @@
     },
     "4,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -137,7 +137,7 @@
     },
     "0,2": {
       "name": "ride_bell2.wav",
-      "location": "media\\cc0\\ride_bell.wav",
+      "location": "media/cc0/ride_bell.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -147,7 +147,7 @@
     },
     "0,0": {
       "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,

+ 26 - 26
patterns/funky drummer.pat

@@ -7,7 +7,7 @@
   "sounds": {
     "15,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -17,7 +17,7 @@
     },
     "2,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -27,7 +27,7 @@
     },
     "5,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -37,7 +37,7 @@
     },
     "9,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -47,7 +47,7 @@
     },
     "15,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -57,7 +57,7 @@
     },
     "4,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -67,7 +67,7 @@
     },
     "3,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -77,7 +77,7 @@
     },
     "6,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -87,7 +87,7 @@
     },
     "12,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -97,7 +97,7 @@
     },
     "8,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -107,7 +107,7 @@
     },
     "11,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -117,7 +117,7 @@
     },
     "6,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -127,7 +127,7 @@
     },
     "13,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -137,7 +137,7 @@
     },
     "4,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -147,7 +147,7 @@
     },
     "7,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -157,7 +157,7 @@
     },
     "0,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -167,7 +167,7 @@
     },
     "11,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -177,7 +177,7 @@
     },
     "10,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -187,7 +187,7 @@
     },
     "1,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -197,7 +197,7 @@
     },
     "2,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -207,7 +207,7 @@
     },
     "10,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -217,7 +217,7 @@
     },
     "0,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -227,7 +227,7 @@
     },
     "9,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -237,7 +237,7 @@
     },
     "7,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -247,7 +247,7 @@
     },
     "12,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -257,7 +257,7 @@
     },
     "14,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,

+ 37 - 37
patterns/impeach the president.pat

@@ -1,13 +1,13 @@
 {
   "name": "impeach the president",
-  "repeat": 1,
+  "repeat": 2,
   "resolution": 8,
   "xsize": 16,
   "ysize": 3,
   "sounds": {
-    "14,2": {
+    "2,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -15,9 +15,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "7,0": {
+    "8,0": {
       "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -25,9 +25,9 @@
       "speed": 1.0,
       "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,
       "roll": 0,
       "rollrate": 0,
@@ -35,9 +35,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "2,2": {
-      "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+    "14,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -45,9 +45,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "12,1": {
-      "name": "snare_organic.wav",
-      "location": "media\\cc0\\snare_organic.wav",
+    "10,2": {
+      "name": "hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -55,9 +55,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "4,1": {
-      "name": "snare_organic.wav",
-      "location": "media\\cc0\\snare_organic.wav",
+    "7,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -65,9 +65,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "14,0": {
-      "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+    "4,1": {
+      "name": "snare_organic.wav",
+      "location": "media/cc0/snare/snare_organic.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -75,9 +75,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "10,2": {
+    "0,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -85,9 +85,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "12,2": {
-      "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+    "0,0": {
+      "name": "kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -95,9 +95,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "0,0": {
-      "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+    "12,2": {
+      "name": "hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -105,9 +105,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "8,2": {
+    "14,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -115,9 +115,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "4,2": {
+    "8,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -125,9 +125,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "8,0": {
-      "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+    "6,2": {
+      "name": "hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -135,9 +135,9 @@
       "speed": 1.0,
       "reverse": false
     },
-    "0,2": {
+    "4,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,

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

@@ -7,7 +7,7 @@
   "sounds": {
     "6,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -17,7 +17,7 @@
     },
     "0,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -27,7 +27,7 @@
     },
     "10,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -37,7 +37,7 @@
     },
     "11,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -47,7 +47,7 @@
     },
     "5,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -57,7 +57,7 @@
     },
     "15,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -67,7 +67,7 @@
     },
     "15,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -77,7 +77,7 @@
     },
     "8,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -87,7 +87,7 @@
     },
     "11,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -97,7 +97,7 @@
     },
     "0,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -107,7 +107,7 @@
     },
     "10,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -117,7 +117,7 @@
     },
     "2,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -127,7 +127,7 @@
     },
     "12,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -137,7 +137,7 @@
     },
     "6,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -147,7 +147,7 @@
     },
     "3,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -157,7 +157,7 @@
     },
     "1,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -167,7 +167,7 @@
     },
     "2,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -177,7 +177,7 @@
     },
     "9,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -187,7 +187,7 @@
     },
     "12,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -197,7 +197,7 @@
     },
     "14,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -207,7 +207,7 @@
     },
     "13,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -217,7 +217,7 @@
     },
     "7,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -227,7 +227,7 @@
     },
     "9,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -237,7 +237,7 @@
     },
     "4,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -247,7 +247,7 @@
     },
     "4,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -257,7 +257,7 @@
     },
     "7,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,

+ 8 - 0
patterns/test.pat

@@ -0,0 +1,8 @@
+{
+  "name": "test",
+  "repeat": 0,
+  "resolution": 8,
+  "xsize": 8,
+  "ysize": 2,
+  "sounds": {}
+}

+ 26 - 26
patterns/walk this way.pat

@@ -7,7 +7,7 @@
   "sounds": {
     "11,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -17,7 +17,7 @@
     },
     "2,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -27,7 +27,7 @@
     },
     "7,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -37,7 +37,7 @@
     },
     "6,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -47,7 +47,7 @@
     },
     "8,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -57,7 +57,7 @@
     },
     "15,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -67,7 +67,7 @@
     },
     "14,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -77,7 +77,7 @@
     },
     "0,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -87,7 +87,7 @@
     },
     "6,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -97,7 +97,7 @@
     },
     "3,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -107,7 +107,7 @@
     },
     "2,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -117,7 +117,7 @@
     },
     "12,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -127,7 +127,7 @@
     },
     "5,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -137,7 +137,7 @@
     },
     "13,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -147,7 +147,7 @@
     },
     "12,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -157,7 +157,7 @@
     },
     "7,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -167,7 +167,7 @@
     },
     "1,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -177,7 +177,7 @@
     },
     "9,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -187,7 +187,7 @@
     },
     "4,1": {
       "name": "snare_jungle.wav",
-      "location": "media\\cc0\\snare_jungle.wav",
+      "location": "media/cc0/snare/snare_jungle.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -197,7 +197,7 @@
     },
     "4,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -207,7 +207,7 @@
     },
     "15,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -217,7 +217,7 @@
     },
     "10,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -227,7 +227,7 @@
     },
     "11,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -237,7 +237,7 @@
     },
     "9,2": {
       "name": "hihiat_closed.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -247,7 +247,7 @@
     },
     "0,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -257,7 +257,7 @@
     },
     "10,0": {
       "name": "kick_edm.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,

+ 15 - 15
patterns/when the levee breaks.pat

@@ -7,7 +7,7 @@
   "sounds": {
     "10,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -17,7 +17,7 @@
     },
     "1,0": {
       "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -27,7 +27,7 @@
     },
     "6,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -37,7 +37,7 @@
     },
     "11,0": {
       "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -47,7 +47,7 @@
     },
     "7,0": {
       "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -57,7 +57,7 @@
     },
     "10,0": {
       "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -67,7 +67,7 @@
     },
     "0,0": {
       "name": "kick_rough.wav",
-      "location": "media\\cc0\\kick_rough.wav",
+      "location": "media/cc0/kick_rough.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -77,7 +77,7 @@
     },
     "4,1": {
       "name": "snare_deep.wav",
-      "location": "media\\cc0\\snare_deep.wav",
+      "location": "media/cc0/snare/snare_deep.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -87,7 +87,7 @@
     },
     "14,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -97,7 +97,7 @@
     },
     "12,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -107,7 +107,7 @@
     },
     "0,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -117,7 +117,7 @@
     },
     "12,1": {
       "name": "snare_deep.wav",
-      "location": "media\\cc0\\snare_deep.wav",
+      "location": "media/cc0/snare/snare_deep.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -127,7 +127,7 @@
     },
     "8,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -137,7 +137,7 @@
     },
     "2,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,
@@ -147,7 +147,7 @@
     },
     "4,2": {
       "name": "hihiat_real.wav",
-      "location": "media\\cc0\\hihiat_real.wav",
+      "location": "media/cc0/hihiat_real.wav",
       "volume": 1.0,
       "roll": 0,
       "rollrate": 0,

+ 21 - 0
patterns/yjhfghj.pat

@@ -0,0 +1,21 @@
+{
+  "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
+    }
+  }
+}

+ 51 - 9
src/base.rs

@@ -28,10 +28,11 @@ pub struct Sound {
     pub rollrate: i32,
     pub trim: i32,
     #[serde(skip)]
-    // pub active: bool,
     pub active: Arc<Mutex<bool>>,
     pub speed: f32,
     #[serde(default)]
+    pub category: String,
+    #[serde(default)]
     pub reverse: bool
 }
 
@@ -87,6 +88,22 @@ impl Sound {
         Sound::new(&self.location)
     }
 
+    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();
+        clone.active = Arc::from(Mutex::from(false));
+        clone
+    }
+
     pub fn cursor(self: &Self) -> Cursor<Sound> {
         Cursor::new(
             Sound {
@@ -207,7 +224,7 @@ fn hm_key_from_string(snds: &HashMap<String, Sound>)  ->  HashMap<(usize, usize)
         .collect()
 }
 
-fn ser_snds<S>(h: &HashMap<(usize, usize), Sound>, s: S) -> Result<S::Ok, S::Error>
+fn ser_sounds<S>(h: &HashMap<(usize, usize), Sound>, s: S) -> Result<S::Ok, S::Error>
 where
     S: Serializer,
 {
@@ -219,7 +236,32 @@ where
     map.end()
 }
 
-fn de_snds<'de, D>(deserializer: D) -> Result<HashMap<(usize, usize), Sound>, D::Error>
+
+fn ser_snds<S>(h: &Arc<Mutex<HashMap<(usize, usize), Sound>>>, s: S) -> Result<S::Ok, S::Error>
+where
+    S: Serializer,
+{
+    let um = h.lock().unwrap();
+    let mut map = s.serialize_map(Some(um.len()))?;
+    for (k, v) in hm_key_to_string(&um) {
+        map.serialize_entry(&k, &v)?;
+    }
+    map.end()
+}
+
+fn de_snds<'de, D>(deserializer: D) -> Result<Arc<Mutex<HashMap<(usize, usize), Sound>>>, D::Error>
+where
+D: serde::de::Deserializer<'de>,
+{
+    // TODO err checking
+    let s: HashMap<String, Sound> = serde::de::Deserialize::deserialize(deserializer)?;
+    // serde_json::from_str(s).map_err(serde::de::Error::custom)
+    let x = hm_key_from_string(&s);
+    Ok(Arc::new(Mutex::new(x)))
+}
+
+
+fn de_sounds<'de, D>(deserializer: D) -> Result<HashMap<(usize, usize), Sound>, D::Error>
 where
 D: serde::de::Deserializer<'de>,
 {
@@ -240,9 +282,9 @@ pub struct Pattern {
     pub resolution: i32,
     pub xsize: usize,
     pub ysize: usize,
-    #[serde(serialize_with="ser_snds", deserialize_with="de_snds")]
+    #[serde(serialize_with="ser_sounds", deserialize_with="de_sounds")]
     pub sounds: HashMap<(usize, usize), Sound>,
-    #[serde(skip)]
+    #[serde(serialize_with="ser_snds", deserialize_with="de_snds")]
     pub snds: Arc<Mutex<HashMap<(usize, usize), Sound>>>
 }
 
@@ -348,7 +390,7 @@ impl Pattern {
                     })
                     .map(|mut p: Pattern| p.reload_sounds())
                     .map(|p| {
-                        println!("LD {} TMG {}", p.name, p.resolution);
+                        info!("LD {} TMG {}", p.name, p.resolution);
                         p})
             }
             Err(e) => Err(e.to_string())
@@ -454,7 +496,7 @@ impl Pattern {
                     // println!("RELOAD {:?}", &snd.name);
                     match snd.updated_from_source() {
                         Ok(newdata) => snd.data = newdata.data,
-                        Err(e) => println!("ERROR LOADING SND {:?} {:?}", e, snd.location)
+                        Err(e) => error!("ERROR LOADING SND: '{}' {:?} {:?}", self.name, snd.location, e)
                     }
                 }
             }
@@ -463,9 +505,9 @@ impl Pattern {
         self.clone()
     }
 
-    pub fn save(&self) {
+    pub fn save(&mut self) {
         let pattern_dir = Path::new("patterns");
-
+        // self.sounds = self.snds;
         let writer = BufWriter::new(File::create(pattern_dir.join(&self.name).with_extension("pat")).unwrap());
         serde_json::to_writer_pretty(writer, &self).unwrap();
     }

+ 111 - 35
src/main.rs

@@ -16,6 +16,24 @@ use env_logger::Env;
 use std::sync::Arc;
 use std::sync::Mutex;
 use log::*;
+use std::collections::HashMap;
+use std::fs;
+use std::path::Path;
+
+
+enum FsType {
+    Dir,
+    File
+}
+
+struct FsItem {
+    fstype: FsType,
+    parent: Option<Box<FsItem>>,
+    children: Vec<FsItem>,
+
+}
+
+
 
 fn collect_sounds (root: &str) -> Vec<Sound> {
     WalkDir::new(root)
@@ -27,6 +45,20 @@ fn collect_sounds (root: &str) -> Vec<Sound> {
     .collect()
 }
 
+
+fn sound_lib(root: &str) -> HashMap<String, Vec<Sound>> {
+    let mut hm: HashMap<String, Vec<Sound>> = HashMap::new();
+
+    for s in collect_sounds(root) {
+        let e = hm.entry(
+            s.location.clone().parent().unwrap().to_string_lossy().into()
+        ).or_default().push(s.clone());
+
+    }
+
+    hm
+}
+
 fn collect_patterns (root: &str) -> Vec<Pattern> {
     WalkDir::new(root)
     .into_iter()
@@ -56,6 +88,11 @@ fn main() {
     let dev = Arc::new(rodio::default_output_device().unwrap());
     
     let mut sounds = collect_sounds("media");
+    let soundlib = sound_lib("media");
+    // for (k, v) in &soundlib {
+    //     println!("{} {:?}", k, v.iter().map(|s| s.name.clone()).collect::<Vec<String>>());
+    // }
+
     let mut patterns = collect_patterns("patterns");
     let mut bpm = 120;
 
@@ -72,9 +109,9 @@ fn main() {
     let mut system = support_ogl::init(file!());
     let display = system.imgui.io().display_size;
     let mut style = system.imgui.style_mut();
-    style.window_rounding = 1.5;
-    style.anti_aliased_lines = false;
-    style.anti_aliased_fill = false;
+    style.window_rounding = 0.0;
+    // style.anti_aliased_lines = false;
+    // style.anti_aliased_fill = false;
     
     const PURPLE: [f32; 4] = [0.07, 0.05, 0.27, 1.00];
     const YELLOW: [f32; 4] = [0.60, 0.25, 0.0, 1.00];
@@ -94,40 +131,74 @@ fn main() {
         ]);
 
 
-        Window::new(im_str!("sources"))
-            .position([400.0, 140.0], Condition::Appearing)
-            .collapsible(false)
-            .size([300.0, 300.0], Condition::FirstUseEver)
+        // SOUND SOURCES WINDOW
+        // Window::new(im_str!("samples"))
+        //     .position([800.0, 0.0], Condition::Appearing)
+        //     .size([200.0, 500.0], Condition::FirstUseEver)
+        //     .build(ui, || {
+
+        //         ui.tree_node(im_str!("snds"))
+        //         .opened(true, Condition::Appearing)
+        //         .build(|| {
+        //             for s in &mut sounds {
+        //                 ui.tree_node(&im_str!("{}", s.name)).build(|| {
+        //                     // ui.same_line(0.0);
+        //                     // if ui.small_button(im_str!("add to pattern")) {
+        //                     //     active_pattern.sounds[pattern_row][pattern_col] = Some(s.clone());
+        //                     // }
+        //                     if ui.small_button(im_str!("load")) {
+        //                         active_sound = Some(s.clone());
+        //                     }
+        //                     ui.same_line(0.0);
+        //                     if ui.small_button(im_str!("play")) {
+        //                         s.play(&dev, bpm);
+        //                     }
+        //                 });
+        //             }
+        //         });
+        //     });
+
+
+            
+            Window::new(im_str!("samples2"))
+            .position([800.0, 0.0], Condition::Appearing)
+            .size([200.0, 500.0], Condition::FirstUseEver)
             .build(ui, || {
+                
+                
+                for (k, snds) in &soundlib {
+
+                    ui.tree_node(&im_str!("{}", k))
+                    .opened(true, Condition::Appearing)
+                    .build(|| {
+                        for s in snds {
+                            ui.tree_node(&im_str!("{}", s.name)).build(|| {
+                                // ui.same_line(0.0);
+                                // if ui.small_button(im_str!("add to pattern")) {
+                                //     active_pattern.sounds[pattern_row][pattern_col] = Some(s.clone());
+                                // }
+                                if ui.small_button(im_str!("load")) {
+                                    active_sound = Some(s.clone());
+                                }
+                                ui.same_line(0.0);
+                                if ui.small_button(im_str!("play")) {
+                                    s.play(&dev, bpm);
+                                }
+                            });
+                        }
+                    });
+
+
+                }
+
 
-                // ui.show_default_style_editor();
 
-                ui.tree_node(im_str!("snds"))
-                .opened(true, Condition::Appearing)
-                .build(|| {
-                    for s in &mut sounds {
-                        ui.tree_node(&im_str!("{}", s.name)).build(|| {
-                            // ui.same_line(0.0);
-                            // if ui.small_button(im_str!("add to pattern")) {
-                            //     active_pattern.sounds[pattern_row][pattern_col] = Some(s.clone());
-                            // }
-                            if ui.small_button(im_str!("load")) {
-                                active_sound = Some(s.clone());
-                            }
-                            ui.same_line(0.0);
-                            if ui.small_button(im_str!("play")) {
-                                s.play(&dev, bpm);
-                            }
-                        });
-                    }
                 });
-            });
 
+        // PATTERN LOAD WINDOW
         Window::new(im_str!("patterns"))
-            // .resizable(false)
-            .position([400.0, 140.0], Condition::Appearing)
-            .collapsible(true)
-            .size([300.0, 300.0], Condition::FirstUseEver)
+            .position([800.0, 500.0], Condition::Appearing)
+            .size([200.0, 300.0], Condition::FirstUseEver)
             .build(ui, || {
                 ui.tree_node(im_str!("patterns"))
                 .opened(true, Condition::Appearing)
@@ -147,9 +218,10 @@ fn main() {
                 });
             });
 
-        // PATTERN WINDOW ====================================
+        // PATTERN EDIT WINDOW ====================================
         Window::new(im_str!("pattern"))
-            .size([300.0, 100.0], Condition::FirstUseEver)
+            .size([800.0, 400.0], Condition::FirstUseEver)
+            .position([0.0, 255.0], Condition::Appearing)
             .build(ui, || {
                 let button_size: f32 = 32.0;
 
@@ -220,7 +292,8 @@ fn main() {
                             match &active_sound {
                                 Some(snd) => {
                                     snd.play_detached(&dev, bpm);    
-                                    active_pattern.insert_sound(&(x,y),  &snd)
+                                    // active_pattern.insert_sound(&(x,y),  &snd.updated_from_source().unwrap())
+                                    active_pattern.insert_sound(&(x,y),  &snd.cloned())
                                 },
                                 None => active_pattern.remove_sound(&(x,y))
                             }
@@ -253,7 +326,8 @@ fn main() {
             });
     
             Window::new(im_str!("sound"))
-            .size([300.0, 100.0], Condition::FirstUseEver)
+            .size([500.0, 255.0], Condition::FirstUseEver)
+            .position([0.0, 0.0], Condition::Appearing)
             .build(ui, || {
 
                 // let w = ui.current_column_width()*2.0/3.0 + 2.0;
@@ -318,6 +392,8 @@ fn main() {
 
             Window::new(im_str!("tracks"))
             .size([300.0, 100.0], Condition::FirstUseEver)
+            .position([0.0, 650.0], Condition::Appearing)
+
             .build(ui, || {
 
                 ui.drag_int(im_str!("BPM"), &mut bpm)