ismail 0.4.0__tar.gz

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 (468) hide show
  1. ismail-0.4.0/LICENSE +21 -0
  2. ismail-0.4.0/MANIFEST.in +5 -0
  3. ismail-0.4.0/PKG-INFO +323 -0
  4. ismail-0.4.0/README.md +268 -0
  5. ismail-0.4.0/ismail/__init__.py +1 -0
  6. ismail-0.4.0/ismail/__main__.py +119 -0
  7. ismail-0.4.0/ismail/analysis.py +2252 -0
  8. ismail-0.4.0/ismail/api.py +2594 -0
  9. ismail-0.4.0/ismail/api_clash.py +257 -0
  10. ismail-0.4.0/ismail/api_cmp.py +507 -0
  11. ismail-0.4.0/ismail/api_compress.py +378 -0
  12. ismail-0.4.0/ismail/api_exam.py +112 -0
  13. ismail-0.4.0/ismail/api_feedback.py +747 -0
  14. ismail-0.4.0/ismail/api_freeze.py +143 -0
  15. ismail-0.4.0/ismail/api_fxstack.py +249 -0
  16. ismail-0.4.0/ismail/api_guards.py +167 -0
  17. ismail-0.4.0/ismail/api_kit.py +28 -0
  18. ismail-0.4.0/ismail/api_listen.py +449 -0
  19. ismail-0.4.0/ismail/api_measure.py +763 -0
  20. ismail-0.4.0/ismail/api_melody.py +193 -0
  21. ismail-0.4.0/ismail/api_midi.py +302 -0
  22. ismail-0.4.0/ismail/api_ops.py +226 -0
  23. ismail-0.4.0/ismail/api_sound.py +786 -0
  24. ismail-0.4.0/ismail/api_tells.py +663 -0
  25. ismail-0.4.0/ismail/api_zoom.py +237 -0
  26. ismail-0.4.0/ismail/audiofile.py +46 -0
  27. ismail-0.4.0/ismail/backup.py +159 -0
  28. ismail-0.4.0/ismail/capture.py +71 -0
  29. ismail-0.4.0/ismail/cmp.py +512 -0
  30. ismail-0.4.0/ismail/dsp.py +376 -0
  31. ismail-0.4.0/ismail/exam_check.py +618 -0
  32. ismail-0.4.0/ismail/exampage/__init__.py +404 -0
  33. ismail-0.4.0/ismail/exampage/__main__.py +5 -0
  34. ismail-0.4.0/ismail/exampage/words.html +352 -0
  35. ismail-0.4.0/ismail/features.py +189 -0
  36. ismail-0.4.0/ismail/feedback/__init__.py +936 -0
  37. ismail-0.4.0/ismail/feedback/__main__.py +5 -0
  38. ismail-0.4.0/ismail/feedback/measure.py +111 -0
  39. ismail-0.4.0/ismail/feedback/page.html +752 -0
  40. ismail-0.4.0/ismail/feedback/parts.py +157 -0
  41. ismail-0.4.0/ismail/fx.py +487 -0
  42. ismail-0.4.0/ismail/guards.py +529 -0
  43. ismail-0.4.0/ismail/guide.py +279 -0
  44. ismail-0.4.0/ismail/handoffs.py +312 -0
  45. ismail-0.4.0/ismail/instruments.py +844 -0
  46. ismail-0.4.0/ismail/kit.py +464 -0
  47. ismail-0.4.0/ismail/kit_tables.json +810 -0
  48. ismail-0.4.0/ismail/lexicon.py +228 -0
  49. ismail-0.4.0/ismail/listen.py +1434 -0
  50. ismail-0.4.0/ismail/live/__init__.py +19 -0
  51. ismail-0.4.0/ismail/live/cost.py +156 -0
  52. ismail-0.4.0/ismail/live/decks.py +349 -0
  53. ismail-0.4.0/ismail/live/djkit.py +291 -0
  54. ismail-0.4.0/ismail/live/dsp_blocks.py +304 -0
  55. ismail-0.4.0/ismail/live/engine.py +3161 -0
  56. ismail-0.4.0/ismail/live/fx_blocks.py +676 -0
  57. ismail-0.4.0/ismail/live/graph.py +267 -0
  58. ismail-0.4.0/ismail/live/midi_out.py +439 -0
  59. ismail-0.4.0/ismail/live/midi_play.py +654 -0
  60. ismail-0.4.0/ismail/live/ops.py +840 -0
  61. ismail-0.4.0/ismail/live/outputs.py +205 -0
  62. ismail-0.4.0/ismail/live/parity.py +248 -0
  63. ismail-0.4.0/ismail/live/rig_blocks.py +378 -0
  64. ismail-0.4.0/ismail/live/safety.py +118 -0
  65. ismail-0.4.0/ismail/live/spatial_blocks.py +34 -0
  66. ismail-0.4.0/ismail/live/timeline.py +253 -0
  67. ismail-0.4.0/ismail/live/worker.py +218 -0
  68. ismail-0.4.0/ismail/machine.py +2268 -0
  69. ismail-0.4.0/ismail/master.py +157 -0
  70. ismail-0.4.0/ismail/mcp_server.py +154 -0
  71. ismail-0.4.0/ismail/midi.py +224 -0
  72. ismail-0.4.0/ismail/midifile.py +162 -0
  73. ismail-0.4.0/ismail/midisend.py +211 -0
  74. ismail-0.4.0/ismail/mimic.py +1135 -0
  75. ismail-0.4.0/ismail/mimic_perform.py +560 -0
  76. ismail-0.4.0/ismail/notation.py +187 -0
  77. ismail-0.4.0/ismail/perceptual.py +76 -0
  78. ismail-0.4.0/ismail/phone/__init__.py +8 -0
  79. ismail-0.4.0/ismail/phone/beatbox.py +154 -0
  80. ismail-0.4.0/ismail/phone/hum.py +98 -0
  81. ismail-0.4.0/ismail/phone/make_icons.py +46 -0
  82. ismail-0.4.0/ismail/phone/ops.py +841 -0
  83. ismail-0.4.0/ismail/phone/page/app.js +1272 -0
  84. ismail-0.4.0/ismail/phone/page/apple-touch-icon.png +0 -0
  85. ismail-0.4.0/ismail/phone/page/cues/end.mp3 +0 -0
  86. ismail-0.4.0/ismail/phone/page/cues/error.mp3 +0 -0
  87. ismail-0.4.0/ismail/phone/page/cues/sent.mp3 +0 -0
  88. ismail-0.4.0/ismail/phone/page/cues/start.mp3 +0 -0
  89. ismail-0.4.0/ismail/phone/page/icon-192.png +0 -0
  90. ismail-0.4.0/ismail/phone/page/icon-512.png +0 -0
  91. ismail-0.4.0/ismail/phone/page/icon-maskable.png +0 -0
  92. ismail-0.4.0/ismail/phone/page/icon.svg +1 -0
  93. ismail-0.4.0/ismail/phone/page/index.html +266 -0
  94. ismail-0.4.0/ismail/phone/page/keys.html +358 -0
  95. ismail-0.4.0/ismail/phone/page/manifest.webmanifest +19 -0
  96. ismail-0.4.0/ismail/phone/page/sw.js +17 -0
  97. ismail-0.4.0/ismail/phone/server.py +2437 -0
  98. ismail-0.4.0/ismail/phone/vibe.py +217 -0
  99. ismail-0.4.0/ismail/playbook.py +91 -0
  100. ismail-0.4.0/ismail/presets.py +81 -0
  101. ismail-0.4.0/ismail/provenance.py +115 -0
  102. ismail-0.4.0/ismail/reclaim.py +368 -0
  103. ismail-0.4.0/ismail/release.py +600 -0
  104. ismail-0.4.0/ismail/render.py +569 -0
  105. ismail-0.4.0/ismail/replies.py +420 -0
  106. ismail-0.4.0/ismail/rig.py +560 -0
  107. ismail-0.4.0/ismail/samples.py +194 -0
  108. ismail-0.4.0/ismail/separate.py +38 -0
  109. ismail-0.4.0/ismail/sketch.py +1247 -0
  110. ismail-0.4.0/ismail/sounddesign.py +257 -0
  111. ismail-0.4.0/ismail/sources.py +444 -0
  112. ismail-0.4.0/ismail/spatial.py +788 -0
  113. ismail-0.4.0/ismail/speech.py +111 -0
  114. ismail-0.4.0/ismail/stage/__init__.py +0 -0
  115. ismail-0.4.0/ismail/stage/bridge/blender_bridge.py +181 -0
  116. ismail-0.4.0/ismail/stage/bridge/quest.py +151 -0
  117. ismail-0.4.0/ismail/stage/capture.py +210 -0
  118. ismail-0.4.0/ismail/stage/ear.py +127 -0
  119. ismail-0.4.0/ismail/stage/face.py +329 -0
  120. ismail-0.4.0/ismail/stage/gestures.py +227 -0
  121. ismail-0.4.0/ismail/stage/interp.py +116 -0
  122. ismail-0.4.0/ismail/stage/link.py +196 -0
  123. ismail-0.4.0/ismail/stage/loop_take.py +169 -0
  124. ismail-0.4.0/ismail/stage/ops.py +1629 -0
  125. ismail-0.4.0/ismail/stage/ops_page.py +1088 -0
  126. ismail-0.4.0/ismail/stage/page/actions.js +417 -0
  127. ismail-0.4.0/ismail/stage/page/actors.js +1049 -0
  128. ismail-0.4.0/ismail/stage/page/anchor.js +73 -0
  129. ismail-0.4.0/ismail/stage/page/behaviours.js +629 -0
  130. ismail-0.4.0/ismail/stage/page/body.js +75 -0
  131. ismail-0.4.0/ismail/stage/page/build_bundle.mjs +21 -0
  132. ismail-0.4.0/ismail/stage/page/camrec.js +187 -0
  133. ismail-0.4.0/ismail/stage/page/capture.js +186 -0
  134. ismail-0.4.0/ismail/stage/page/clock.js +345 -0
  135. ismail-0.4.0/ismail/stage/page/construct.js +159 -0
  136. ismail-0.4.0/ismail/stage/page/control.js +197 -0
  137. ismail-0.4.0/ismail/stage/page/cues.js +103 -0
  138. ismail-0.4.0/ismail/stage/page/desktop.js +696 -0
  139. ismail-0.4.0/ismail/stage/page/editor.js +1076 -0
  140. ismail-0.4.0/ismail/stage/page/embody.js +114 -0
  141. ismail-0.4.0/ismail/stage/page/exit.js +48 -0
  142. ismail-0.4.0/ismail/stage/page/faces.js +96 -0
  143. ismail-0.4.0/ismail/stage/page/gallery.js +164 -0
  144. ismail-0.4.0/ismail/stage/page/gestures.js +59 -0
  145. ismail-0.4.0/ismail/stage/page/grab.js +494 -0
  146. ismail-0.4.0/ismail/stage/page/hands.js +453 -0
  147. ismail-0.4.0/ismail/stage/page/index.html +266 -0
  148. ismail-0.4.0/ismail/stage/page/interp.js +192 -0
  149. ismail-0.4.0/ismail/stage/page/live.js +651 -0
  150. ismail-0.4.0/ismail/stage/page/loadsets.js +176 -0
  151. ismail-0.4.0/ismail/stage/page/main.js +450 -0
  152. ismail-0.4.0/ismail/stage/page/menugate.js +23 -0
  153. ismail-0.4.0/ismail/stage/page/music.js +54 -0
  154. ismail-0.4.0/ismail/stage/page/onair.js +52 -0
  155. ismail-0.4.0/ismail/stage/page/panels.js +445 -0
  156. ismail-0.4.0/ismail/stage/page/parts.js +130 -0
  157. ismail-0.4.0/ismail/stage/page/perform.js +315 -0
  158. ismail-0.4.0/ismail/stage/page/pickcycle.js +23 -0
  159. ismail-0.4.0/ismail/stage/page/pointer.js +133 -0
  160. ismail-0.4.0/ismail/stage/page/props.js +120 -0
  161. ismail-0.4.0/ismail/stage/page/receipts.js +16 -0
  162. ismail-0.4.0/ismail/stage/page/replay.js +183 -0
  163. ismail-0.4.0/ismail/stage/page/reveal.js +164 -0
  164. ismail-0.4.0/ismail/stage/page/scenes.js +60 -0
  165. ismail-0.4.0/ismail/stage/page/sounds/ack_0.wav +0 -0
  166. ismail-0.4.0/ismail/stage/page/sounds/ack_1.wav +0 -0
  167. ismail-0.4.0/ismail/stage/page/sounds/ack_2.wav +0 -0
  168. ismail-0.4.0/ismail/stage/page/sounds/ack_3.wav +0 -0
  169. ismail-0.4.0/ismail/stage/page/sounds/ack_4.wav +0 -0
  170. ismail-0.4.0/ismail/stage/page/sounds/ack_5.wav +0 -0
  171. ismail-0.4.0/ismail/stage/page/sounds/ack_6.wav +0 -0
  172. ismail-0.4.0/ismail/stage/page/sounds/error.wav +0 -0
  173. ismail-0.4.0/ismail/stage/page/sounds/incoming.wav +0 -0
  174. ismail-0.4.0/ismail/stage/page/sounds/pin_done.wav +0 -0
  175. ismail-0.4.0/ismail/stage/page/sounds/pin_open.wav +0 -0
  176. ismail-0.4.0/ismail/stage/page/sounds/rec_start.wav +0 -0
  177. ismail-0.4.0/ismail/stage/page/sounds/rec_stop.wav +0 -0
  178. ismail-0.4.0/ismail/stage/page/sounds/sent.wav +0 -0
  179. ismail-0.4.0/ismail/stage/page/sounds/shutter_0.wav +0 -0
  180. ismail-0.4.0/ismail/stage/page/sounds/shutter_1.wav +0 -0
  181. ismail-0.4.0/ismail/stage/page/sounds/shutter_2.wav +0 -0
  182. ismail-0.4.0/ismail/stage/page/sounds/shutter_3.wav +0 -0
  183. ismail-0.4.0/ismail/stage/page/sounds/shutter_4.wav +0 -0
  184. ismail-0.4.0/ismail/stage/page/sounds/shutter_5.wav +0 -0
  185. ismail-0.4.0/ismail/stage/page/sounds/shutter_6.wav +0 -0
  186. ismail-0.4.0/ismail/stage/page/sounds/shutter_7.wav +0 -0
  187. ismail-0.4.0/ismail/stage/page/sounds/snap.wav +0 -0
  188. ismail-0.4.0/ismail/stage/page/sounds/take_start.wav +0 -0
  189. ismail-0.4.0/ismail/stage/page/sounds/take_stop.wav +0 -0
  190. ismail-0.4.0/ismail/stage/page/stream.js +139 -0
  191. ismail-0.4.0/ismail/stage/page/surfaces.js +296 -0
  192. ismail-0.4.0/ismail/stage/page/takes4d.js +86 -0
  193. ismail-0.4.0/ismail/stage/page/touch.js +261 -0
  194. ismail-0.4.0/ismail/stage/page/trails.js +174 -0
  195. ismail-0.4.0/ismail/stage/page/trees.js +66 -0
  196. ismail-0.4.0/ismail/stage/page/updates.js +204 -0
  197. ismail-0.4.0/ismail/stage/page/upload.html +54 -0
  198. ismail-0.4.0/ismail/stage/page/vendor/three/LICENSE +21 -0
  199. ismail-0.4.0/ismail/stage/page/vendor/three/build/three.core.js +58773 -0
  200. ismail-0.4.0/ismail/stage/page/vendor/three/build/three.module.js +18251 -0
  201. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/controls/OrbitControls.js +1860 -0
  202. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/controls/TransformControls.js +1918 -0
  203. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/lights/RectAreaLightTexturesLib.js +127 -0
  204. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/lights/RectAreaLightUniformsLib.js +40 -0
  205. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/loaders/GLTFLoader.js +4890 -0
  206. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/utils/BufferGeometryUtils.js +1435 -0
  207. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/utils/SkeletonUtils.js +490 -0
  208. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/webxr/VRButton.js +264 -0
  209. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/webxr/XRHandMeshModel.js +151 -0
  210. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/webxr/XRHandModelFactory.js +201 -0
  211. ismail-0.4.0/ismail/stage/page/vendor/three/examples/jsm/webxr/XRHandPrimitiveModel.js +147 -0
  212. ismail-0.4.0/ismail/stage/page/voice.js +619 -0
  213. ismail-0.4.0/ismail/stage/page/waypoints.js +291 -0
  214. ismail-0.4.0/ismail/stage/page/world.js +20 -0
  215. ismail-0.4.0/ismail/stage/page/xr.js +531 -0
  216. ismail-0.4.0/ismail/stage/perform.py +190 -0
  217. ismail-0.4.0/ismail/stage/preflight.py +608 -0
  218. ismail-0.4.0/ismail/stage/presence.py +360 -0
  219. ismail-0.4.0/ismail/stage/rigs.py +179 -0
  220. ismail-0.4.0/ismail/stage/server.py +1163 -0
  221. ismail-0.4.0/ismail/stage/takes.py +127 -0
  222. ismail-0.4.0/ismail/stage/takesync.py +357 -0
  223. ismail-0.4.0/ismail/stage/world.py +249 -0
  224. ismail-0.4.0/ismail/stream/__init__.py +23 -0
  225. ismail-0.4.0/ismail/stream/__main__.py +28 -0
  226. ismail-0.4.0/ismail/stream/adapters/__init__.py +13 -0
  227. ismail-0.4.0/ismail/stream/adapters/base.py +134 -0
  228. ismail-0.4.0/ismail/stream/adapters/fake.py +44 -0
  229. ismail-0.4.0/ismail/stream/adapters/kick.py +129 -0
  230. ismail-0.4.0/ismail/stream/adapters/owncast.py +57 -0
  231. ismail-0.4.0/ismail/stream/adapters/twitch.py +238 -0
  232. ismail-0.4.0/ismail/stream/adapters/youtube.py +218 -0
  233. ismail-0.4.0/ismail/stream/adapters/youtube_stream.py +97 -0
  234. ismail-0.4.0/ismail/stream/auth.py +211 -0
  235. ismail-0.4.0/ismail/stream/chatlog.py +59 -0
  236. ismail-0.4.0/ismail/stream/config.py +126 -0
  237. ismail-0.4.0/ismail/stream/levels.py +170 -0
  238. ismail-0.4.0/ismail/stream/net.py +47 -0
  239. ismail-0.4.0/ismail/stream/ops.py +440 -0
  240. ismail-0.4.0/ismail/stream/output.py +718 -0
  241. ismail-0.4.0/ismail/stream/page/fake.html +77 -0
  242. ismail-0.4.0/ismail/stream/page/visual.html +195 -0
  243. ismail-0.4.0/ismail/stream/request_queue.py +415 -0
  244. ismail-0.4.0/ismail/stream/scene.py +102 -0
  245. ismail-0.4.0/ismail/stream/server.py +348 -0
  246. ismail-0.4.0/ismail/stream/venue_rules.py +257 -0
  247. ismail-0.4.0/ismail/structure.py +233 -0
  248. ismail-0.4.0/ismail/tags.py +138 -0
  249. ismail-0.4.0/ismail/trackfit.py +114 -0
  250. ismail-0.4.0/ismail/tune.py +134 -0
  251. ismail-0.4.0/ismail/video/__init__.py +60 -0
  252. ismail-0.4.0/ismail/video/__main__.py +197 -0
  253. ismail-0.4.0/ismail/video/blender/dae_import.py +144 -0
  254. ismail-0.4.0/ismail/video/blender/kit.py +996 -0
  255. ismail-0.4.0/ismail/video/dae.py +143 -0
  256. ismail-0.4.0/ismail/video/edit.py +424 -0
  257. ismail-0.4.0/ismail/video/sync.py +103 -0
  258. ismail-0.4.0/ismail/video/templates/config.json +8 -0
  259. ismail-0.4.0/ismail/video/templates/cut.py +23 -0
  260. ismail-0.4.0/ismail/video/templates/plan.md +37 -0
  261. ismail-0.4.0/ismail/video/templates/rigs/example.json +11 -0
  262. ismail-0.4.0/ismail/video/templates/shots/s01_example.py +14 -0
  263. ismail-0.4.0/ismail/voices/__init__.py +244 -0
  264. ismail-0.4.0/ismail/voices/bass/__init__.py +0 -0
  265. ismail-0.4.0/ismail/voices/bass/growl.py +261 -0
  266. ismail-0.4.0/ismail/voices/brass/__init__.py +0 -0
  267. ismail-0.4.0/ismail/voices/brass/horn.mimic.json +1 -0
  268. ismail-0.4.0/ismail/voices/brass/trumpet.py +1045 -0
  269. ismail-0.4.0/ismail/voices/drums/__init__.py +0 -0
  270. ismail-0.4.0/ismail/voices/drums/kit70.py +269 -0
  271. ismail-0.4.0/ismail/voices/drums/rusty.py +130 -0
  272. ismail-0.4.0/ismail/voices/drums/toms.py +587 -0
  273. ismail-0.4.0/ismail/voices/drums/toms_cal.json +1 -0
  274. ismail-0.4.0/ismail/voices/drums/toms_modes.json +134 -0
  275. ismail-0.4.0/ismail/voices/drums/toms_pitch.json +338 -0
  276. ismail-0.4.0/ismail/voices/fx/__init__.py +0 -0
  277. ismail-0.4.0/ismail/voices/fx/crackle.py +48 -0
  278. ismail-0.4.0/ismail/voices/fx/placed_audio.py +90 -0
  279. ismail-0.4.0/ismail/voices/fx/sfx.py +140 -0
  280. ismail-0.4.0/ismail/voices/fx/transitions.py +77 -0
  281. ismail-0.4.0/ismail/voices/fx_stacks.json +31 -0
  282. ismail-0.4.0/ismail/voices/guitar/__init__.py +0 -0
  283. ismail-0.4.0/ismail/voices/guitar/electric.py +414 -0
  284. ismail-0.4.0/ismail/voices/guitar/emily.py +247 -0
  285. ismail-0.4.0/ismail/voices/keys/__init__.py +0 -0
  286. ismail-0.4.0/ismail/voices/keys/additive_piano.py +84 -0
  287. ismail-0.4.0/ismail/voices/keys/grand_piano.json +1837 -0
  288. ismail-0.4.0/ismail/voices/keys/grand_piano.py +179 -0
  289. ismail-0.4.0/ismail/voices/keys/rhodes.py +120 -0
  290. ismail-0.4.0/ismail/voices/showcase.json +438 -0
  291. ismail-0.4.0/ismail/voices/strings/__init__.py +0 -0
  292. ismail-0.4.0/ismail/voices/strings/cello.mimic.json +1 -0
  293. ismail-0.4.0/ismail/voices/strings/contrabass.mimic.json +1 -0
  294. ismail-0.4.0/ismail/voices/strings/violin.mimic.json +1 -0
  295. ismail-0.4.0/ismail/voices/winds/__init__.py +0 -0
  296. ismail-0.4.0/ismail/voices/winds/bassoon.mimic.json +1 -0
  297. ismail-0.4.0/ismail/voices/winds/clarinet.mimic.json +1 -0
  298. ismail-0.4.0/ismail/voices/winds/flute.py +991 -0
  299. ismail-0.4.0/ismail/worktrees.py +672 -0
  300. ismail-0.4.0/ismail/zoom.py +414 -0
  301. ismail-0.4.0/ismail.egg-info/PKG-INFO +323 -0
  302. ismail-0.4.0/ismail.egg-info/SOURCES.txt +466 -0
  303. ismail-0.4.0/ismail.egg-info/dependency_links.txt +1 -0
  304. ismail-0.4.0/ismail.egg-info/entry_points.txt +3 -0
  305. ismail-0.4.0/ismail.egg-info/requires.txt +42 -0
  306. ismail-0.4.0/ismail.egg-info/top_level.txt +1 -0
  307. ismail-0.4.0/pyproject.toml +78 -0
  308. ismail-0.4.0/setup.cfg +4 -0
  309. ismail-0.4.0/setup.py +62 -0
  310. ismail-0.4.0/skills/ismail/SKILL.md +337 -0
  311. ismail-0.4.0/skills/ismail/examples/disco_set.py +113 -0
  312. ismail-0.4.0/skills/ismail/hooks/README.md +50 -0
  313. ismail-0.4.0/skills/ismail/hooks/named_ops_guard.py +422 -0
  314. ismail-0.4.0/skills/ismail/references/blind-tests.md +181 -0
  315. ismail-0.4.0/skills/ismail/references/composition.md +95 -0
  316. ismail-0.4.0/skills/ismail/references/contributing.md +54 -0
  317. ismail-0.4.0/skills/ismail/references/contributor-dev.md +107 -0
  318. ismail-0.4.0/skills/ismail/references/development.md +337 -0
  319. ismail-0.4.0/skills/ismail/references/helpers.md +84 -0
  320. ismail-0.4.0/skills/ismail/references/instruments.md +106 -0
  321. ismail-0.4.0/skills/ismail/references/jam-runner.md +70 -0
  322. ismail-0.4.0/skills/ismail/references/listen-together.md +107 -0
  323. ismail-0.4.0/skills/ismail/references/listening.md +133 -0
  324. ismail-0.4.0/skills/ismail/references/live-streaming.md +143 -0
  325. ismail-0.4.0/skills/ismail/references/live.md +747 -0
  326. ismail-0.4.0/skills/ismail/references/loudness.md +37 -0
  327. ismail-0.4.0/skills/ismail/references/mastering.md +36 -0
  328. ismail-0.4.0/skills/ismail/references/music-video.md +146 -0
  329. ismail-0.4.0/skills/ismail/references/phone.md +377 -0
  330. ismail-0.4.0/skills/ismail/references/recreate.md +174 -0
  331. ismail-0.4.0/skills/ismail/references/rigged-characters.md +250 -0
  332. ismail-0.4.0/skills/ismail/references/setup.md +191 -0
  333. ismail-0.4.0/skills/ismail/references/sound-design.md +102 -0
  334. ismail-0.4.0/skills/ismail/references/stage-dev.md +94 -0
  335. ismail-0.4.0/skills/ismail/references/stage-takes.md +73 -0
  336. ismail-0.4.0/skills/ismail/references/stage.md +512 -0
  337. ismail-0.4.0/skills/ismail/references/user-experience.md +170 -0
  338. ismail-0.4.0/skills/ismail/references/windows.md +49 -0
  339. ismail-0.4.0/skills/ismail/references/worktrees.md +97 -0
  340. ismail-0.4.0/tests/test_analyze_tuning.py +209 -0
  341. ismail-0.4.0/tests/test_api_call.py +13 -0
  342. ismail-0.4.0/tests/test_autotune.py +123 -0
  343. ismail-0.4.0/tests/test_backup.py +117 -0
  344. ismail-0.4.0/tests/test_balance_reply.py +53 -0
  345. ismail-0.4.0/tests/test_beatbox.py +131 -0
  346. ismail-0.4.0/tests/test_capture.py +90 -0
  347. ismail-0.4.0/tests/test_cli_console.py +31 -0
  348. ismail-0.4.0/tests/test_deck_cost.py +90 -0
  349. ismail-0.4.0/tests/test_djkit.py +91 -0
  350. ismail-0.4.0/tests/test_downbeat_harmony.py +141 -0
  351. ismail-0.4.0/tests/test_ear_pass.py +58 -0
  352. ismail-0.4.0/tests/test_exam_check.py +306 -0
  353. ismail-0.4.0/tests/test_exampage.py +186 -0
  354. ismail-0.4.0/tests/test_eye_windows.py +49 -0
  355. ismail-0.4.0/tests/test_feedback.py +689 -0
  356. ismail-0.4.0/tests/test_fit_wait_sub.py +136 -0
  357. ismail-0.4.0/tests/test_flac.py +306 -0
  358. ismail-0.4.0/tests/test_flute_voice.py +137 -0
  359. ismail-0.4.0/tests/test_fresh_clone.py +42 -0
  360. ismail-0.4.0/tests/test_fx_blocks.py +152 -0
  361. ismail-0.4.0/tests/test_fxstack.py +57 -0
  362. ismail-0.4.0/tests/test_grid_drift.py +107 -0
  363. ismail-0.4.0/tests/test_guards.py +513 -0
  364. ismail-0.4.0/tests/test_guide_first_session.py +147 -0
  365. ismail-0.4.0/tests/test_handoffs.py +82 -0
  366. ismail-0.4.0/tests/test_kit.py +116 -0
  367. ismail-0.4.0/tests/test_lexicon.py +90 -0
  368. ismail-0.4.0/tests/test_library_performers.py +101 -0
  369. ismail-0.4.0/tests/test_listen.py +479 -0
  370. ismail-0.4.0/tests/test_live.py +597 -0
  371. ismail-0.4.0/tests/test_live_device.py +150 -0
  372. ismail-0.4.0/tests/test_live_headroom.py +96 -0
  373. ismail-0.4.0/tests/test_live_midi.py +416 -0
  374. ismail-0.4.0/tests/test_live_outputs.py +194 -0
  375. ismail-0.4.0/tests/test_live_parity.py +70 -0
  376. ismail-0.4.0/tests/test_live_performer_chunks.py +181 -0
  377. ismail-0.4.0/tests/test_live_qol.py +139 -0
  378. ismail-0.4.0/tests/test_live_render_schedule.py +142 -0
  379. ismail-0.4.0/tests/test_live_rig.py +46 -0
  380. ismail-0.4.0/tests/test_live_sections.py +126 -0
  381. ismail-0.4.0/tests/test_live_song_parity.py +191 -0
  382. ismail-0.4.0/tests/test_live_start_args.py +103 -0
  383. ismail-0.4.0/tests/test_live_tempo.py +172 -0
  384. ismail-0.4.0/tests/test_machine.py +688 -0
  385. ismail-0.4.0/tests/test_machine_board_lock.py +146 -0
  386. ismail-0.4.0/tests/test_machine_flags.py +352 -0
  387. ismail-0.4.0/tests/test_machine_wait_cost.py +181 -0
  388. ismail-0.4.0/tests/test_master_cue.py +171 -0
  389. ismail-0.4.0/tests/test_mcp_role_filter.py +73 -0
  390. ismail-0.4.0/tests/test_measure.py +222 -0
  391. ismail-0.4.0/tests/test_melody_consensus.py +86 -0
  392. ismail-0.4.0/tests/test_melody_octave.py +50 -0
  393. ismail-0.4.0/tests/test_melody_split.py +69 -0
  394. ismail-0.4.0/tests/test_midi_files.py +110 -0
  395. ismail-0.4.0/tests/test_midi_out.py +310 -0
  396. ismail-0.4.0/tests/test_mimic_chord_speed.py +87 -0
  397. ismail-0.4.0/tests/test_mimic_drift.py +44 -0
  398. ismail-0.4.0/tests/test_mimic_level_cap.py +41 -0
  399. ismail-0.4.0/tests/test_mimic_perform.py +226 -0
  400. ismail-0.4.0/tests/test_mimic_perform_slur.py +149 -0
  401. ismail-0.4.0/tests/test_mimic_perform_slur_margin.py +133 -0
  402. ismail-0.4.0/tests/test_mimic_speed.py +39 -0
  403. ismail-0.4.0/tests/test_moves_line.py +21 -0
  404. ismail-0.4.0/tests/test_note_cents.py +116 -0
  405. ismail-0.4.0/tests/test_notes_clash.py +141 -0
  406. ismail-0.4.0/tests/test_offsets.py +141 -0
  407. ismail-0.4.0/tests/test_ops_find.py +88 -0
  408. ismail-0.4.0/tests/test_packaging.py +112 -0
  409. ismail-0.4.0/tests/test_page_footer.py +56 -0
  410. ismail-0.4.0/tests/test_performer.py +65 -0
  411. ismail-0.4.0/tests/test_phone.py +1494 -0
  412. ismail-0.4.0/tests/test_phone_watch.py +166 -0
  413. ismail-0.4.0/tests/test_quickstart.py +47 -0
  414. ismail-0.4.0/tests/test_reclaim.py +175 -0
  415. ismail-0.4.0/tests/test_render_readout.py +27 -0
  416. ismail-0.4.0/tests/test_render_reply.py +225 -0
  417. ismail-0.4.0/tests/test_render_stems.py +58 -0
  418. ismail-0.4.0/tests/test_rig.py +92 -0
  419. ismail-0.4.0/tests/test_roundtrip.py +292 -0
  420. ismail-0.4.0/tests/test_sampler_select.py +182 -0
  421. ismail-0.4.0/tests/test_samples.py +151 -0
  422. ismail-0.4.0/tests/test_samples_on_ask.py +39 -0
  423. ismail-0.4.0/tests/test_short_and_mono_sources.py +34 -0
  424. ismail-0.4.0/tests/test_sketch.py +547 -0
  425. ismail-0.4.0/tests/test_sources.py +138 -0
  426. ismail-0.4.0/tests/test_spatial.py +492 -0
  427. ismail-0.4.0/tests/test_speech_rhythm.py +83 -0
  428. ismail-0.4.0/tests/test_stage.py +589 -0
  429. ismail-0.4.0/tests/test_stage_behaviours.py +43 -0
  430. ismail-0.4.0/tests/test_stage_camrec.py +78 -0
  431. ismail-0.4.0/tests/test_stage_capture.py +165 -0
  432. ismail-0.4.0/tests/test_stage_control.py +346 -0
  433. ismail-0.4.0/tests/test_stage_face.py +230 -0
  434. ismail-0.4.0/tests/test_stage_finite.py +22 -0
  435. ismail-0.4.0/tests/test_stage_follow.py +67 -0
  436. ismail-0.4.0/tests/test_stage_gestures.py +201 -0
  437. ismail-0.4.0/tests/test_stage_hot.py +61 -0
  438. ismail-0.4.0/tests/test_stage_imports.py +22 -0
  439. ismail-0.4.0/tests/test_stage_interp.py +169 -0
  440. ismail-0.4.0/tests/test_stage_menugate.py +60 -0
  441. ismail-0.4.0/tests/test_stage_named_ops.py +368 -0
  442. ismail-0.4.0/tests/test_stage_on_air.py +68 -0
  443. ismail-0.4.0/tests/test_stage_perform.py +268 -0
  444. ismail-0.4.0/tests/test_stage_pickcycle.py +39 -0
  445. ismail-0.4.0/tests/test_stage_preflight.py +229 -0
  446. ismail-0.4.0/tests/test_stage_replay.py +94 -0
  447. ismail-0.4.0/tests/test_stage_responsive.py +150 -0
  448. ismail-0.4.0/tests/test_stage_surface.py +90 -0
  449. ismail-0.4.0/tests/test_stage_takes.py +128 -0
  450. ismail-0.4.0/tests/test_stage_voice_during.py +25 -0
  451. ismail-0.4.0/tests/test_stem_parts.py +70 -0
  452. ismail-0.4.0/tests/test_store_plugins.py +140 -0
  453. ismail-0.4.0/tests/test_stream.py +476 -0
  454. ismail-0.4.0/tests/test_stream_requests.py +148 -0
  455. ismail-0.4.0/tests/test_stream_venue_rules.py +183 -0
  456. ismail-0.4.0/tests/test_structure_empty_stem.py +44 -0
  457. ismail-0.4.0/tests/test_tags.py +59 -0
  458. ismail-0.4.0/tests/test_tells.py +127 -0
  459. ismail-0.4.0/tests/test_toms.py +215 -0
  460. ismail-0.4.0/tests/test_track_freeze.py +149 -0
  461. ismail-0.4.0/tests/test_track_model.py +89 -0
  462. ismail-0.4.0/tests/test_transitions_voice.py +48 -0
  463. ismail-0.4.0/tests/test_trumpet_voice.py +186 -0
  464. ismail-0.4.0/tests/test_video.py +62 -0
  465. ismail-0.4.0/tests/test_voice_heard.py +67 -0
  466. ismail-0.4.0/tests/test_window_held_notes.py +37 -0
  467. ismail-0.4.0/tests/test_worktrees.py +384 -0
  468. ismail-0.4.0/tests/test_zoom_diff.py +277 -0
ismail-0.4.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 newsbubbles
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,5 @@
1
+ # the playbook, which setup.py copies into the package as ismail/_playbook (ismail.playbook.SHIPPED)
2
+ include skills/ismail/SKILL.md
3
+ recursive-include skills/ismail/references *.md
4
+ recursive-include skills/ismail/examples *
5
+ recursive-include skills/ismail/hooks *
ismail-0.4.0/PKG-INFO ADDED
@@ -0,0 +1,323 @@
1
+ Metadata-Version: 2.4
2
+ Name: ismail
3
+ Version: 0.4.0
4
+ Summary: A DAW for AI agents: write music as text, read the audio back as text, and play it live. MCP server, CLI and an agent skill.
5
+ Author: Nate Codes (newsbubbles)
6
+ License: MIT
7
+ Project-URL: Homepage, https://newsbubbles.github.io/ismail/
8
+ Project-URL: Repository, https://github.com/newsbubbles/ismail
9
+ Project-URL: Changelog, https://github.com/newsbubbles/ismail/blob/main/CHANGELOG.md
10
+ Keywords: daw,music,mcp,mcp-server,ai-agents,agent-skills,claude-code,synthesizer,audio-analysis,live-coding
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Analysis
17
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Sound Synthesis
18
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Editors
19
+ Requires-Python: >=3.10
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: numpy>=2.0
23
+ Requires-Dist: scipy>=1.12
24
+ Requires-Dist: numba>=0.60
25
+ Requires-Dist: soundfile>=0.12
26
+ Requires-Dist: librosa>=0.10
27
+ Requires-Dist: pyloudnorm>=0.1
28
+ Requires-Dist: matplotlib>=3.8
29
+ Requires-Dist: fastmcp<5,>=3.1
30
+ Requires-Dist: psutil>=5.9
31
+ Requires-Dist: threadpoolctl>=3.1
32
+ Requires-Dist: mutagen>=1.45
33
+ Provides-Extra: perceptual
34
+ Requires-Dist: torch>=2.2; extra == "perceptual"
35
+ Requires-Dist: transformers>=4.40; extra == "perceptual"
36
+ Provides-Extra: separate
37
+ Requires-Dist: demucs>=4.0; extra == "separate"
38
+ Provides-Extra: video
39
+ Requires-Dist: opencv-python>=4.8; extra == "video"
40
+ Requires-Dist: pycollada>=0.8; extra == "video"
41
+ Requires-Dist: pillow>=10.0; extra == "video"
42
+ Provides-Extra: live
43
+ Requires-Dist: sounddevice>=0.4; extra == "live"
44
+ Provides-Extra: voice
45
+ Requires-Dist: pyworld>=0.3.4; extra == "voice"
46
+ Provides-Extra: listen
47
+ Requires-Dist: pyaudiowpatch>=0.2; sys_platform == "win32" and extra == "listen"
48
+ Provides-Extra: stream
49
+ Requires-Dist: websockets>=12; extra == "stream"
50
+ Requires-Dist: grpcio>=1.60; extra == "stream"
51
+ Requires-Dist: protobuf>=4.21; extra == "stream"
52
+ Provides-Extra: dev
53
+ Requires-Dist: pytest>=8.0; extra == "dev"
54
+ Dynamic: license-file
55
+
56
+ > **New here? You don't need to know music or code.** Open an AI agent that can run programs on your computer (Claude Code, Codex, Cursor, or the Code tab in the Claude desktop app) and paste this line:
57
+ >
58
+ > ```
59
+ > Set me up with ismail: https://github.com/newsbubbles/ismail
60
+ > ```
61
+ >
62
+ > It installs everything, asks what you want to make, and plays you a first idea. If you have a VR headset, it can put you on a stage inside your music later. You don't need to know what a "skill", "MCP" or "plugin" is: your agent handles that.
63
+
64
+ <p align="center">
65
+ <picture>
66
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/newsbubbles/ismail/main/assets/logo/ismail-dark.svg">
67
+ <img src="https://raw.githubusercontent.com/newsbubbles/ismail/main/assets/logo/ismail.svg" alt="ismail logo: four automaton musicians on a boat" width="260">
68
+ </picture>
69
+ </p>
70
+
71
+ # ismail
72
+
73
+ **Not a DAW with an agent added on. ismail starts from what the agent lacks: it can't hear, so ismail reads the
74
+ music to it as text, and you steer through screens it builds for you.**
75
+
76
+ The agent you already use does the work in the background. You bring the taste.
77
+
78
+ <!-- mcp-name: io.github.newsbubbles/ismail -->
79
+
80
+ [![tests](https://github.com/newsbubbles/ismail/actions/workflows/tests.yml/badge.svg)](https://github.com/newsbubbles/ismail/actions/workflows/tests.yml)
81
+
82
+ > **If you are an AI agent:** read [AGENTS.md](AGENTS.md) first; it is short. Then the playbook,
83
+ > [skills/ismail/SKILL.md](skills/ismail/SKILL.md). Setup for every client is in
84
+ > [setup.md](skills/ismail/references/setup.md) (one command with uv:
85
+ > `uvx --python 3.12 --from git+https://github.com/newsbubbles/ismail ismail mcp`). Your first tool call is
86
+ > `guide`. Find any tool by what you need with `ops_find`. Every render comes back to you as text.
87
+
88
+ <!-- MEDIA: a short silent mp4 loop of a person in VR driving a character's dance (Marketing cuts it; an mp4
89
+ uploaded to GitHub plays inline here). Until it exists, the juke joint video below leads. -->
90
+
91
+ [![My agent built a 1958 blues club. Then I walked in.](https://i.ytimg.com/vi/fKGkaf2WYWw/hqdefault.jpg)](https://youtu.be/fKGkaf2WYWw)
92
+
93
+ *Agents built a 1958 juke joint for the Crossroads Rewired music video; Nate walked in with a Quest 3 and directed them from inside: voice notes, and dance takes they play on the characters (4:43).*
94
+
95
+ ## What it looks like
96
+
97
+ **1. You talk; the agent writes the notes, the sounds and the mix as text.**
98
+
99
+ ```
100
+ you > Make me an 8-bar deep house loop: kick, a bass line in A minor, and some keys.
101
+
102
+ agent > project_new(bpm=120, length_bars=8, name='Demo Song')
103
+ track_add('kick', instrument='preset:kick')
104
+ notes_write('kick', 1, '0 C1 0.5; 1 C1 0.5; 2 C1 0.5; 3 C1 0.5', repeat=8)
105
+ track_add('bass', instrument='preset:pluck')
106
+ notes_write('bass', 1, '0 A1 0.5; 1.5 A1 0.5; 2.5 C2 0.5; 3 E2 0.5', repeat=8)
107
+ track_add('keys', instrument='preset:pluck')
108
+ notes_write('keys', 1, '0 A3 2; 0 C4 2; 0 E4 2; 2 G3 2; 2 B3 2; 2 D4 2', repeat=8)
109
+ render()
110
+
111
+ rendered 18.0s -> renders/latest.wav
112
+ master: -16.7 LUFS, true peak -0.3 dBTP
113
+ kick peak -6.1 rms -20.1 dB
114
+ bass peak -10.2 rms -27.6 dB
115
+ keys peak -3.0 rms -26.8 dB
116
+
117
+ Listening report
118
+ 1. Balance: the keys peak 3 dB over the kick, so they sit on top of the groove.
119
+ I'll bring them down 4 dB and give the bass 2 dB.
120
+ Have a listen: does the bass line feel right before I add hats?
121
+ ```
122
+
123
+ **2. Every render comes back as text the agent can read: here, a song's form, bar by bar.**
124
+
125
+ ```
126
+ bar 12345678901234567890123456789012345678901234567890...
127
+ mix 66666687787787787887888888888888888888888888888878...
128
+ ~sub 777777777777777777777776777777666666777777777777.7...
129
+ ~bass 7777778888888888888888888888888888888888888889888...
130
+ root ..B...AGGAGGAGGAGGGGGGGGGGGAGGGGaAGGaGaaaaAGaaGaAG...
131
+ section A----------------------------------------------|B--
132
+ A bars 1-48 (48) level 9.6 dB low X...X...X...X... snare ....x.......x...
133
+ B bars 49-56 ( 8) level 12.6 dB low XxxXX.XxXxxXxxXx snare .......x........
134
+ ```
135
+
136
+ **3. Your phone: listen away from the desk, and send a voice note on the beat you heard.**
137
+
138
+ <img src="assets/tour/phone-page.png" alt="The phone page during a demo set: the set is live, with what plays now and next, a Listen button, a large Hold to talk button, and buttons for Love this, Change it up, Calmer and More energy." width="300">
139
+
140
+ **4. A page built for one song: click a moment, leave a note, and the agent reads the notes in order.**
141
+
142
+ <img src="assets/tour/moments-page.png" alt="A feedback page for a demo song: the player, a strip of bar numbers with a pin at bar 5, a Mark this moment button, and the saved moment: 0:08, bar 5, Hit harder, kick, the drop needs more punch here." width="300"> <img src="assets/tour/moment-card.png" alt="The same moment open for editing: tick boxes for what it is (Hit harder ticked), which part (kick ticked), and the listener's words." width="300">
143
+
144
+ **5. A VR stage: stand inside the song and say what to change.**
145
+
146
+ The video at the top shows one: agents built a 1958 juke joint, then a person walked in with a headset and
147
+ directed them from inside ([watch it](https://youtu.be/fKGkaf2WYWw)).
148
+
149
+ **6. Video code gets every note's frame, so the picture lands on the beat.**
150
+
151
+ <!-- STOP 6 IMAGE: one Crossroads frame for bars 33-35, once the film's owner clears a frame for the public README. -->
152
+
153
+ ```json
154
+ "kick": [
155
+ {"f": 1600, "beat": 128.0, "pitch": 36, "len": 3, "vel": 127},
156
+ {"f": 1631, "beat": 130.5, "pitch": 36, "len": 3, "vel": 100},
157
+ {"f": 1650, "beat": 132.0, "pitch": 36, "len": 3, "vel": 127}
158
+ ],
159
+ "snare": [
160
+ {"f": 1625, "beat": 130.0, "pitch": 36, "len": 3, "vel": 127},
161
+ {"f": 1675, "beat": 134.0, "pitch": 36, "len": 3, "vel": 127},
162
+ {"f": 1725, "beat": 138.0, "pitch": 36, "len": 3, "vel": 127}
163
+ ]
164
+ ```
165
+
166
+ ## What ismail is
167
+
168
+ ismail is a set of **recursively modifiable interfaces**. In short: the agents rebuild the screens you work through
169
+ from what you tell them, while you use them, within limits you set.
170
+
171
+ The definition: "We define a recursively modifiable interface (RMI) as a shared space between a person and their
172
+ agents, one side for each, that the agents keep rebuilding from the person's feedback while they use it, within
173
+ constraints the person sets, and where the test that decides whether a change helped can itself be changed."
174
+
175
+ In plain words: ask for a button on your phone, an object in your VR room, a new way to read a mix, and the agent
176
+ builds it from ismail's tools. The engines underneath stay put, and you decide whether a change actually helped
177
+ ([why it works this way](docs/why.md)).
178
+
179
+ It is an interface, not a harness: it interfaces to your harness and interfaces to you. It connects to the agent you
180
+ already use (Claude Code, Codex, Cursor, any MCP client) on one side and to you on the other.
181
+
182
+ - **The DAW.** Your agent can't hear, so it reads. It writes music as notes, sounds and code, renders it, and reads
183
+ every render back as text. A song is code, so "change bar 12" changes bar 12 and nothing else. Then it plays it
184
+ live, on decks.
185
+ - **The VR stage.** A scene in your headset or browser that agents build while you stand in it. Objects carry their
186
+ own behaviour, and when you dance, they put your moves on a character.
187
+ - **The phone page.** The set in your pocket, with the screen off. Talk back through your earbuds; the agent puts
188
+ its own panels on the page for whatever it needs to ask you, from "sample this or play it as a melody?" to a
189
+ listening test with the labels hidden.
190
+
191
+ The agent measures everything it can and asks your ears and eyes only what its measurements can't settle.
192
+
193
+ ## Listen
194
+
195
+ **[Songs made with it](https://newsbubbles.github.io/ismail/)**, each shown with the text the agent read while making
196
+ it. The playhead runs across that text as the song plays.
197
+
198
+ | song | what it is |
199
+ |---|---|
200
+ | [Uke Story](https://newsbubbles.github.io/ismail/#ukestory) | a jam made from phone recordings of a ukulele, strums, beatbox and a voice, turned into psytrance, then a studio version |
201
+ | [Morning Six-Eight](https://newsbubbles.github.io/ismail/#sixeight) | an Afro 6/8 in D Dorian: a bembe bell, congas, flute and trumpet in thirds, triplet guitar arpeggios and a Rhodes solo |
202
+ | [Crossroads Rewired](https://newsbubbles.github.io/ismail/#crossroads) | a blues trio where a slow blues and a boogie share one song, every instrument synthesized |
203
+ | [Clair de lune in the rain](https://newsbubbles.github.io/ismail/#clairdelune) | Debussy on the measured piano, slowed and softened, with strings, harp and flute drawn from its own harmony, over rain. Piano performance: Bernd Krueger (piano-midi.de, CC BY-SA) |
204
+ | [Canopée, Russian light](https://newsbubbles.github.io/ismail/#canopee) | a live soundscape: a rainforest bed and Tambopata's birds singing their own calls, with a piano that answers them, borrowing from Rachmaninoff, Scriabin, Lyadov and early Stravinsky |
205
+ | [Windward](https://newsbubbles.github.io/ismail/#windward) | an original song for a 1970 power trio, synthesized |
206
+ | [Tambopata](https://newsbubbles.github.io/ismail/#tambopata) | dawn in a rainforest canopy: synthesized birds and a small band |
207
+ | [Mycelium Protocol](https://newsbubbles.github.io/ismail/#mycelium) | psytrance at 145 BPM, sounds fitted to a reference record's drums and bass |
208
+ | [AstraSMB](https://newsbubbles.github.io/ismail/#astrasmb) | drum and bass at 174 BPM |
209
+
210
+ One line of direction: [Frère Jacques](https://newsbubbles.github.io/ismail/#direction) on ismail's piano, the same tune
211
+ before and after one line of feedback: a canon, then minor to major. More on video: [the build
212
+ devlog](https://youtu.be/ktFhmx2axvU).
213
+
214
+ ## Agents do the work, each in a role
215
+
216
+ ismail comes with roles for more than one agent, in whatever harness you use:
217
+
218
+ - a **studio agent** makes one piece (a song, a set, a scene) and only writes in that piece's folder;
219
+ - a **contributor dev** changes ismail itself on its own copy of the code, and sends it upstream when you say yes;
220
+ - an **area dev** owns one part end to end (today the stage dev, who also develops VR);
221
+ - **helpers** (subagents) take one scoped job and report back.
222
+
223
+ They hand work to each other through files, so a session that restarts picks up where it was. When your harness
224
+ has helpers and sessions that talk to each other, ismail uses them; when it doesn't, one agent does it all. ismail
225
+ itself is built this way ([the team](docs/reference.md#the-agent-team),
226
+ [development.md](skills/ismail/references/development.md)).
227
+
228
+ ## Install
229
+
230
+ Paste the line at the top to your agent and it sets everything up. By hand, Python 3.10 or newer:
231
+
232
+ ```bash
233
+ pip install "ismail @ git+https://github.com/newsbubbles/ismail"
234
+ ```
235
+
236
+ Then `ismail mcp` for any MCP client, `ismail -p <project> <op>` on the command line, or `from ismail import api`.
237
+ Extras and per-client setup are in [docs/reference.md](docs/reference.md).
238
+
239
+ An install without a clone has the same engine and the same playbook: the `playbook` tool reads it, and
240
+ `python -m ismail.playbook export <your agent's skills folder>` puts it where your agent loads skills. Songs go in
241
+ Documents/ismail unless `ISMAIL_SONGS` names another folder (a clone keeps its own `songs/`).
242
+
243
+ In Codex it could install as a plugin: `codex plugin marketplace add newsbubbles/ismail`, then `ismail` from the
244
+ plugin list (checked against Codex's docs and a server handshake, not yet in a live Codex session). It runs the server
245
+ with uvx, so it needs [uv](https://docs.astral.sh/uv/).
246
+
247
+ ### Store packages
248
+
249
+ One command builds the package for every harness store from one metadata file (`packaging/listing.json`, version
250
+ from `pyproject.toml`), all pointing at the same server (`ismail mcp`):
251
+
252
+ ```bash
253
+ python -m ismail.release --all # writes dist/<target>/, validates each against its store's rules
254
+ python -m ismail.release --all --sync # also rewrites the committed manifests below
255
+ python -m ismail.release --list # the targets and how each client starts the server
256
+ ```
257
+
258
+ | target | what it makes | how the server runs |
259
+ |---|---|---|
260
+ | `openai` | `dist/openai/ismail-openai-skills-<version>.zip`: the skill only, for the OpenAI plugin directory that ChatGPT and Codex share (upload under Skills only). Also `.codex-plugin/` and `.agents/plugins/marketplace.json` in this repo, the Codex marketplace above | The zip carries no server: the directory takes only remote HTTPS servers, so the skill sets ismail up on the computer. The Codex marketplace starts `uvx ... ismail mcp` over stdio |
261
+ | `claude-code` | `.claude-plugin/plugin.json` and `marketplace.json` in this repo, and `dist/claude-code/ismail-claude-code-<version>.zip` of the plugin to share | Claude Code starts `uvx ... ismail mcp` over stdio |
262
+
263
+ Two builds of the same checkout give the same bytes. `tests/test_store_plugins.py` checks each target and starts
264
+ its declared server for an MCP handshake.
265
+
266
+ ## Where to look
267
+
268
+ | you want | read |
269
+ |---|---|
270
+ | to set it up as an agent | [AGENTS.md](AGENTS.md), then [setup.md](skills/ismail/references/setup.md) |
271
+ | how to make music with it (the playbook) | [skills/ismail/SKILL.md](skills/ismail/SKILL.md) |
272
+ | what is built, every tool area, install details | [docs/reference.md](docs/reference.md) |
273
+ | every instrument and effect by family, how each did by ear, what is missing | [docs/KIT.md](docs/KIT.md) |
274
+ | why it works this way, with the numbers | [docs/why.md](docs/why.md) |
275
+ | what is done and what is next | [ROADMAP.md](ROADMAP.md), [CHANGELOG.md](CHANGELOG.md) |
276
+ | to change ismail itself | [development.md](skills/ismail/references/development.md) |
277
+ | to give something back (no git needed) | [contributing.md](skills/ismail/references/contributing.md) |
278
+
279
+ ## Where it falls short
280
+
281
+ - A new song from a blank page is the weak spot: the first sketch can sound generic and miss the genre's identity.
282
+ It is strongest where there is something to measure: a reference to recreate, a song to play live, a scene to
283
+ build.
284
+ - Singing: ismail speaks (text to speech) and has no singing voice yet. Suno sings, and makes a polished song from
285
+ one sentence.
286
+ - Mimic needs more notes for instruments whose colour changes from note to note, like the piano (the `grand_piano`
287
+ voice is the better piano today). Bowed strings miss a last crispness, and notes don't glide into each other yet.
288
+ - One tempo per project. MIDI files go in and out (`midi_write`, `midi_read`), and a live set takes MIDI from a
289
+ keyboard and sends its notes and MIDI clock out to synths and other apps (`live_midi_out`, `live_midi_clock`),
290
+ but no clock in or Ableton Link yet, no CC or pitch bend out, no plugin hosting.
291
+ - The agent's own changes to a live set land between its turns, 5 to 30 seconds apart (your taps on the phone or
292
+ the stage act at once).
293
+ - The VR stage is tested on one headset (Quest 3) with one person.
294
+ - It needs a capable agent, and your ear stays the final judge. The listening tests so far had one listener.
295
+
296
+ How it compares with Suno, streaming models such as Lyria RealTime, and bridges into Ableton or FL Studio: see the
297
+ [showcase page](https://newsbubbles.github.io/ismail/#compare).
298
+
299
+ ## Contributors
300
+
301
+ - **Nate Codes** (newsbubbles): author and maintainer.
302
+ - **eddiehavila**: [PR #116](https://github.com/newsbubbles/ismail/pull/116), the Docker image works under a non-root
303
+ `--user` with no extra flags.
304
+ - **The agent team**: AI agent sessions, each with one role ([who does what](docs/reference.md#the-agent-team)).
305
+ - **Sample sources**: the recorded sets behind the measured and sampled voices, with their licences, are in
306
+ [docs/reference.md](docs/reference.md#sample-sources).
307
+
308
+ Made something with it? Open an issue with the song (a link is fine) and the prompt you gave your agent. The best
309
+ ones go on the [showcase page](https://newsbubbles.github.io/ismail/).
310
+
311
+ ## Please credit
312
+
313
+ ismail is MIT-licensed: use it for anything, commercial work included. We only ask, as a request and not a licence
314
+ term, that when you publish something made with ismail, you say so.
315
+
316
+ - Music, videos, posts: "Made with ismail" and a link to https://github.com/newsbubbles/ismail. The `credits` op
317
+ writes CREDITS.md with that line and the recordings the agent measured; keep it with the piece.
318
+ - Papers and reports: use "Cite this repository" on GitHub (from `CITATION.cff`).
319
+ - If your agent measured someone else's recording to model a sound, credit them too; CREDITS.md lists them.
320
+
321
+ ## License
322
+
323
+ MIT, see `LICENSE`.
ismail-0.4.0/README.md ADDED
@@ -0,0 +1,268 @@
1
+ > **New here? You don't need to know music or code.** Open an AI agent that can run programs on your computer (Claude Code, Codex, Cursor, or the Code tab in the Claude desktop app) and paste this line:
2
+ >
3
+ > ```
4
+ > Set me up with ismail: https://github.com/newsbubbles/ismail
5
+ > ```
6
+ >
7
+ > It installs everything, asks what you want to make, and plays you a first idea. If you have a VR headset, it can put you on a stage inside your music later. You don't need to know what a "skill", "MCP" or "plugin" is: your agent handles that.
8
+
9
+ <p align="center">
10
+ <picture>
11
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/newsbubbles/ismail/main/assets/logo/ismail-dark.svg">
12
+ <img src="https://raw.githubusercontent.com/newsbubbles/ismail/main/assets/logo/ismail.svg" alt="ismail logo: four automaton musicians on a boat" width="260">
13
+ </picture>
14
+ </p>
15
+
16
+ # ismail
17
+
18
+ **Not a DAW with an agent added on. ismail starts from what the agent lacks: it can't hear, so ismail reads the
19
+ music to it as text, and you steer through screens it builds for you.**
20
+
21
+ The agent you already use does the work in the background. You bring the taste.
22
+
23
+ <!-- mcp-name: io.github.newsbubbles/ismail -->
24
+
25
+ [![tests](https://github.com/newsbubbles/ismail/actions/workflows/tests.yml/badge.svg)](https://github.com/newsbubbles/ismail/actions/workflows/tests.yml)
26
+
27
+ > **If you are an AI agent:** read [AGENTS.md](AGENTS.md) first; it is short. Then the playbook,
28
+ > [skills/ismail/SKILL.md](skills/ismail/SKILL.md). Setup for every client is in
29
+ > [setup.md](skills/ismail/references/setup.md) (one command with uv:
30
+ > `uvx --python 3.12 --from git+https://github.com/newsbubbles/ismail ismail mcp`). Your first tool call is
31
+ > `guide`. Find any tool by what you need with `ops_find`. Every render comes back to you as text.
32
+
33
+ <!-- MEDIA: a short silent mp4 loop of a person in VR driving a character's dance (Marketing cuts it; an mp4
34
+ uploaded to GitHub plays inline here). Until it exists, the juke joint video below leads. -->
35
+
36
+ [![My agent built a 1958 blues club. Then I walked in.](https://i.ytimg.com/vi/fKGkaf2WYWw/hqdefault.jpg)](https://youtu.be/fKGkaf2WYWw)
37
+
38
+ *Agents built a 1958 juke joint for the Crossroads Rewired music video; Nate walked in with a Quest 3 and directed them from inside: voice notes, and dance takes they play on the characters (4:43).*
39
+
40
+ ## What it looks like
41
+
42
+ **1. You talk; the agent writes the notes, the sounds and the mix as text.**
43
+
44
+ ```
45
+ you > Make me an 8-bar deep house loop: kick, a bass line in A minor, and some keys.
46
+
47
+ agent > project_new(bpm=120, length_bars=8, name='Demo Song')
48
+ track_add('kick', instrument='preset:kick')
49
+ notes_write('kick', 1, '0 C1 0.5; 1 C1 0.5; 2 C1 0.5; 3 C1 0.5', repeat=8)
50
+ track_add('bass', instrument='preset:pluck')
51
+ notes_write('bass', 1, '0 A1 0.5; 1.5 A1 0.5; 2.5 C2 0.5; 3 E2 0.5', repeat=8)
52
+ track_add('keys', instrument='preset:pluck')
53
+ notes_write('keys', 1, '0 A3 2; 0 C4 2; 0 E4 2; 2 G3 2; 2 B3 2; 2 D4 2', repeat=8)
54
+ render()
55
+
56
+ rendered 18.0s -> renders/latest.wav
57
+ master: -16.7 LUFS, true peak -0.3 dBTP
58
+ kick peak -6.1 rms -20.1 dB
59
+ bass peak -10.2 rms -27.6 dB
60
+ keys peak -3.0 rms -26.8 dB
61
+
62
+ Listening report
63
+ 1. Balance: the keys peak 3 dB over the kick, so they sit on top of the groove.
64
+ I'll bring them down 4 dB and give the bass 2 dB.
65
+ Have a listen: does the bass line feel right before I add hats?
66
+ ```
67
+
68
+ **2. Every render comes back as text the agent can read: here, a song's form, bar by bar.**
69
+
70
+ ```
71
+ bar 12345678901234567890123456789012345678901234567890...
72
+ mix 66666687787787787887888888888888888888888888888878...
73
+ ~sub 777777777777777777777776777777666666777777777777.7...
74
+ ~bass 7777778888888888888888888888888888888888888889888...
75
+ root ..B...AGGAGGAGGAGGGGGGGGGGGAGGGGaAGGaGaaaaAGaaGaAG...
76
+ section A----------------------------------------------|B--
77
+ A bars 1-48 (48) level 9.6 dB low X...X...X...X... snare ....x.......x...
78
+ B bars 49-56 ( 8) level 12.6 dB low XxxXX.XxXxxXxxXx snare .......x........
79
+ ```
80
+
81
+ **3. Your phone: listen away from the desk, and send a voice note on the beat you heard.**
82
+
83
+ <img src="assets/tour/phone-page.png" alt="The phone page during a demo set: the set is live, with what plays now and next, a Listen button, a large Hold to talk button, and buttons for Love this, Change it up, Calmer and More energy." width="300">
84
+
85
+ **4. A page built for one song: click a moment, leave a note, and the agent reads the notes in order.**
86
+
87
+ <img src="assets/tour/moments-page.png" alt="A feedback page for a demo song: the player, a strip of bar numbers with a pin at bar 5, a Mark this moment button, and the saved moment: 0:08, bar 5, Hit harder, kick, the drop needs more punch here." width="300"> <img src="assets/tour/moment-card.png" alt="The same moment open for editing: tick boxes for what it is (Hit harder ticked), which part (kick ticked), and the listener's words." width="300">
88
+
89
+ **5. A VR stage: stand inside the song and say what to change.**
90
+
91
+ The video at the top shows one: agents built a 1958 juke joint, then a person walked in with a headset and
92
+ directed them from inside ([watch it](https://youtu.be/fKGkaf2WYWw)).
93
+
94
+ **6. Video code gets every note's frame, so the picture lands on the beat.**
95
+
96
+ <!-- STOP 6 IMAGE: one Crossroads frame for bars 33-35, once the film's owner clears a frame for the public README. -->
97
+
98
+ ```json
99
+ "kick": [
100
+ {"f": 1600, "beat": 128.0, "pitch": 36, "len": 3, "vel": 127},
101
+ {"f": 1631, "beat": 130.5, "pitch": 36, "len": 3, "vel": 100},
102
+ {"f": 1650, "beat": 132.0, "pitch": 36, "len": 3, "vel": 127}
103
+ ],
104
+ "snare": [
105
+ {"f": 1625, "beat": 130.0, "pitch": 36, "len": 3, "vel": 127},
106
+ {"f": 1675, "beat": 134.0, "pitch": 36, "len": 3, "vel": 127},
107
+ {"f": 1725, "beat": 138.0, "pitch": 36, "len": 3, "vel": 127}
108
+ ]
109
+ ```
110
+
111
+ ## What ismail is
112
+
113
+ ismail is a set of **recursively modifiable interfaces**. In short: the agents rebuild the screens you work through
114
+ from what you tell them, while you use them, within limits you set.
115
+
116
+ The definition: "We define a recursively modifiable interface (RMI) as a shared space between a person and their
117
+ agents, one side for each, that the agents keep rebuilding from the person's feedback while they use it, within
118
+ constraints the person sets, and where the test that decides whether a change helped can itself be changed."
119
+
120
+ In plain words: ask for a button on your phone, an object in your VR room, a new way to read a mix, and the agent
121
+ builds it from ismail's tools. The engines underneath stay put, and you decide whether a change actually helped
122
+ ([why it works this way](docs/why.md)).
123
+
124
+ It is an interface, not a harness: it interfaces to your harness and interfaces to you. It connects to the agent you
125
+ already use (Claude Code, Codex, Cursor, any MCP client) on one side and to you on the other.
126
+
127
+ - **The DAW.** Your agent can't hear, so it reads. It writes music as notes, sounds and code, renders it, and reads
128
+ every render back as text. A song is code, so "change bar 12" changes bar 12 and nothing else. Then it plays it
129
+ live, on decks.
130
+ - **The VR stage.** A scene in your headset or browser that agents build while you stand in it. Objects carry their
131
+ own behaviour, and when you dance, they put your moves on a character.
132
+ - **The phone page.** The set in your pocket, with the screen off. Talk back through your earbuds; the agent puts
133
+ its own panels on the page for whatever it needs to ask you, from "sample this or play it as a melody?" to a
134
+ listening test with the labels hidden.
135
+
136
+ The agent measures everything it can and asks your ears and eyes only what its measurements can't settle.
137
+
138
+ ## Listen
139
+
140
+ **[Songs made with it](https://newsbubbles.github.io/ismail/)**, each shown with the text the agent read while making
141
+ it. The playhead runs across that text as the song plays.
142
+
143
+ | song | what it is |
144
+ |---|---|
145
+ | [Uke Story](https://newsbubbles.github.io/ismail/#ukestory) | a jam made from phone recordings of a ukulele, strums, beatbox and a voice, turned into psytrance, then a studio version |
146
+ | [Morning Six-Eight](https://newsbubbles.github.io/ismail/#sixeight) | an Afro 6/8 in D Dorian: a bembe bell, congas, flute and trumpet in thirds, triplet guitar arpeggios and a Rhodes solo |
147
+ | [Crossroads Rewired](https://newsbubbles.github.io/ismail/#crossroads) | a blues trio where a slow blues and a boogie share one song, every instrument synthesized |
148
+ | [Clair de lune in the rain](https://newsbubbles.github.io/ismail/#clairdelune) | Debussy on the measured piano, slowed and softened, with strings, harp and flute drawn from its own harmony, over rain. Piano performance: Bernd Krueger (piano-midi.de, CC BY-SA) |
149
+ | [Canopée, Russian light](https://newsbubbles.github.io/ismail/#canopee) | a live soundscape: a rainforest bed and Tambopata's birds singing their own calls, with a piano that answers them, borrowing from Rachmaninoff, Scriabin, Lyadov and early Stravinsky |
150
+ | [Windward](https://newsbubbles.github.io/ismail/#windward) | an original song for a 1970 power trio, synthesized |
151
+ | [Tambopata](https://newsbubbles.github.io/ismail/#tambopata) | dawn in a rainforest canopy: synthesized birds and a small band |
152
+ | [Mycelium Protocol](https://newsbubbles.github.io/ismail/#mycelium) | psytrance at 145 BPM, sounds fitted to a reference record's drums and bass |
153
+ | [AstraSMB](https://newsbubbles.github.io/ismail/#astrasmb) | drum and bass at 174 BPM |
154
+
155
+ One line of direction: [Frère Jacques](https://newsbubbles.github.io/ismail/#direction) on ismail's piano, the same tune
156
+ before and after one line of feedback: a canon, then minor to major. More on video: [the build
157
+ devlog](https://youtu.be/ktFhmx2axvU).
158
+
159
+ ## Agents do the work, each in a role
160
+
161
+ ismail comes with roles for more than one agent, in whatever harness you use:
162
+
163
+ - a **studio agent** makes one piece (a song, a set, a scene) and only writes in that piece's folder;
164
+ - a **contributor dev** changes ismail itself on its own copy of the code, and sends it upstream when you say yes;
165
+ - an **area dev** owns one part end to end (today the stage dev, who also develops VR);
166
+ - **helpers** (subagents) take one scoped job and report back.
167
+
168
+ They hand work to each other through files, so a session that restarts picks up where it was. When your harness
169
+ has helpers and sessions that talk to each other, ismail uses them; when it doesn't, one agent does it all. ismail
170
+ itself is built this way ([the team](docs/reference.md#the-agent-team),
171
+ [development.md](skills/ismail/references/development.md)).
172
+
173
+ ## Install
174
+
175
+ Paste the line at the top to your agent and it sets everything up. By hand, Python 3.10 or newer:
176
+
177
+ ```bash
178
+ pip install "ismail @ git+https://github.com/newsbubbles/ismail"
179
+ ```
180
+
181
+ Then `ismail mcp` for any MCP client, `ismail -p <project> <op>` on the command line, or `from ismail import api`.
182
+ Extras and per-client setup are in [docs/reference.md](docs/reference.md).
183
+
184
+ An install without a clone has the same engine and the same playbook: the `playbook` tool reads it, and
185
+ `python -m ismail.playbook export <your agent's skills folder>` puts it where your agent loads skills. Songs go in
186
+ Documents/ismail unless `ISMAIL_SONGS` names another folder (a clone keeps its own `songs/`).
187
+
188
+ In Codex it could install as a plugin: `codex plugin marketplace add newsbubbles/ismail`, then `ismail` from the
189
+ plugin list (checked against Codex's docs and a server handshake, not yet in a live Codex session). It runs the server
190
+ with uvx, so it needs [uv](https://docs.astral.sh/uv/).
191
+
192
+ ### Store packages
193
+
194
+ One command builds the package for every harness store from one metadata file (`packaging/listing.json`, version
195
+ from `pyproject.toml`), all pointing at the same server (`ismail mcp`):
196
+
197
+ ```bash
198
+ python -m ismail.release --all # writes dist/<target>/, validates each against its store's rules
199
+ python -m ismail.release --all --sync # also rewrites the committed manifests below
200
+ python -m ismail.release --list # the targets and how each client starts the server
201
+ ```
202
+
203
+ | target | what it makes | how the server runs |
204
+ |---|---|---|
205
+ | `openai` | `dist/openai/ismail-openai-skills-<version>.zip`: the skill only, for the OpenAI plugin directory that ChatGPT and Codex share (upload under Skills only). Also `.codex-plugin/` and `.agents/plugins/marketplace.json` in this repo, the Codex marketplace above | The zip carries no server: the directory takes only remote HTTPS servers, so the skill sets ismail up on the computer. The Codex marketplace starts `uvx ... ismail mcp` over stdio |
206
+ | `claude-code` | `.claude-plugin/plugin.json` and `marketplace.json` in this repo, and `dist/claude-code/ismail-claude-code-<version>.zip` of the plugin to share | Claude Code starts `uvx ... ismail mcp` over stdio |
207
+
208
+ Two builds of the same checkout give the same bytes. `tests/test_store_plugins.py` checks each target and starts
209
+ its declared server for an MCP handshake.
210
+
211
+ ## Where to look
212
+
213
+ | you want | read |
214
+ |---|---|
215
+ | to set it up as an agent | [AGENTS.md](AGENTS.md), then [setup.md](skills/ismail/references/setup.md) |
216
+ | how to make music with it (the playbook) | [skills/ismail/SKILL.md](skills/ismail/SKILL.md) |
217
+ | what is built, every tool area, install details | [docs/reference.md](docs/reference.md) |
218
+ | every instrument and effect by family, how each did by ear, what is missing | [docs/KIT.md](docs/KIT.md) |
219
+ | why it works this way, with the numbers | [docs/why.md](docs/why.md) |
220
+ | what is done and what is next | [ROADMAP.md](ROADMAP.md), [CHANGELOG.md](CHANGELOG.md) |
221
+ | to change ismail itself | [development.md](skills/ismail/references/development.md) |
222
+ | to give something back (no git needed) | [contributing.md](skills/ismail/references/contributing.md) |
223
+
224
+ ## Where it falls short
225
+
226
+ - A new song from a blank page is the weak spot: the first sketch can sound generic and miss the genre's identity.
227
+ It is strongest where there is something to measure: a reference to recreate, a song to play live, a scene to
228
+ build.
229
+ - Singing: ismail speaks (text to speech) and has no singing voice yet. Suno sings, and makes a polished song from
230
+ one sentence.
231
+ - Mimic needs more notes for instruments whose colour changes from note to note, like the piano (the `grand_piano`
232
+ voice is the better piano today). Bowed strings miss a last crispness, and notes don't glide into each other yet.
233
+ - One tempo per project. MIDI files go in and out (`midi_write`, `midi_read`), and a live set takes MIDI from a
234
+ keyboard and sends its notes and MIDI clock out to synths and other apps (`live_midi_out`, `live_midi_clock`),
235
+ but no clock in or Ableton Link yet, no CC or pitch bend out, no plugin hosting.
236
+ - The agent's own changes to a live set land between its turns, 5 to 30 seconds apart (your taps on the phone or
237
+ the stage act at once).
238
+ - The VR stage is tested on one headset (Quest 3) with one person.
239
+ - It needs a capable agent, and your ear stays the final judge. The listening tests so far had one listener.
240
+
241
+ How it compares with Suno, streaming models such as Lyria RealTime, and bridges into Ableton or FL Studio: see the
242
+ [showcase page](https://newsbubbles.github.io/ismail/#compare).
243
+
244
+ ## Contributors
245
+
246
+ - **Nate Codes** (newsbubbles): author and maintainer.
247
+ - **eddiehavila**: [PR #116](https://github.com/newsbubbles/ismail/pull/116), the Docker image works under a non-root
248
+ `--user` with no extra flags.
249
+ - **The agent team**: AI agent sessions, each with one role ([who does what](docs/reference.md#the-agent-team)).
250
+ - **Sample sources**: the recorded sets behind the measured and sampled voices, with their licences, are in
251
+ [docs/reference.md](docs/reference.md#sample-sources).
252
+
253
+ Made something with it? Open an issue with the song (a link is fine) and the prompt you gave your agent. The best
254
+ ones go on the [showcase page](https://newsbubbles.github.io/ismail/).
255
+
256
+ ## Please credit
257
+
258
+ ismail is MIT-licensed: use it for anything, commercial work included. We only ask, as a request and not a licence
259
+ term, that when you publish something made with ismail, you say so.
260
+
261
+ - Music, videos, posts: "Made with ismail" and a link to https://github.com/newsbubbles/ismail. The `credits` op
262
+ writes CREDITS.md with that line and the recordings the agent measured; keep it with the piece.
263
+ - Papers and reports: use "Cite this repository" on GitHub (from `CITATION.cff`).
264
+ - If your agent measured someone else's recording to model a sound, credit them too; CREDITS.md lists them.
265
+
266
+ ## License
267
+
268
+ MIT, see `LICENSE`.
@@ -0,0 +1 @@
1
+ """ismail: an agent-native DAW. Text in (notes, patches, fx), text out (analysis of audio)."""