@pinkpixel/haku 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +151 -2
  2. package/dist/LICENSE +202 -0
  3. package/dist/cli.mjs +168 -0
  4. package/dist/fonts/Figtree-Regular.ttf +0 -0
  5. package/dist/fonts/Figtree-SemiBold.ttf +0 -0
  6. package/dist/fonts/OFL.txt +93 -0
  7. package/dist/mcp-DG9U-P0N.mjs +72 -0
  8. package/dist/node-CVxAljK8.mjs +24 -0
  9. package/dist/samples/ambience/rain_roof.ogg +0 -0
  10. package/dist/samples/ambience/rain_window.ogg +0 -0
  11. package/dist/samples/drums/brush_v0_r1.ogg +0 -0
  12. package/dist/samples/drums/brush_v0_r2.ogg +0 -0
  13. package/dist/samples/drums/brush_v1_r1.ogg +0 -0
  14. package/dist/samples/drums/brush_v1_r2.ogg +0 -0
  15. package/dist/samples/drums/brushhat_v0_r1.ogg +0 -0
  16. package/dist/samples/drums/brushhat_v0_r2.ogg +0 -0
  17. package/dist/samples/drums/brushhat_v1_r1.ogg +0 -0
  18. package/dist/samples/drums/brushhat_v1_r2.ogg +0 -0
  19. package/dist/samples/drums/hat_v0_r1.ogg +0 -0
  20. package/dist/samples/drums/hat_v0_r2.ogg +0 -0
  21. package/dist/samples/drums/hat_v1_r1.ogg +0 -0
  22. package/dist/samples/drums/hat_v1_r2.ogg +0 -0
  23. package/dist/samples/drums/kick_v0_r1.ogg +0 -0
  24. package/dist/samples/drums/kick_v0_r2.ogg +0 -0
  25. package/dist/samples/drums/kick_v1_r1.ogg +0 -0
  26. package/dist/samples/drums/kick_v1_r2.ogg +0 -0
  27. package/dist/samples/drums/openhat_v0_r1.ogg +0 -0
  28. package/dist/samples/drums/openhat_v0_r2.ogg +0 -0
  29. package/dist/samples/drums/openhat_v1_r1.ogg +0 -0
  30. package/dist/samples/drums/openhat_v1_r2.ogg +0 -0
  31. package/dist/samples/drums/ride_v0_r1.ogg +0 -0
  32. package/dist/samples/drums/ride_v0_r2.ogg +0 -0
  33. package/dist/samples/drums/ride_v1_r1.ogg +0 -0
  34. package/dist/samples/drums/ride_v1_r2.ogg +0 -0
  35. package/dist/samples/drums/rim_v0_r1.ogg +0 -0
  36. package/dist/samples/drums/rim_v0_r2.ogg +0 -0
  37. package/dist/samples/drums/rim_v1_r1.ogg +0 -0
  38. package/dist/samples/drums/rim_v1_r2.ogg +0 -0
  39. package/dist/samples/drums/snare_v0_r1.ogg +0 -0
  40. package/dist/samples/drums/snare_v0_r2.ogg +0 -0
  41. package/dist/samples/drums/snare_v1_r1.ogg +0 -0
  42. package/dist/samples/drums/snare_v1_r2.ogg +0 -0
  43. package/dist/samples/drums/tom_v0_r1.ogg +0 -0
  44. package/dist/samples/drums/tom_v0_r2.ogg +0 -0
  45. package/dist/samples/drums/tom_v1_r1.ogg +0 -0
  46. package/dist/samples/drums/tom_v1_r2.ogg +0 -0
  47. package/dist/samples/glock/v0_103.ogg +0 -0
  48. package/dist/samples/glock/v0_108.ogg +0 -0
  49. package/dist/samples/glock/v0_79.ogg +0 -0
  50. package/dist/samples/glock/v0_84.ogg +0 -0
  51. package/dist/samples/glock/v0_91.ogg +0 -0
  52. package/dist/samples/glock/v0_96.ogg +0 -0
  53. package/dist/samples/harp/v0_101.ogg +0 -0
  54. package/dist/samples/harp/v0_28.ogg +0 -0
  55. package/dist/samples/harp/v0_31.ogg +0 -0
  56. package/dist/samples/harp/v0_35.ogg +0 -0
  57. package/dist/samples/harp/v0_38.ogg +0 -0
  58. package/dist/samples/harp/v0_41.ogg +0 -0
  59. package/dist/samples/harp/v0_45.ogg +0 -0
  60. package/dist/samples/harp/v0_48.ogg +0 -0
  61. package/dist/samples/harp/v0_52.ogg +0 -0
  62. package/dist/samples/harp/v0_55.ogg +0 -0
  63. package/dist/samples/harp/v0_59.ogg +0 -0
  64. package/dist/samples/harp/v0_62.ogg +0 -0
  65. package/dist/samples/harp/v0_65.ogg +0 -0
  66. package/dist/samples/harp/v0_69.ogg +0 -0
  67. package/dist/samples/harp/v0_72.ogg +0 -0
  68. package/dist/samples/harp/v0_76.ogg +0 -0
  69. package/dist/samples/harp/v0_79.ogg +0 -0
  70. package/dist/samples/harp/v0_83.ogg +0 -0
  71. package/dist/samples/harp/v0_86.ogg +0 -0
  72. package/dist/samples/harp/v0_89.ogg +0 -0
  73. package/dist/samples/harp/v0_93.ogg +0 -0
  74. package/dist/samples/harp/v0_95.ogg +0 -0
  75. package/dist/samples/harp/v0_98.ogg +0 -0
  76. package/dist/samples/manifest.json +368 -0
  77. package/dist/samples/marimba/v0_41.ogg +0 -0
  78. package/dist/samples/marimba/v0_48.ogg +0 -0
  79. package/dist/samples/marimba/v0_55.ogg +0 -0
  80. package/dist/samples/marimba/v0_59.ogg +0 -0
  81. package/dist/samples/marimba/v0_65.ogg +0 -0
  82. package/dist/samples/marimba/v0_72.ogg +0 -0
  83. package/dist/samples/marimba/v0_79.ogg +0 -0
  84. package/dist/samples/marimba/v0_83.ogg +0 -0
  85. package/dist/samples/marimba/v0_89.ogg +0 -0
  86. package/dist/samples/marimba/v0_96.ogg +0 -0
  87. package/dist/samples/piano/v0_29.ogg +0 -0
  88. package/dist/samples/piano/v0_33.ogg +0 -0
  89. package/dist/samples/piano/v0_37.ogg +0 -0
  90. package/dist/samples/piano/v0_41.ogg +0 -0
  91. package/dist/samples/piano/v0_45.ogg +0 -0
  92. package/dist/samples/piano/v0_49.ogg +0 -0
  93. package/dist/samples/piano/v0_53.ogg +0 -0
  94. package/dist/samples/piano/v0_57.ogg +0 -0
  95. package/dist/samples/piano/v0_61.ogg +0 -0
  96. package/dist/samples/piano/v0_65.ogg +0 -0
  97. package/dist/samples/piano/v0_69.ogg +0 -0
  98. package/dist/samples/piano/v0_73.ogg +0 -0
  99. package/dist/samples/piano/v0_77.ogg +0 -0
  100. package/dist/samples/piano/v0_81.ogg +0 -0
  101. package/dist/samples/piano/v0_85.ogg +0 -0
  102. package/dist/samples/piano/v0_89.ogg +0 -0
  103. package/dist/samples/piano/v0_93.ogg +0 -0
  104. package/dist/samples/piano/v0_97.ogg +0 -0
  105. package/dist/samples/piano/v1_29.ogg +0 -0
  106. package/dist/samples/piano/v1_33.ogg +0 -0
  107. package/dist/samples/piano/v1_37.ogg +0 -0
  108. package/dist/samples/piano/v1_41.ogg +0 -0
  109. package/dist/samples/piano/v1_45.ogg +0 -0
  110. package/dist/samples/piano/v1_49.ogg +0 -0
  111. package/dist/samples/piano/v1_53.ogg +0 -0
  112. package/dist/samples/piano/v1_57.ogg +0 -0
  113. package/dist/samples/piano/v1_61.ogg +0 -0
  114. package/dist/samples/piano/v1_65.ogg +0 -0
  115. package/dist/samples/piano/v1_69.ogg +0 -0
  116. package/dist/samples/piano/v1_73.ogg +0 -0
  117. package/dist/samples/piano/v1_77.ogg +0 -0
  118. package/dist/samples/piano/v1_81.ogg +0 -0
  119. package/dist/samples/piano/v1_85.ogg +0 -0
  120. package/dist/samples/piano/v1_89.ogg +0 -0
  121. package/dist/samples/piano/v1_93.ogg +0 -0
  122. package/dist/samples/piano/v1_97.ogg +0 -0
  123. package/dist/samples/wurli/v0_33.ogg +0 -0
  124. package/dist/samples/wurli/v0_40.ogg +0 -0
  125. package/dist/samples/wurli/v0_45.ogg +0 -0
  126. package/dist/samples/wurli/v0_51.ogg +0 -0
  127. package/dist/samples/wurli/v0_56.ogg +0 -0
  128. package/dist/samples/wurli/v0_61.ogg +0 -0
  129. package/dist/samples/wurli/v0_66.ogg +0 -0
  130. package/dist/samples/wurli/v0_71.ogg +0 -0
  131. package/dist/samples/wurli/v0_73.ogg +0 -0
  132. package/dist/samples/wurli/v0_79.ogg +0 -0
  133. package/dist/samples/wurli/v0_85.ogg +0 -0
  134. package/dist/samples/wurli/v0_92.ogg +0 -0
  135. package/dist/samples/wurli/v1_33.ogg +0 -0
  136. package/dist/samples/wurli/v1_36.ogg +0 -0
  137. package/dist/samples/wurli/v1_41.ogg +0 -0
  138. package/dist/samples/wurli/v1_47.ogg +0 -0
  139. package/dist/samples/wurli/v1_52.ogg +0 -0
  140. package/dist/samples/wurli/v1_56.ogg +0 -0
  141. package/dist/samples/wurli/v1_61.ogg +0 -0
  142. package/dist/samples/wurli/v1_68.ogg +0 -0
  143. package/dist/samples/wurli/v1_73.ogg +0 -0
  144. package/dist/samples/wurli/v1_79.ogg +0 -0
  145. package/dist/samples/wurli/v1_85.ogg +0 -0
  146. package/dist/samples/wurli/v1_92.ogg +0 -0
  147. package/dist/src-CgZeiBJc.mjs +711 -0
  148. package/dist/src-dP0jXhPP.mjs +2322 -0
  149. package/dist/tools-_xkF2Yfv.mjs +1891 -0
  150. package/dist/web/assets/figtree-latin-ext-wght-normal-DCwSJGxG.woff2 +0 -0
  151. package/dist/web/assets/figtree-latin-wght-normal-D_ZTVpCC.woff2 +0 -0
  152. package/dist/web/assets/fraunces-latin-ext-wght-normal-Ca2vKHc0.woff2 +0 -0
  153. package/dist/web/assets/fraunces-latin-wght-normal-ukD16Tqj.woff2 +0 -0
  154. package/dist/web/assets/fraunces-vietnamese-wght-normal-CnvboYUG.woff2 +0 -0
  155. package/dist/web/assets/index-BmW6jd5Q.js +272 -0
  156. package/dist/web/assets/index-C7U7z4um.css +1 -0
  157. package/dist/web/icon-192.png +0 -0
  158. package/dist/web/icon-512.png +0 -0
  159. package/dist/web/index.html +18 -0
  160. package/dist/web/manifest.webmanifest +24 -0
  161. package/dist/web/sw.js +37 -0
  162. package/package.json +59 -3
@@ -0,0 +1,72 @@
1
+ import { c as Player, f as SharedLink, l as GUIDE, s as VERSION, t as TOOLS } from "./tools-_xkF2Yfv.mjs";
2
+ import { McpServer } from "@modelcontextprotocol/server";
3
+ import { serveStdio } from "@modelcontextprotocol/server/stdio";
4
+ // src/mcp.ts
5
+ async function startMcp() {
6
+ console.log = console.error;
7
+ console.info = console.error;
8
+ const link = new SharedLink();
9
+ try {
10
+ await link.ensure();
11
+ console.error(link.hosting ? "Haku bridge listening, waiting for a tab" : "Joined the Haku bridge that was already running");
12
+ } catch (err) {
13
+ console.error(`Haku bridge unavailable: ${err instanceof Error ? err.message : String(err)}. File tools still work.`);
14
+ }
15
+ const player = new Player();
16
+ const ctx = {
17
+ link: () => link.ensure().catch(() => null),
18
+ player,
19
+ waitForPlayback: false,
20
+ cwd: process.cwd(),
21
+ autoLaunch: !process.env.HAKU_NO_LAUNCH
22
+ };
23
+ const handle = serveStdio(() => {
24
+ const server = new McpServer({
25
+ name: "haku",
26
+ version: VERSION
27
+ }, { instructions: GUIDE });
28
+ for (const tool of TOOLS) server.registerTool(tool.name, {
29
+ title: tool.title,
30
+ description: tool.description,
31
+ inputSchema: tool.input,
32
+ annotations: {
33
+ readOnlyHint: tool.readOnly ?? false,
34
+ destructiveHint: tool.destructive ?? false
35
+ }
36
+ }, async (args) => {
37
+ try {
38
+ const result = await tool.run(args, ctx);
39
+ const content = [{
40
+ type: "text",
41
+ text: result.text
42
+ }];
43
+ if (result.image) content.push({
44
+ type: "image",
45
+ data: result.image.data.toString("base64"),
46
+ mimeType: result.image.mimeType
47
+ });
48
+ return { content };
49
+ } catch (err) {
50
+ return {
51
+ content: [{
52
+ type: "text",
53
+ text: err instanceof Error ? err.message : String(err)
54
+ }],
55
+ isError: true
56
+ };
57
+ }
58
+ });
59
+ server.server.onclose = () => {
60
+ player.stop();
61
+ link.close().then(() => process.exit(0));
62
+ };
63
+ return server;
64
+ });
65
+ const shutdown = () => {
66
+ player.stop();
67
+ Promise.all([handle.close(), link.close()]).finally(() => process.exit(0));
68
+ };
69
+ process.once("SIGINT", shutdown);
70
+ process.once("SIGTERM", shutdown);
71
+ }
72
+ export { startMcp };
@@ -0,0 +1,24 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import * as nwa from "node-web-audio-api";
4
+ // ../../packages/audio/src/node.ts
5
+ /** Puts the Web Audio classes Tone needs on globalThis. Leaves out AudioContext on purpose. */
6
+ function setupNodeAudio() {
7
+ const g = globalThis;
8
+ for (const [k, v] of Object.entries(nwa)) if (k !== "AudioContext" && !(k in g)) g[k] = v;
9
+ g.window ??= globalThis;
10
+ g.TONE_SILENCE_LOGGING = true;
11
+ }
12
+ async function readManifest(dir) {
13
+ return JSON.parse(await readFile(join(dir, "manifest.json"), "utf8"));
14
+ }
15
+ /** Decodes sample files from a directory. Node's fetch can't read file:// URLs, so this reads them directly. */
16
+ function nodeDecoder(dir) {
17
+ const ctx = new nwa.OfflineAudioContext(2, 1, 44100);
18
+ return async (path) => {
19
+ const bytes = await readFile(join(dir, path));
20
+ const ab = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
21
+ return await ctx.decodeAudioData(ab);
22
+ };
23
+ }
24
+ export { nodeDecoder, readManifest, setupNodeAudio };
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,368 @@
1
+ {
2
+ "version": 1,
3
+ "instruments": {
4
+ "piano": {
5
+ "credit": {
6
+ "name": "Upright Piano (VSCO 2 CE)",
7
+ "author": "Simon Dalzell of Ivy Audio, via Versilian Studios",
8
+ "license": "CC0-1.0",
9
+ "url": "https://github.com/sgossner/VSCO-2-CE"
10
+ },
11
+ "release": 1.2,
12
+ "layers": [
13
+ {
14
+ "maxVelocity": 0.55,
15
+ "zones": {
16
+ "29": "piano/v0_29.ogg",
17
+ "33": "piano/v0_33.ogg",
18
+ "37": "piano/v0_37.ogg",
19
+ "41": "piano/v0_41.ogg",
20
+ "45": "piano/v0_45.ogg",
21
+ "49": "piano/v0_49.ogg",
22
+ "53": "piano/v0_53.ogg",
23
+ "57": "piano/v0_57.ogg",
24
+ "61": "piano/v0_61.ogg",
25
+ "65": "piano/v0_65.ogg",
26
+ "69": "piano/v0_69.ogg",
27
+ "73": "piano/v0_73.ogg",
28
+ "77": "piano/v0_77.ogg",
29
+ "81": "piano/v0_81.ogg",
30
+ "85": "piano/v0_85.ogg",
31
+ "89": "piano/v0_89.ogg",
32
+ "93": "piano/v0_93.ogg",
33
+ "97": "piano/v0_97.ogg"
34
+ }
35
+ },
36
+ {
37
+ "maxVelocity": 1,
38
+ "zones": {
39
+ "29": "piano/v1_29.ogg",
40
+ "33": "piano/v1_33.ogg",
41
+ "37": "piano/v1_37.ogg",
42
+ "41": "piano/v1_41.ogg",
43
+ "45": "piano/v1_45.ogg",
44
+ "49": "piano/v1_49.ogg",
45
+ "53": "piano/v1_53.ogg",
46
+ "57": "piano/v1_57.ogg",
47
+ "61": "piano/v1_61.ogg",
48
+ "65": "piano/v1_65.ogg",
49
+ "69": "piano/v1_69.ogg",
50
+ "73": "piano/v1_73.ogg",
51
+ "77": "piano/v1_77.ogg",
52
+ "81": "piano/v1_81.ogg",
53
+ "85": "piano/v1_85.ogg",
54
+ "89": "piano/v1_89.ogg",
55
+ "93": "piano/v1_93.ogg",
56
+ "97": "piano/v1_97.ogg"
57
+ }
58
+ }
59
+ ]
60
+ },
61
+ "wurli": {
62
+ "credit": {
63
+ "name": "Wurlitzer EP200",
64
+ "author": "Greg Sullivan, sfz mapping by kinwie",
65
+ "license": "CC-BY-3.0",
66
+ "url": "https://github.com/sfzinstruments/GregSullivan.E-Pianos"
67
+ },
68
+ "release": 0.6,
69
+ "layers": [
70
+ {
71
+ "maxVelocity": 0.6,
72
+ "zones": {
73
+ "33": "wurli/v0_33.ogg",
74
+ "40": "wurli/v0_40.ogg",
75
+ "45": "wurli/v0_45.ogg",
76
+ "51": "wurli/v0_51.ogg",
77
+ "56": "wurli/v0_56.ogg",
78
+ "61": "wurli/v0_61.ogg",
79
+ "66": "wurli/v0_66.ogg",
80
+ "71": "wurli/v0_71.ogg",
81
+ "73": "wurli/v0_73.ogg",
82
+ "79": "wurli/v0_79.ogg",
83
+ "85": "wurli/v0_85.ogg",
84
+ "92": "wurli/v0_92.ogg"
85
+ }
86
+ },
87
+ {
88
+ "maxVelocity": 1,
89
+ "zones": {
90
+ "33": "wurli/v1_33.ogg",
91
+ "36": "wurli/v1_36.ogg",
92
+ "41": "wurli/v1_41.ogg",
93
+ "47": "wurli/v1_47.ogg",
94
+ "52": "wurli/v1_52.ogg",
95
+ "56": "wurli/v1_56.ogg",
96
+ "61": "wurli/v1_61.ogg",
97
+ "68": "wurli/v1_68.ogg",
98
+ "73": "wurli/v1_73.ogg",
99
+ "79": "wurli/v1_79.ogg",
100
+ "85": "wurli/v1_85.ogg",
101
+ "92": "wurli/v1_92.ogg"
102
+ }
103
+ }
104
+ ]
105
+ },
106
+ "glock": {
107
+ "credit": {
108
+ "name": "Glockenspiel (VSCO 2 CE)",
109
+ "author": "Versilian Studios",
110
+ "license": "CC0-1.0",
111
+ "url": "https://github.com/sgossner/VSCO-2-CE"
112
+ },
113
+ "release": 1.5,
114
+ "layers": [
115
+ {
116
+ "maxVelocity": 1,
117
+ "zones": {
118
+ "79": "glock/v0_79.ogg",
119
+ "84": "glock/v0_84.ogg",
120
+ "91": "glock/v0_91.ogg",
121
+ "96": "glock/v0_96.ogg",
122
+ "103": "glock/v0_103.ogg",
123
+ "108": "glock/v0_108.ogg"
124
+ }
125
+ }
126
+ ]
127
+ },
128
+ "marimba": {
129
+ "credit": {
130
+ "name": "Marimba (VSCO 2 CE)",
131
+ "author": "Versilian Studios",
132
+ "license": "CC0-1.0",
133
+ "url": "https://github.com/sgossner/VSCO-2-CE"
134
+ },
135
+ "release": 0.8,
136
+ "layers": [
137
+ {
138
+ "maxVelocity": 1,
139
+ "zones": {
140
+ "41": "marimba/v0_41.ogg",
141
+ "48": "marimba/v0_48.ogg",
142
+ "55": "marimba/v0_55.ogg",
143
+ "59": "marimba/v0_59.ogg",
144
+ "65": "marimba/v0_65.ogg",
145
+ "72": "marimba/v0_72.ogg",
146
+ "79": "marimba/v0_79.ogg",
147
+ "83": "marimba/v0_83.ogg",
148
+ "89": "marimba/v0_89.ogg",
149
+ "96": "marimba/v0_96.ogg"
150
+ }
151
+ }
152
+ ]
153
+ },
154
+ "harp": {
155
+ "credit": {
156
+ "name": "Harp (VSCO 2 CE)",
157
+ "author": "Versilian Studios",
158
+ "license": "CC0-1.0",
159
+ "url": "https://github.com/sgossner/VSCO-2-CE"
160
+ },
161
+ "release": 1.5,
162
+ "layers": [
163
+ {
164
+ "maxVelocity": 1,
165
+ "zones": {
166
+ "28": "harp/v0_28.ogg",
167
+ "31": "harp/v0_31.ogg",
168
+ "35": "harp/v0_35.ogg",
169
+ "38": "harp/v0_38.ogg",
170
+ "41": "harp/v0_41.ogg",
171
+ "45": "harp/v0_45.ogg",
172
+ "48": "harp/v0_48.ogg",
173
+ "52": "harp/v0_52.ogg",
174
+ "55": "harp/v0_55.ogg",
175
+ "59": "harp/v0_59.ogg",
176
+ "62": "harp/v0_62.ogg",
177
+ "65": "harp/v0_65.ogg",
178
+ "69": "harp/v0_69.ogg",
179
+ "72": "harp/v0_72.ogg",
180
+ "76": "harp/v0_76.ogg",
181
+ "79": "harp/v0_79.ogg",
182
+ "83": "harp/v0_83.ogg",
183
+ "86": "harp/v0_86.ogg",
184
+ "89": "harp/v0_89.ogg",
185
+ "93": "harp/v0_93.ogg",
186
+ "95": "harp/v0_95.ogg",
187
+ "98": "harp/v0_98.ogg",
188
+ "101": "harp/v0_101.ogg"
189
+ }
190
+ }
191
+ ]
192
+ }
193
+ },
194
+ "drums": {
195
+ "credit": {
196
+ "name": "Big Rusty Drums",
197
+ "author": "Karoryfer Samples",
198
+ "license": "CC0-1.0",
199
+ "url": "https://github.com/sfzinstruments/karoryfer.big-rusty-drums"
200
+ },
201
+ "pieces": {
202
+ "kick": [
203
+ {
204
+ "maxVelocity": 0.6,
205
+ "files": [
206
+ "drums/kick_v0_r1.ogg",
207
+ "drums/kick_v0_r2.ogg"
208
+ ]
209
+ },
210
+ {
211
+ "maxVelocity": 1,
212
+ "files": [
213
+ "drums/kick_v1_r1.ogg",
214
+ "drums/kick_v1_r2.ogg"
215
+ ]
216
+ }
217
+ ],
218
+ "snare": [
219
+ {
220
+ "maxVelocity": 0.6,
221
+ "files": [
222
+ "drums/snare_v0_r1.ogg",
223
+ "drums/snare_v0_r2.ogg"
224
+ ]
225
+ },
226
+ {
227
+ "maxVelocity": 1,
228
+ "files": [
229
+ "drums/snare_v1_r1.ogg",
230
+ "drums/snare_v1_r2.ogg"
231
+ ]
232
+ }
233
+ ],
234
+ "brush": [
235
+ {
236
+ "maxVelocity": 0.6,
237
+ "files": [
238
+ "drums/brush_v0_r1.ogg",
239
+ "drums/brush_v0_r2.ogg"
240
+ ]
241
+ },
242
+ {
243
+ "maxVelocity": 1,
244
+ "files": [
245
+ "drums/brush_v1_r1.ogg",
246
+ "drums/brush_v1_r2.ogg"
247
+ ]
248
+ }
249
+ ],
250
+ "rim": [
251
+ {
252
+ "maxVelocity": 0.6,
253
+ "files": [
254
+ "drums/rim_v0_r1.ogg",
255
+ "drums/rim_v0_r2.ogg"
256
+ ]
257
+ },
258
+ {
259
+ "maxVelocity": 1,
260
+ "files": [
261
+ "drums/rim_v1_r1.ogg",
262
+ "drums/rim_v1_r2.ogg"
263
+ ]
264
+ }
265
+ ],
266
+ "hat": [
267
+ {
268
+ "maxVelocity": 0.6,
269
+ "files": [
270
+ "drums/hat_v0_r1.ogg",
271
+ "drums/hat_v0_r2.ogg"
272
+ ]
273
+ },
274
+ {
275
+ "maxVelocity": 1,
276
+ "files": [
277
+ "drums/hat_v1_r1.ogg",
278
+ "drums/hat_v1_r2.ogg"
279
+ ]
280
+ }
281
+ ],
282
+ "brushhat": [
283
+ {
284
+ "maxVelocity": 0.6,
285
+ "files": [
286
+ "drums/brushhat_v0_r1.ogg",
287
+ "drums/brushhat_v0_r2.ogg"
288
+ ]
289
+ },
290
+ {
291
+ "maxVelocity": 1,
292
+ "files": [
293
+ "drums/brushhat_v1_r1.ogg",
294
+ "drums/brushhat_v1_r2.ogg"
295
+ ]
296
+ }
297
+ ],
298
+ "openhat": [
299
+ {
300
+ "maxVelocity": 0.6,
301
+ "files": [
302
+ "drums/openhat_v0_r1.ogg",
303
+ "drums/openhat_v0_r2.ogg"
304
+ ]
305
+ },
306
+ {
307
+ "maxVelocity": 1,
308
+ "files": [
309
+ "drums/openhat_v1_r1.ogg",
310
+ "drums/openhat_v1_r2.ogg"
311
+ ]
312
+ }
313
+ ],
314
+ "ride": [
315
+ {
316
+ "maxVelocity": 0.6,
317
+ "files": [
318
+ "drums/ride_v0_r1.ogg",
319
+ "drums/ride_v0_r2.ogg"
320
+ ]
321
+ },
322
+ {
323
+ "maxVelocity": 1,
324
+ "files": [
325
+ "drums/ride_v1_r1.ogg",
326
+ "drums/ride_v1_r2.ogg"
327
+ ]
328
+ }
329
+ ],
330
+ "tom": [
331
+ {
332
+ "maxVelocity": 0.6,
333
+ "files": [
334
+ "drums/tom_v0_r1.ogg",
335
+ "drums/tom_v0_r2.ogg"
336
+ ]
337
+ },
338
+ {
339
+ "maxVelocity": 1,
340
+ "files": [
341
+ "drums/tom_v1_r1.ogg",
342
+ "drums/tom_v1_r2.ogg"
343
+ ]
344
+ }
345
+ ]
346
+ }
347
+ },
348
+ "ambience": {
349
+ "rain_roof": {
350
+ "file": "ambience/rain_roof.ogg",
351
+ "credit": {
352
+ "name": "Soft rain on roof window",
353
+ "author": "Metadex",
354
+ "license": "CC0-1.0",
355
+ "url": "https://freesound.org/people/Metadex/sounds/235827/"
356
+ }
357
+ },
358
+ "rain_window": {
359
+ "file": "ambience/rain_window.ogg",
360
+ "credit": {
361
+ "name": "January rain on a window",
362
+ "author": "mmorgaine",
363
+ "license": "CC0-1.0",
364
+ "url": "https://freesound.org/people/mmorgaine/sounds/333510/"
365
+ }
366
+ }
367
+ }
368
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file