Browse Source

initial commit

master
TFLCL 4 months ago
commit
289a70e01d
  1. 79
      docs/agn.convert.maxref.xml
  2. 110
      docs/agn.host.maxref.xml
  3. 72
      docs/agn.remote.maxref.xml
  4. 1251
      examples/agn_starter.maxpat
  5. 6449
      examples/looped_noise_examples.maxpat
  6. 5103
      examples/space_travel_example.maxpat
  7. 677
      extras/again.maxpat
  8. 692
      help/agn.convert.maxhelp
  9. 1078
      help/agn.host.maxhelp
  10. 902
      help/agn.remote.maxhelp
  11. 19
      javascript/again_utils.js
  12. 65
      javascript/agn_host.js
  13. 60
      javascript/agn_remote.js
  14. 24
      license.md
  15. BIN
      media/tunnel.webm
  16. 28
      package-info.json
  17. 2356
      patchers/agn.convert.maxpat
  18. 4620
      patchers/agn.host.maxpat
  19. 2818
      patchers/agn.remote.maxpat
  20. 3
      readme.md

79
docs/agn.convert.maxref.xml

@ -0,0 +1,79 @@
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<!-- DO NOT EDIT THIS FILE ... YOU WILL LOSE YOUR WORK -->
<c74object name='agn.convert' category='again, loop, video'>
<digest>
Converts agn.host exports to gif or webm
</digest>
<description>
Converts agn.host exported png frames to gif or webm, using ffmpeg executed via the shell object
</description>
<!--METADATA-->
<metadatalist>
<metadata name='author'>Théophile Clet</metadata>
<metadata name='tag'>again</metadata>
<metadata name='tag'>loop</metadata>
</metadatalist>
<!--MESSAGES-->
<methodlist>
<method name="gif">
<digest>Converts agn.host export to an animated gif</digest>
<description>Converts agn.host export to an animated gif file.</description>
</method>
</methodlist>
<methodlist>
<method name="webm">
<digest>Converts agn.host export to an animated gif</digest>
<description>Converts agn.host export to a webm file.</description>
</method>
</methodlist>
<methodlist>
<method name="loglevel">
<digest>Sets the ffmpeg logging level</digest>
<description>When followed by one of these words: quiet, fatal, error, warning, info, verbose, sets the ffmpeg logging level</description>
</method>
</methodlist>
<methodlist>
<method name="filename">
<digest>Sets the name of the output file</digest>
<description>Sets the name of the converted file (which will be followed by a timestamp)</description>
</method>
</methodlist>
<!--ATTRIBUTES-->
<attributelist>
<attribute name='loglevel' get='0' set='1' type='symbol' size='1' >
<digest>ffmpeg logging level</digest>
<description>ffmpeg logging level. From the less to most verbose: quiet, fatal, error, warning, info, verbose.</description>
</attribute>
<attribute name='filename' get='0' set='1' type='symbol' size='1' >
<digest>Sets the name of the output file</digest>
<description>Sets the name of the converted file (which will be followed by a timestamp)</description>
</attribute>
</attributelist>
<!--RELATED-->
<seealsolist>
<seealso name='agn.host' />
<seealso name='agn.remote' />
<seealso name='shell' />
</seealsolist>
</c74object>

110
docs/agn.host.maxref.xml

@ -0,0 +1,110 @@
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<c74object name='agn.host' category='again, loop, video'>
<digest>
Create and export animated loops
</digest>
<description>
Generates synchronized bangs and phase for creating looping animations and export them as files. To be used in tandem with agn.remote to access current phase, rendered frame number and various other information. Send the texture to be exported to the rightmost inlet.
Only one agn.host object can be present per patcher hierarchy.
</description>
<!--METADATA-->
<metadatalist>
<metadata name='author'>Théophile Clet</metadata>
<metadata name='tag'>again</metadata>
<metadata name='tag'>loop</metadata>
</metadatalist>
<!--ARGUMENTS-->
<objarglist>
<objarg name='name' optional='0' type='symbol'>
<digest>Name of the agn.host instance</digest>
<description>Name of the agn.host instance</description>
</objarg>
</objarglist>
<!--MESSAGES-->
<!-- <methodlist>
<method name="int">
<digest>Function depends on inlet</digest>
<description>Function depends on inlet</description>
</method>
<method name="float">
<digest>Function depends on inlet</digest>
<description>Function depends on inlet</description>
</method>
<method name="bang">
<digest>Function depends on inlet</digest>
<description>Function depends on inlet</description>
</method>
<method name="list">
<digest>Function depends on inlet</digest>
<description>Function depends on inlet</description>
</method>
</methodlist> -->
<!--ATTRIBUTES-->
<attributelist>
<attribute name='duration' get='0' set='1' type='float' size='1' >
<digest>Duration of the loop (in seconds)</digest>
<description>Sets the total duration of the loop (in seconds).</description>
</attribute>
<attribute name='fps_export' get='0' set='1' type='float' size='1' >
<digest>Target export FPS</digest>
<description>Number of frames per second to be exported. </description>
</attribute>
<attribute name='pre_loop' get='0' set='1' type='int' size='1' >
<digest>Number of pre-export loops</digest>
<description>Number of loops to be rendered before exporting when an export is triggered.</description>
</attribute>
<attribute name='inter_frames' get='0' set='1' type='int' size='1'>
<digest>Number of frames to render between two exported frames</digest>
<description>Number of frames to render between two exported frames. Increases the rendering FPS.</description>
</attribute>
<attribute name='texture' get='0' set='1' type='symbol' size='1'>
<digest>Name of the texture to be exported</digest>
<description>Name of the texture to be exported</description>
</attribute>
<attribute name='export_folder' get='0' set='1' type='symbol' size='1'>
<digest>Path of the folder to export frames</digest>
<description>Path of the folder to export frames.</description>
</attribute>
<attribute name='auto_delete' get='0' set='1' type='int' size='1'>
<digest>When set to 1, deletes exported frames from previous export</digest>
<description>When set to 1, automatically deletes all frame_*.png found in the export_folder folder when a new export is triggered (0 by default). Requires the shell external to work.</description>
</attribute>
</attributelist>
<!--RELATED-->
<seealsolist>
<seealso name='agn.remote' />
<seealso name='agn.convert' />
<seealso name='jit.world' />
<seealso name='jit.gl.render' />
<seealso name='shell' />
</seealsolist>
</c74object>

72
docs/agn.remote.maxref.xml

@ -0,0 +1,72 @@
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<c74object name='agn.remote' category='again, loop, video'>
<digest>
Retrieve data from a named agn.host
</digest>
<description>
Receives data comming from the agn.host object, if any, found in the patcher hierarchy.
Outlets are defined by optionnal parameter name arguments. If no extra argument is given, an outlet is provided for each parameter.
</description>
<!--METADATA-->
<metadatalist>
<metadata name='author'>Théophile Clet</metadata>
<metadata name='tag'>again</metadata>
<metadata name='tag'>loop</metadata>
</metadatalist>
<!--ARGUMENTS-->
<objarglist>
<!-- <objarg name='name' optional='0' type='symbol'>
<digest>Name of the agn.host instance to refer to</digest>
<description>Name of the agn.host instance to refer to</description>
</objarg> -->
<objarg name='list' optional='1' type='list'>
<digest>List of parameters to retrieve</digest>
<description>List of parameters to retrieve from agn.host. If nothing is set, the object will output all parameters.</description>
</objarg>
</objarglist>
<!--MESSAGES-->
<methodlist>
<method name="offset">
<digest>Offsets the phase output</digest>
<description>Offset value applied to the phase output</description>
</method>
</methodlist>
<!--ATTRIBUTES-->
<attributelist>
<attribute name='offset' get='0' set='1' type='float' size='1' >
<digest>Offsets the phase output</digest>
<description>Offset value applied to the phase output</description>
</attribute>
</attributelist>
<!--RELATED-->
<seealsolist>
<seealso name='agn.host' />
<seealso name='agn.convert' />
<seealso name='jit.world' />
<seealso name='jit.gl.render' />
</seealsolist>
</c74object>

1251
examples/agn_starter.maxpat

File diff suppressed because it is too large Load Diff

6449
examples/looped_noise_examples.maxpat

File diff suppressed because it is too large Load Diff

5103
examples/space_travel_example.maxpat

File diff suppressed because it is too large Load Diff

677
extras/again.maxpat

@ -0,0 +1,677 @@
{
"patcher" : {
"fileversion" : 1,
"appversion" : {
"major" : 8,
"minor" : 5,
"revision" : 7,
"architecture" : "x64",
"modernui" : 1
}
,
"classnamespace" : "box",
"rect" : [ 677.0, 240.0, 639.0, 404.0 ],
"bglocked" : 0,
"openinpresentation" : 0,
"default_fontsize" : 12.0,
"default_fontface" : 0,
"default_fontname" : "Arial",
"gridonopen" : 1,
"gridsize" : [ 15.0, 15.0 ],
"gridsnaponopen" : 1,
"objectsnaponopen" : 1,
"statusbarvisible" : 2,
"toolbarvisible" : 1,
"lefttoolbarpinned" : 0,
"toptoolbarpinned" : 0,
"righttoolbarpinned" : 0,
"bottomtoolbarpinned" : 0,
"toolbars_unpinned_last_save" : 0,
"tallnewobj" : 0,
"boxanimatetime" : 200,
"enablehscroll" : 1,
"enablevscroll" : 1,
"devicewidth" : 0.0,
"description" : "",
"digest" : "",
"tags" : "",
"style" : "",
"subpatcher_template" : "",
"assistshowspatchername" : 0,
"boxes" : [ {
"box" : {
"id" : "obj-26",
"linecount" : 2,
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 438.375, 231.0, 167.75, 34.0 ],
"text" : "Convert exported animations to GIF or WEBM",
"textjustification" : 1
}
}
, {
"box" : {
"id" : "obj-19",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 249.25, 231.0, 125.0, 20.0 ],
"text" : "Drive your animations",
"textjustification" : 1
}
}
, {
"box" : {
"id" : "obj-23",
"linecount" : 2,
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 47.5, 231.0, 119.0, 34.0 ],
"text" : "Generate bangs\nand export PNG",
"textjustification" : 1
}
}
, {
"box" : {
"fontsize" : 14.0,
"id" : "obj-18",
"linecount" : 3,
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 213.0, 72.0, 198.0, 55.0 ],
"text" : "3 abstractions to help you create and export seamlessly looping videos",
"textjustification" : 1
}
}
, {
"box" : {
"button" : 1,
"id" : "obj-25",
"maxclass" : "tab",
"multiline" : 0,
"numinlets" : 1,
"numoutlets" : 3,
"outlettype" : [ "int", "", "" ],
"parameter_enable" : 0,
"patching_rect" : [ 145.5, 348.0, 333.0, 36.0 ],
"tabs" : [ "Starter", "Looped noise", "Starfield" ]
}
}
, {
"box" : {
"fontface" : 1,
"fontsize" : 14.0,
"id" : "obj-24",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 248.0, 318.0, 128.0, 23.0 ],
"text" : "Example patchers"
}
}
, {
"box" : {
"handoff" : "",
"id" : "obj-15",
"maxclass" : "ubutton",
"numinlets" : 1,
"numoutlets" : 4,
"outlettype" : [ "bang", "bang", "", "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 471.75, 190.0, 101.0, 42.0 ]
}
}
, {
"box" : {
"handoff" : "",
"id" : "obj-9",
"maxclass" : "ubutton",
"numinlets" : 1,
"numoutlets" : 4,
"outlettype" : [ "bang", "bang", "", "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 234.75, 190.0, 154.0, 42.0 ]
}
}
, {
"box" : {
"handoff" : "",
"id" : "obj-2",
"maxclass" : "ubutton",
"numinlets" : 1,
"numoutlets" : 4,
"outlettype" : [ "bang", "bang", "", "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 56.5, 190.0, 101.0, 42.0 ]
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-22",
"linecount" : 2,
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 437.0, 91.0, 191.0, 36.0 ],
"text" : ";\r\nmax launchbrowser https://tflcl.xyz"
}
}
, {
"box" : {
"fontsize" : 12.0,
"id" : "obj-17",
"linecount" : 3,
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 437.0, 14.0, 190.0, 48.0 ],
"text" : "Created by Théophile Clet © 2023\nunder MIT License\ntflcl.xyz",
"textcolor" : [ 0.352941176470588, 0.352941176470588, 0.352941176470588, 1.0 ],
"textjustification" : 2
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-10",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 471.75, 284.0, 120.0, 22.0 ],
"text" : "agn.convert.maxhelp"
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-5",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 235.0, 284.0, 118.0, 22.0 ],
"text" : "agn.remote.maxhelp"
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-8",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 56.5, 284.0, 103.0, 22.0 ],
"text" : "agn.host.maxhelp"
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-12",
"maxclass" : "newobj",
"numinlets" : 0,
"numoutlets" : 1,
"outlettype" : [ "jit_matrix" ],
"patcher" : {
"fileversion" : 1,
"appversion" : {
"major" : 8,
"minor" : 5,
"revision" : 7,
"architecture" : "x64",
"modernui" : 1
}
,
"classnamespace" : "box",
"rect" : [ 59.0, 107.0, 640.0, 480.0 ],
"bglocked" : 0,
"openinpresentation" : 0,
"default_fontsize" : 12.0,
"default_fontface" : 0,
"default_fontname" : "Arial",
"gridonopen" : 1,
"gridsize" : [ 15.0, 15.0 ],
"gridsnaponopen" : 1,
"objectsnaponopen" : 1,
"statusbarvisible" : 2,
"toolbarvisible" : 1,
"lefttoolbarpinned" : 0,
"toptoolbarpinned" : 0,
"righttoolbarpinned" : 0,
"bottomtoolbarpinned" : 0,
"toolbars_unpinned_last_save" : 0,
"tallnewobj" : 0,
"boxanimatetime" : 200,
"enablehscroll" : 1,
"enablevscroll" : 1,
"devicewidth" : 0.0,
"description" : "",
"digest" : "",
"tags" : "",
"style" : "",
"subpatcher_template" : "",
"assistshowspatchername" : 0,
"boxes" : [ {
"box" : {
"id" : "obj-9",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "start" ],
"patching_rect" : [ 420.0, 215.0, 39.0, 22.0 ],
"text" : "t start"
}
}
, {
"box" : {
"id" : "obj-2",
"maxclass" : "newobj",
"numinlets" : 2,
"numoutlets" : 2,
"outlettype" : [ "", "" ],
"patching_rect" : [ 420.0, 188.0, 83.0, 22.0 ],
"text" : "route loadram"
}
}
, {
"box" : {
"id" : "obj-8",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "bang" ],
"patching_rect" : [ 50.0, 100.0, 58.0, 22.0 ],
"text" : "loadbang"
}
}
, {
"box" : {
"id" : "obj-17",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 50.0, 128.0, 76.0, 22.0 ],
"text" : "loadram -0.2"
}
}
, {
"box" : {
"id" : "obj-15",
"maxclass" : "playbar",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "int" ],
"patching_rect" : [ 205.0, 145.0, 133.5, 12.0 ]
}
}
, {
"box" : {
"id" : "obj-5",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ],
"patching_rect" : [ 50.0, 159.0, 389.0, 22.0 ],
"text" : "jit.movie @loop 1 @engine viddll @moviefile tunnel.webm @autostart 0"
}
}
, {
"box" : {
"comment" : "",
"id" : "obj-10",
"index" : 1,
"maxclass" : "outlet",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 50.0, 304.660767000000021, 30.0, 30.0 ]
}
}
],
"lines" : [ {
"patchline" : {
"destination" : [ "obj-5", 0 ],
"source" : [ "obj-15", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-5", 0 ],
"source" : [ "obj-17", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-9", 0 ],
"source" : [ "obj-2", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-10", 0 ],
"source" : [ "obj-5", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-2", 0 ],
"source" : [ "obj-5", 1 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-17", 0 ],
"source" : [ "obj-8", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-5", 0 ],
"source" : [ "obj-9", 0 ]
}
}
]
}
,
"patching_rect" : [ 145.5, 14.0, 51.0, 22.0 ],
"saved_object_attributes" : {
"description" : "",
"digest" : "",
"globalpatchername" : "",
"tags" : ""
}
,
"text" : "p player"
}
}
, {
"box" : {
"id" : "obj-7",
"maxclass" : "jit.pwindow",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ],
"patching_rect" : [ 11.5, 14.0, 132.0, 130.0 ],
"sync" : 1
}
}
, {
"box" : {
"id" : "obj-1",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 11,
"outlettype" : [ "", "int", "", "", "", "", "", "", "", "", "" ],
"patching_rect" : [ 249.75, 200.0, 124.0, 22.0 ],
"text" : "agn.remote"
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-14",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 11.5, 475.0, 51.0, 22.0 ],
"text" : "pcontrol"
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-13",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 11.5, 449.0, 84.0, 22.0 ],
"text" : "loadunique $1"
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-11",
"items" : [ "agn_starter", ",", "looped_noise_examples", ",", "space_travel_example" ],
"maxclass" : "umenu",
"numinlets" : 1,
"numoutlets" : 3,
"outlettype" : [ "int", "", "" ],
"parameter_enable" : 0,
"patching_rect" : [ 145.5, 396.0, 171.0, 22.0 ]
}
}
, {
"box" : {
"id" : "obj-6",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 486.5, 200.0, 71.0, 22.0 ],
"text" : "agn.convert"
}
}
, {
"box" : {
"id" : "obj-4",
"maxclass" : "newobj",
"numinlets" : 6,
"numoutlets" : 3,
"outlettype" : [ "bang", "", "bang" ],
"patching_rect" : [ 71.25, 200.0, 71.5, 22.0 ],
"text" : "agn.host"
}
}
, {
"box" : {
"fontface" : 1,
"fontsize" : 36.0,
"id" : "obj-3",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 255.5, 14.0, 113.0, 48.0 ],
"text" : "again."
}
}
, {
"box" : {
"handoff" : "",
"id" : "obj-20",
"maxclass" : "ubutton",
"numinlets" : 1,
"numoutlets" : 4,
"outlettype" : [ "bang", "bang", "", "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 437.0, 14.0, 191.0, 61.0 ]
}
}
],
"lines" : [ {
"patchline" : {
"destination" : [ "obj-13", 0 ],
"hidden" : 1,
"source" : [ "obj-10", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-13", 0 ],
"hidden" : 1,
"source" : [ "obj-11", 1 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-7", 0 ],
"hidden" : 1,
"source" : [ "obj-12", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-14", 0 ],
"hidden" : 1,
"source" : [ "obj-13", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-10", 0 ],
"hidden" : 1,
"source" : [ "obj-15", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-8", 0 ],
"hidden" : 1,
"source" : [ "obj-2", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-22", 0 ],
"hidden" : 1,
"source" : [ "obj-20", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-11", 0 ],
"hidden" : 1,
"source" : [ "obj-25", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-13", 0 ],
"hidden" : 1,
"source" : [ "obj-5", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-13", 0 ],
"hidden" : 1,
"source" : [ "obj-8", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-5", 0 ],
"hidden" : 1,
"source" : [ "obj-9", 0 ]
}
}
],
"dependency_cache" : [ {
"name" : "again_utils.js",
"bootpath" : "~/Documents/Max 8/Packages/again/javascript",
"patcherrelativepath" : "../javascript",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "agn.convert.maxpat",
"bootpath" : "~/Documents/Max 8/Packages/again/patchers",
"patcherrelativepath" : "../patchers",
"type" : "JSON",
"implicit" : 1
}
, {
"name" : "agn.host.maxpat",
"bootpath" : "~/Documents/Max 8/Packages/again/patchers",
"patcherrelativepath" : "../patchers",
"type" : "JSON",
"implicit" : 1
}
, {
"name" : "agn.remote.maxpat",
"bootpath" : "~/Documents/Max 8/Packages/again/patchers",
"patcherrelativepath" : "../patchers",
"type" : "JSON",
"implicit" : 1
}
, {
"name" : "agn_host.js",
"bootpath" : "~/Documents/Max 8/Packages/again/javascript",
"patcherrelativepath" : "../javascript",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "agn_remote.js",
"bootpath" : "~/Documents/Max 8/Packages/again/javascript",
"patcherrelativepath" : "../javascript",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "shell.mxe64",
"type" : "mx64"
}
],
"autosave" : 0
}
}

692
help/agn.convert.maxhelp

@ -0,0 +1,692 @@
{
"patcher" : {
"fileversion" : 1,
"appversion" : {
"major" : 8,
"minor" : 5,
"revision" : 6,
"architecture" : "x64",
"modernui" : 1
}
,
"classnamespace" : "box",
"rect" : [ 457.0, 205.0, 741.0, 528.0 ],
"bglocked" : 0,
"openinpresentation" : 0,
"default_fontsize" : 12.0,
"default_fontface" : 0,
"default_fontname" : "Arial",
"gridonopen" : 1,
"gridsize" : [ 15.0, 15.0 ],
"gridsnaponopen" : 1,
"objectsnaponopen" : 1,
"statusbarvisible" : 2,
"toolbarvisible" : 1,
"lefttoolbarpinned" : 0,
"toptoolbarpinned" : 0,
"righttoolbarpinned" : 0,
"bottomtoolbarpinned" : 0,
"toolbars_unpinned_last_save" : 0,
"tallnewobj" : 0,
"boxanimatetime" : 200,
"enablehscroll" : 1,
"enablevscroll" : 1,
"devicewidth" : 0.0,
"description" : "",
"digest" : "",
"tags" : "",
"style" : "",
"subpatcher_template" : "",
"assistshowspatchername" : 0,
"boxes" : [ {
"box" : {
"id" : "obj-29",
"linecount" : 3,
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 454.5, 343.0, 178.0, 48.0 ],
"text" : "Download the package or executable file for your operating system, and install it."
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-23",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "bang" ],
"patching_rect" : [ 767.0, 347.0, 22.0, 22.0 ],
"text" : "t b"
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-24",
"linecount" : 2,
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 709.0, 447.0, 290.0, 36.0 ],
"presentation_linecount" : 3,
"text" : ";\r\nmax launchbrowser https://ffmpeg.org/download.html"
}
}
, {
"box" : {
"id" : "obj-21",
"maxclass" : "textbutton",
"numinlets" : 1,
"numoutlets" : 3,
"outlettype" : [ "", "", "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 498.0, 313.0, 91.0, 23.0 ],
"text" : "ffmpeg"
}
}
, {
"box" : {
"fontface" : 1,
"id" : "obj-17",
"linecount" : 2,
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 394.0, 167.0, 299.0, 34.0 ],
"text" : "agn.convert requires the shell external and ffmpeg installed on your computer to work properly."
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-15",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "bang" ],
"patching_rect" : [ 767.0, 208.0, 22.0, 22.0 ],
"text" : "t b"
}
}
, {
"box" : {
"id" : "obj-13",
"maxclass" : "textbutton",
"numinlets" : 1,
"numoutlets" : 3,
"outlettype" : [ "", "", "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 498.0, 208.0, 91.0, 23.0 ],
"text" : "shell external"
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-8",
"linecount" : 2,
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 767.0, 237.0, 465.0, 36.0 ],
"text" : ";\r\nmax launchbrowser https://github.com/jeremybernstein/shell/releases/"
}
}
, {
"box" : {
"id" : "obj-4",
"linecount" : 3,
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 452.5, 237.0, 182.0, 48.0 ],
"text" : "Download latest release (.zip), and unzip the folder inside of your Max packages folder."
}
}
, {
"box" : {
"id" : "obj-18",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "jit_gl_texture" ],
"patcher" : {
"fileversion" : 1,
"appversion" : {
"major" : 8,
"minor" : 5,
"revision" : 6,
"architecture" : "x64",
"modernui" : 1
}
,
"classnamespace" : "box",
"rect" : [ 588.0, 150.0, 640.0, 480.0 ],
"bglocked" : 0,
"openinpresentation" : 0,
"default_fontsize" : 12.0,
"default_fontface" : 0,
"default_fontname" : "Arial",
"gridonopen" : 1,
"gridsize" : [ 15.0, 15.0 ],
"gridsnaponopen" : 1,
"objectsnaponopen" : 1,
"statusbarvisible" : 2,
"toolbarvisible" : 1,
"lefttoolbarpinned" : 0,
"toptoolbarpinned" : 0,
"righttoolbarpinned" : 0,
"bottomtoolbarpinned" : 0,
"toolbars_unpinned_last_save" : 0,
"tallnewobj" : 0,
"boxanimatetime" : 200,
"enablehscroll" : 1,
"enablevscroll" : 1,
"devicewidth" : 0.0,
"description" : "",
"digest" : "",
"tags" : "",
"style" : "",
"subpatcher_template" : "",
"assistshowspatchername" : 0,
"boxes" : [ {
"box" : {
"id" : "obj-15",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 159.0, 231.0, 75.0, 22.0 ],
"text" : "prepend text"
}
}
, {
"box" : {
"id" : "obj-14",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 159.0, 192.0, 143.0, 22.0 ],
"text" : "agn.remote frame_export"
}
}
, {
"box" : {
"id" : "obj-13",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ],
"patching_rect" : [ 159.0, 269.0, 359.0, 22.0 ],
"text" : "jit.gl.text @align 1 @fontsize 80 @position 0 -0.3 0 @color 1 0 1 1"
}
}
, {
"box" : {
"id" : "obj-3",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 3,
"outlettype" : [ "jit_gl_texture", "bang", "" ],
"patching_rect" : [ 50.0, 100.0, 490.0, 22.0 ],
"text" : "jit.world @name agn.convert @size 150 150 @capture 1 @enable 1 @erase_color 0 0 0 0"
}
}
, {
"box" : {
"comment" : "",
"id" : "obj-16",
"index" : 1,
"maxclass" : "inlet",
"numinlets" : 0,
"numoutlets" : 1,
"outlettype" : [ "bang" ],
"patching_rect" : [ 50.0, 40.0, 30.0, 30.0 ]
}
}
, {
"box" : {
"comment" : "",
"id" : "obj-17",
"index" : 1,
"maxclass" : "outlet",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 50.0, 297.0, 30.0, 30.0 ]
}
}
],
"lines" : [ {
"patchline" : {
"destination" : [ "obj-15", 0 ],
"source" : [ "obj-14", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-13", 0 ],
"source" : [ "obj-15", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-3", 0 ],
"source" : [ "obj-16", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-17", 0 ],
"source" : [ "obj-3", 0 ]
}
}
]
}
,
"patching_rect" : [ 10.0, 367.0, 51.0, 22.0 ],
"saved_object_attributes" : {
"description" : "",
"digest" : "",
"globalpatchername" : "",
"tags" : ""
}
,
"text" : "p scene"
}
}
, {
"box" : {
"id" : "obj-12",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 62.5, 484.0, 91.0, 22.0 ],
"text" : "print @popup 1"
}
}
, {
"box" : {
"id" : "obj-11",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 62.5, 451.0, 71.0, 22.0 ],
"text" : "agn.convert"
}
}
, {
"box" : {
"id" : "obj-7",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 108.0, 417.0, 41.0, 22.0 ],
"text" : "webm"
}
}
, {
"box" : {
"id" : "obj-5",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 62.5, 417.0, 29.5, 22.0 ],
"text" : "gif"
}
}
, {
"box" : {
"id" : "obj-2",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 10.0, 263.0, 70.0, 22.0 ],
"text" : "loadmess 1"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-30",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 123.0, 160.0, 164.0, 24.0 ],
"text" : "Choose your export folder"
}
}
, {
"box" : {
"id" : "obj-28",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 97.0, 219.0, 126.0, 22.0 ],
"text" : "prepend export_folder"
}
}
, {
"box" : {
"id" : "obj-27",
"maxclass" : "button",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 97.0, 160.0, 24.0, 24.0 ]
}
}
, {
"box" : {
"id" : "obj-25",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"patching_rect" : [ 97.0, 191.0, 90.0, 22.0 ],
"text" : "opendialog fold"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-20",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 180.0, 262.0, 105.0, 24.0 ],
"text" : "Trigger export"
}
}
, {
"box" : {
"id" : "obj-10",
"maxclass" : "button",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 154.0, 262.0, 24.0, 24.0 ]
}
}
, {
"box" : {
"id" : "obj-1",
"maxclass" : "newobj",
"numinlets" : 6,
"numoutlets" : 3,
"outlettype" : [ "bang", "", "bang" ],
"patching_rect" : [ 10.0, 334.0, 71.5, 22.0 ],
"text" : "agn.host",
"varname" : "agn.host"
}
}
, {
"box" : {
"border" : 0,
"filename" : "helpdetails.js",
"id" : "obj-22",
"ignoreclick" : 1,
"jsarguments" : [ "agn.convert" ],
"maxclass" : "jsui",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"parameter_enable" : 0,
"patching_rect" : [ 10.0, 10.0, 690.0, 136.0 ]
}
}
, {
"box" : {
"background" : 1,
"bgcolor" : [ 1.0, 0.658824, 0.14902, 1.0 ],
"fontname" : "Arial Bold",
"hint" : "",
"id" : "obj-19",
"ignoreclick" : 1,
"legacytextcolor" : 1,
"maxclass" : "textbutton",
"numinlets" : 1,
"numoutlets" : 3,
"outlettype" : [ "", "", "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 132.0, 264.0, 20.0, 20.0 ],
"rounded" : 60.0,
"text" : "2",
"textcolor" : [ 0.2, 0.2, 0.2, 1.0 ]
}
}
, {
"box" : {
"background" : 1,
"bgcolor" : [ 1.0, 0.658824, 0.14902, 1.0 ],
"fontname" : "Arial Bold",
"hint" : "",
"id" : "obj-31",
"ignoreclick" : 1,
"legacytextcolor" : 1,
"maxclass" : "textbutton",
"numinlets" : 1,
"numoutlets" : 3,
"outlettype" : [ "", "", "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 72.0, 162.0, 20.0, 20.0 ],
"rounded" : 60.0,
"text" : "1",
"textcolor" : [ 0.2, 0.2, 0.2, 1.0 ]
}
}
],
"lines" : [ {
"patchline" : {
"destination" : [ "obj-18", 0 ],
"source" : [ "obj-1", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-5", 0 ],
"source" : [ "obj-1", 2 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-1", 0 ],
"source" : [ "obj-10", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-12", 0 ],
"source" : [ "obj-11", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-15", 0 ],
"hidden" : 1,
"source" : [ "obj-13", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-8", 0 ],
"hidden" : 1,
"source" : [ "obj-15", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-1", 5 ],
"midpoints" : [ 19.5, 396.0, 90.75, 396.0, 90.75, 323.0, 72.0, 323.0 ],
"source" : [ "obj-18", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-1", 0 ],
"source" : [ "obj-2", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-23", 0 ],
"hidden" : 1,
"source" : [ "obj-21", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-24", 0 ],
"hidden" : 1,
"source" : [ "obj-23", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-28", 0 ],
"source" : [ "obj-25", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-25", 0 ],
"source" : [ "obj-27", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-1", 0 ],
"source" : [ "obj-28", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-11", 0 ],
"source" : [ "obj-5", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-11", 0 ],
"source" : [ "obj-7", 0 ]
}
}
],
"dependency_cache" : [ {
"name" : "again_utils.js",
"bootpath" : "~/Documents/Max 8/Packages/again/javascript",
"patcherrelativepath" : "../javascript",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "agn.convert.maxpat",
"bootpath" : "~/Documents/Max 8/Packages/again/patchers",
"patcherrelativepath" : "../patchers",
"type" : "JSON",
"implicit" : 1
}
, {
"name" : "agn.host.maxpat",
"bootpath" : "~/Documents/Max 8/Packages/again/patchers",
"patcherrelativepath" : "../patchers",
"type" : "JSON",
"implicit" : 1
}
, {
"name" : "agn.remote.maxpat",
"bootpath" : "~/Documents/Max 8/Packages/again/patchers",
"patcherrelativepath" : "../patchers",
"type" : "JSON",
"implicit" : 1
}
, {
"name" : "agn_host.js",
"bootpath" : "~/Documents/Max 8/Packages/again/javascript",
"patcherrelativepath" : "../javascript",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "agn_remote.js",
"bootpath" : "~/Documents/Max 8/Packages/again/javascript",
"patcherrelativepath" : "../javascript",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "helpdetails.js",
"bootpath" : "C74:/help/resources",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "shell.mxe64",
"type" : "mx64"
}
],
"autosave" : 0
}
}

1078
help/agn.host.maxhelp

File diff suppressed because it is too large Load Diff

902
help/agn.remote.maxhelp

@ -0,0 +1,902 @@
{
"patcher" : {
"fileversion" : 1,
"appversion" : {
"major" : 8,
"minor" : 5,
"revision" : 6,
"architecture" : "x64",
"modernui" : 1
}
,
"classnamespace" : "box",
"rect" : [ 100.0, 100.0, 635.0, 564.0 ],
"bglocked" : 0,
"openinpresentation" : 0,
"default_fontsize" : 12.0,
"default_fontface" : 0,
"default_fontname" : "Arial",
"gridonopen" : 1,
"gridsize" : [ 15.0, 15.0 ],
"gridsnaponopen" : 1,
"objectsnaponopen" : 1,
"statusbarvisible" : 2,
"toolbarvisible" : 1,
"lefttoolbarpinned" : 0,
"toptoolbarpinned" : 0,
"righttoolbarpinned" : 0,
"bottomtoolbarpinned" : 0,
"toolbars_unpinned_last_save" : 0,
"tallnewobj" : 0,
"boxanimatetime" : 200,
"enablehscroll" : 1,
"enablevscroll" : 1,
"devicewidth" : 0.0,
"description" : "",
"digest" : "",
"tags" : "",
"style" : "",
"subpatcher_template" : "",
"showontab" : 1,
"assistshowspatchername" : 0,
"title" : "agn.remote",
"boxes" : [ {
"box" : {
"border" : 0,
"filename" : "helpdetails.js",
"id" : "obj-22",
"ignoreclick" : 1,
"jsarguments" : [ "agn.remote" ],
"maxclass" : "jsui",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"parameter_enable" : 0,
"patching_rect" : [ 10.0, 10.0, 578.0, 125.0 ]
}
}
, {
"box" : {
"hidden" : 1,
"id" : "obj-31",
"maxclass" : "newobj",
"numinlets" : 0,
"numoutlets" : 0,
"patcher" : {
"fileversion" : 1,
"appversion" : {
"major" : 8,
"minor" : 5,
"revision" : 6,
"architecture" : "x64",
"modernui" : 1
}
,
"classnamespace" : "box",
"rect" : [ 0.0, 26.0, 635.0, 538.0 ],
"bglocked" : 0,
"openinpresentation" : 0,
"default_fontsize" : 12.0,
"default_fontface" : 0,
"default_fontname" : "Arial",
"gridonopen" : 1,
"gridsize" : [ 15.0, 15.0 ],
"gridsnaponopen" : 1,
"objectsnaponopen" : 1,
"statusbarvisible" : 2,
"toolbarvisible" : 1,
"lefttoolbarpinned" : 0,
"toptoolbarpinned" : 0,
"righttoolbarpinned" : 0,
"bottomtoolbarpinned" : 0,
"toolbars_unpinned_last_save" : 0,
"tallnewobj" : 0,
"boxanimatetime" : 200,
"enablehscroll" : 1,
"enablevscroll" : 1,
"devicewidth" : 0.0,
"description" : "",
"digest" : "",
"tags" : "",
"style" : "",
"subpatcher_template" : "",
"showontab" : 1,
"assistshowspatchername" : 0,
"boxes" : [ {
"box" : {
"id" : "obj-5",
"maxclass" : "toggle",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 168.0, 365.60000000000008, 24.0, 24.0 ]
}
}
, {
"box" : {
"border" : 0,
"filename" : "helpname.js",
"id" : "obj-13",
"ignoreclick" : 1,
"jsarguments" : [ "agn.remote" ],
"maxclass" : "jsui",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"parameter_enable" : 0,
"patching_rect" : [ 10.0, 10.0, 243.99200439453125, 57.600002288818359 ]
}
}
, {
"box" : {
"fontname" : "Lato Regular",
"fontsize" : 13.0,
"id" : "obj-36",
"linecount" : 2,
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 10.0, 81.600002288818359, 313.0, 38.0 ],
"text" : "Outlet presence and order can be defined with arguments. The @offset attribute offsets the phase.",
"textcolor" : [ 0.32549, 0.345098, 0.372549, 1.0 ]
}
}
, {
"box" : {
"fontname" : "Lato Regular",
"fontsize" : 13.0,
"id" : "obj-37",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 10.0, 63.600002288818359, 274.0, 22.0 ],
"text" : "Extra arguments and offset."
}
}
, {
"box" : {
"id" : "obj-7",
"maxclass" : "slider",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"parameter_enable" : 0,
"patching_rect" : [ 268.0, 451.60000000000008, 155.0, 13.0 ]
}
}
, {
"box" : {
"id" : "obj-8",
"maxclass" : "newobj",
"numinlets" : 6,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 268.0, 415.60000000000008, 97.0, 22.0 ],
"text" : "scale 0. 1. 0 127"
}
}
, {
"box" : {
"id" : "obj-10",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "int" ],
"patching_rect" : [ 268.0, 328.0, 170.0, 22.0 ],
"text" : "agn.remote phase @offset 0.5"
}
}
, {
"box" : {
"id" : "obj-2",
"maxclass" : "slider",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"parameter_enable" : 0,
"patching_rect" : [ 89.0, 451.60000000000008, 155.0, 13.0 ]
}
}
, {
"box" : {
"id" : "obj-1",
"maxclass" : "newobj",
"numinlets" : 6,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 89.0, 415.60000000000008, 97.0, 22.0 ],
"text" : "scale 0. 1. 0 127"
}
}
, {
"box" : {
"format" : 6,
"id" : "obj-25",
"maxclass" : "flonum",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 10.0, 259.0, 50.0, 22.0 ]
}
}
, {
"box" : {
"id" : "obj-20",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 10.0, 292.0, 54.0, 22.0 ],
"text" : "offset $1"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-16",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 66.0, 258.0, 117.0, 24.0 ],
"text" : "Offset the phase!"
}
}
, {
"box" : {
"id" : "obj-12",
"maxclass" : "number",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 10.0, 365.60000000000008, 50.0, 22.0 ]
}
}
, {
"box" : {
"id" : "obj-4",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 3,
"outlettype" : [ "", "int", "" ],
"patching_rect" : [ 10.0, 328.0, 177.0, 22.0 ],
"text" : "agn.remote frame phase render"
}
}
],
"lines" : [ {
"patchline" : {
"destination" : [ "obj-2", 0 ],
"source" : [ "obj-1", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-8", 0 ],
"source" : [ "obj-10", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-4", 0 ],
"source" : [ "obj-20", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-20", 0 ],
"source" : [ "obj-25", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-1", 0 ],
"source" : [ "obj-4", 1 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-12", 0 ],
"source" : [ "obj-4", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-5", 0 ],
"source" : [ "obj-4", 2 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-7", 0 ],
"source" : [ "obj-8", 0 ]
}
}
]
}
,
"patching_rect" : [ 483.999999999999886, 141.0, 170.0, 22.0 ],
"saved_object_attributes" : {
"description" : "",
"digest" : "",
"globalpatchername" : "",
"tags" : ""
}
,
"text" : "p \"extra arguments and offset\""
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-29",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 180.399999999999977, 416.799999999999955, 129.0, 24.0 ],
"text" : "Change inter-frame"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-27",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 121.200000000000045, 382.0, 114.0, 24.0 ],
"text" : "Change duration"
}
}
, {
"box" : {
"id" : "obj-23",
"maxclass" : "number",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 128.399999999999977, 416.799999999999955, 50.0, 22.0 ]
}
}
, {
"box" : {
"format" : 6,
"id" : "obj-8",
"maxclass" : "flonum",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 69.200000000000045, 382.0, 50.0, 22.0 ]
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-48",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 509.0, 492.999999999999943, 92.0, 24.0 ],
"text" : "Export FPS"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-47",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 464.299999999999955, 461.800000000000011, 92.0, 24.0 ],
"text" : "Render FPS"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-46",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 421.000000000000057, 430.599999999999966, 102.0, 24.0 ],
"text" : "Loop duration "
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-45",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 372.000000000000057, 399.400000000000034, 220.0, 24.0 ],
"text" : "Number of frames to export per loop"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-44",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 327.300000000000011, 369.200000000000045, 220.0, 24.0 ],
"text" : "Number of frames to render per loop"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-43",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 257.5, 336.000000000000057, 88.0, 24.0 ],
"text" : "Render flag"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-42",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 212.0, 302.800000000000068, 83.0, 24.0 ],
"text" : "Export flag"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-41",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 196.100000000000023, 270.60000000000008, 264.0, 24.0 ],
"text" : "Current exported frame number (if exporting)"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-40",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 151.400000000000006, 239.400000000000034, 195.0, 24.0 ],
"text" : "Current rendered frame number"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-39",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 106.100000000000023, 208.200000000000045, 88.0, 24.0 ],
"text" : "Loop phase"
}
}
, {
"box" : {
"bubble" : 1,
"id" : "obj-38",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 36.0, 178.0, 117.0, 24.0 ],
"text" : "Rendering bangs"
}
}
, {
"box" : {
"id" : "obj-36",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 3,
"outlettype" : [ "jit_matrix", "bang", "" ],
"patching_rect" : [ 10.0, 494.0, 111.0, 22.0 ],
"text" : "jit.world @enable 1"
}
}
, {
"box" : {
"id" : "obj-34",
"maxclass" : "toggle",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 10.0, 382.0, 24.0, 24.0 ]
}
}
, {
"box" : {
"format" : 6,
"id" : "obj-32",
"maxclass" : "flonum",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 457.0, 494.0, 50.0, 22.0 ]
}
}
, {
"box" : {
"format" : 6,
"id" : "obj-30",
"maxclass" : "flonum",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 412.299999999999955, 462.800000000000011, 50.0, 22.0 ]
}
}
, {
"box" : {
"format" : 6,
"id" : "obj-26",
"maxclass" : "flonum",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 367.600000000000023, 431.600000000000023, 50.0, 22.0 ]
}
}
, {
"box" : {
"id" : "obj-24",
"maxclass" : "number",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 322.899999999999977, 400.400000000000034, 50.0, 22.0 ]
}
}
, {
"box" : {
"id" : "obj-21",
"maxclass" : "number",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 278.199999999999989, 369.200000000000045, 50.0, 22.0 ]
}
}
, {
"box" : {
"id" : "obj-19",
"maxclass" : "toggle",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 233.5, 336.000000000000057, 24.0, 24.0 ]
}
}
, {
"box" : {
"id" : "obj-17",
"maxclass" : "toggle",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "int" ],
"parameter_enable" : 0,
"patching_rect" : [ 189.0, 302.800000000000068, 24.0, 24.0 ]
}
}
, {
"box" : {
"id" : "obj-15",
"maxclass" : "number",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 144.100000000000023, 271.600000000000023, 50.0, 22.0 ]
}
}
, {
"box" : {
"id" : "obj-13",
"maxclass" : "number",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 99.400000000000006, 240.400000000000034, 50.0, 22.0 ]
}
}
, {
"box" : {
"format" : 6,
"id" : "obj-11",
"maxclass" : "flonum",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 54.699999999999989, 209.200000000000017, 50.0, 22.0 ]
}
}
, {
"box" : {
"id" : "obj-5",
"maxclass" : "button",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 10.0, 176.0, 24.0, 24.0 ]
}
}
, {
"box" : {
"id" : "obj-3",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 10.0, 351.0, 70.0, 22.0 ],
"text" : "loadmess 1"
}
}
, {
"box" : {
"id" : "obj-2",
"maxclass" : "newobj",
"numinlets" : 6,
"numoutlets" : 3,
"outlettype" : [ "bang", "", "bang" ],
"patching_rect" : [ 10.0, 457.0, 71.5, 22.0 ],
"text" : "agn.host",
"varname" : "agn.host"
}
}
, {
"box" : {
"id" : "obj-1",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 11,
"outlettype" : [ "", "int", "", "", "", "", "", "", "", "", "" ],
"patching_rect" : [ 10.0, 141.0, 465.999999999999943, 22.0 ],
"text" : "agn.remote"
}
}
],
"lines" : [ {
"patchline" : {
"destination" : [ "obj-11", 0 ],
"source" : [ "obj-1", 1 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-13", 0 ],
"source" : [ "obj-1", 2 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-15", 0 ],
"source" : [ "obj-1", 3 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-17", 0 ],
"source" : [ "obj-1", 4 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-19", 0 ],
"source" : [ "obj-1", 5 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-21", 0 ],
"source" : [ "obj-1", 6 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-24", 0 ],
"source" : [ "obj-1", 7 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-26", 0 ],
"source" : [ "obj-1", 8 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-30", 0 ],
"source" : [ "obj-1", 9 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-32", 0 ],
"source" : [ "obj-1", 10 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-5", 0 ],
"source" : [ "obj-1", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-36", 0 ],
"source" : [ "obj-2", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-2", 4 ],
"source" : [ "obj-23", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-34", 0 ],
"source" : [ "obj-3", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-2", 0 ],
"source" : [ "obj-34", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-2", 2 ],
"source" : [ "obj-8", 0 ]
}
}
],
"dependency_cache" : [ {
"name" : "again_utils.js",
"bootpath" : "~/Documents/Max 8/Packages/again/javascript",
"patcherrelativepath" : "../javascript",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "agn.host.maxpat",
"bootpath" : "~/Documents/Max 8/Packages/again/patchers",
"patcherrelativepath" : "../patchers",
"type" : "JSON",
"implicit" : 1
}
, {
"name" : "agn.remote.maxpat",
"bootpath" : "~/Documents/Max 8/Packages/again/patchers",
"patcherrelativepath" : "../patchers",
"type" : "JSON",
"implicit" : 1
}
, {
"name" : "agn_host.js",
"bootpath" : "~/Documents/Max 8/Packages/again/javascript",
"patcherrelativepath" : "../javascript",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "agn_remote.js",
"bootpath" : "~/Documents/Max 8/Packages/again/javascript",
"patcherrelativepath" : "../javascript",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "helpdetails.js",
"bootpath" : "C74:/help/resources",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "helpname.js",
"bootpath" : "C74:/help/resources",
"type" : "TEXT",
"implicit" : 1
}
, {
"name" : "shell.mxe64",
"type" : "mx64"
}
],
"autosave" : 0
}
}

19
javascript/again_utils.js

@ -0,0 +1,19 @@
function get_top_level_patcher()
{
var p = this.patcher;
while (p.parentpatcher) // If I have a parent, keep going up
{
p = p.parentpatcher;
}
return p;
// var prev = 0;
// var owner = this.patcher.box;
// while (owner) {
// prev = owner;
// owner = owner.patcher.box;
// }
// if (prev)
// // post("top patcher is",prev.patcher.name);
// return prev.patcher;
}

65
javascript/agn_host.js

@ -0,0 +1,65 @@
// One day this might handle most of the [agn.host] mechanism.
include("again_utils.js")
autowatch = 1;
inlets = 1;
outlets = 1;
var host_name = null;
var top_level_patcher = null;
function loadbang() {
top_level_patcher = get_top_level_patcher();
host_name = jsarguments[1];
if (top_level_patcher) {
// post("toplevel patcher: " + top_level_patcher.name); post();
// outlet(0, host_name);
// check_for_other_host();
set_all_agn_host_name();
}
}
function set_all_agn_host_name() {
if (top_level_patcher) {
top_level_patcher.applydeep(send_agn_host_name);
}
}
// set_all_agn_host_name.local = 0;
function send_agn_host_name (obj) {
if (obj.maxclass === "js") {
// post("js obj:" + obj.maxclass); post();
var patcher_name = obj.patcher.getattr("name");
if (["agn.remote","agn.convert"].indexOf(patcher_name) > -1) {
// post(obj.varname); post();
obj.message("set_agn_host_name", host_name);
}
}
}
// send_agn_host_name.local = 0;
function request_host_name() {
set_all_agn_host_name();
}
// request_host_name.local = 0;
function check_for_other_host() {
top_level_patcher.applydeep(check_is_agn_host);
}
// Need some logic to detect if the currently check agn.host is this agn.host
function check_is_agn_host (obj) {
if (obj.maxclass === "js") {
var patcher_name = obj.patcher.getattr("name");
if (patcher_name === "agn.host") {
error("An agn.host object already exist in the patcher hierarchy. Please delete one."); post();
}
}
}

60
javascript/agn_remote.js

@ -0,0 +1,60 @@
include("again_utils.js")
outlets = 2;
var top_level_patcher = null;
// var agn_host_js = null;
var host_name = null;
var remote_args = [];
// var patcherargs = null;
function loadbang() {
// post("this: " + this.box.maxclass);
// patcherargs = this.patcher.newdefault(400, 25, "patcherargs", "test");
// this.patcher.connect(patcherargs, 0, this.box, 0);
// patcherargs.bang();
top_level_patcher = get_top_level_patcher();
top_level_patcher.applydeep(get_host_name);
}
// function anything() {
// remote_args = arrayfromargs(messagename,arguments);
// post("number of args: " + remote_args.length);
// if (remote_args.length == 0) {
// outlet(1, "dump");
// } else {
// outlet(1, remote_args);
// }
// }
function get_host_name(obj) {
if (obj.maxclass === "js") {
// post(obj.varname); post();
if (obj.patcher.getattr("name") === "agn.host") {
// post("troué !! " + obj.value); post();
obj.message("request_host_name");
}
}
}
function set_agn_host_name(param) {
// post("set host name: " + param); post();
if (host_name !== param) {
host_name = param;
outlet(0, param);
// if (remote_args.length == 0) {
// outlet(1, "dump");
// } else {
// outlet(1, remote_args);
// }
}
}

24
license.md

@ -0,0 +1,24 @@
MIT License
Copyright (c) 2023 Théophile Clet
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Additionnal licensing:
shell object: MIT License - Copyright (c) 2013-2018 Jeremy Bernstein and Bill Orcutt

BIN
media/tunnel.webm

Binary file not shown.

28
package-info.json

@ -0,0 +1,28 @@
{
"name" : "Again",
"displayname" : "",
"version" : "0.0.1",
"author" : "Théophile Clet",
"authors" : [ ],
"description" : "Create and export seamlessly looping videos",
"tags" : ["animation", "loop", "noise", "video", "gif"],
"website" : "",
"extends" : "",
"extensible" : 0,
"max_version_min" : "8.5.6",
"max_version_max" : "none",
"os" : {
"macintosh" : {
"min_version" : "10.11.x",
"platform" : [ "x64", "aarch64" ]
}
,
"windows" : {
"min_version" : "10",
"platform" : [ "x64" ]
}
}
,
"homepatcher" : "NOTHEREYET.maxpat"
}

2356
patchers/agn.convert.maxpat

File diff suppressed because it is too large Load Diff

4620
patchers/agn.host.maxpat

File diff suppressed because it is too large Load Diff

2818
patchers/agn.remote.maxpat

File diff suppressed because it is too large Load Diff

3
readme.md

@ -0,0 +1,3 @@
#Again
Again, or agn., is a Max package for creating perfectly looping animations and export them as PNG frames, GIFs or WEBM files.
Loading…
Cancel
Save