[{"data":1,"prerenderedAt":780},["ShallowReactive",2],{"docs":3,"doc:\u002Fdocs\u002Fformat\u002Fplugins":88},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84],{"path":5,"title":6,"description":7},"\u002Fdocs\u002Fcodemods","Codemods","A codemod is a small program that changes Live Sets. livesaver runs it over folders of sets, shows\nwhat would change, and with --apply writes the changes the same way every livesaver command\ndoes: the result must be well-formed XML, Live's backup scheme is followed\n(Backup\u002F\u003Cset> [date time].als), the run is journaled, and livesaver undo \u003Crun> puts every set\nback.",{"path":9,"title":10,"description":11},"\u002Fdocs\u002Fformat","Ableton Live file formats — what livesaver relies on","Facts collected from Live's own files (verified against real sets) and public research\n(Steinberg VST3 SDK, JUCE, Ableton's maxdevtools). Each page names its sources.",{"path":13,"title":14,"description":15},"\u002Fdocs\u002Fformat\u002Fcontainers","Containers and id spaces","How Live's files are packed: which are gzip-compressed XML and which are binary, what lies beside them, and how the ids inside a document are numbered.",{"path":17,"title":18,"description":19},"\u002Fdocs\u002Fformat\u002Ffileref","FileRef","A \u003CFileRef> locates one file. It appears in many containers, but only some are real dependencies.",{"path":21,"title":22,"description":23},"\u002Fdocs\u002Fformat\u002Ffinder","Finder tags, comments and plug-in bundles (macOS)","What status, reorg and the plug-in inventory read and write outside Live's own files.",{"path":25,"title":26,"description":27},"\u002Fdocs\u002Fformat\u002Ffingerprints","Fingerprints","How Live recognises a file again: the size and the checksum it stores with every reference, where vendors and pack updates break that, and what livesaver compares instead.",{"path":29,"title":30,"description":31},"\u002Fdocs\u002Fformat\u002Flive-setup","Live installation and library locations","Where Live keeps its app resources, its library folders and its own databases, and how livesaver finds them without being told. Everything below was read on a Mac; Windows is at the end, from Ableton's documentation.",{"path":33,"title":34,"description":35},"\u002Fdocs\u002Fformat\u002Fplugins","Plug-ins in Live Sets","How a Live Set stores a plug-in in each format, how the same plug-in is recognised across formats, and what an upgrade from VST2 to VST3 has to carry over.",{"path":37,"title":38,"description":39},"\u002Fdocs\u002Fformat\u002Fversions","\u003CAbleton> root attributes per Live version","The root is \u003CAbleton MajorVersion MinorVersion SchemaChangeCount Creator Revision>. Creator is \"Ableton Live x.y.z\".",{"path":41,"title":42,"description":43},"\u002Fdocs\u002Fguide\u002Fbrowser","In the browser","The app also runs on its own, as a page in your browser. It reads the folders you give it and changes nothing: good for a first look, or on a computer where you cannot install anything. In Chrome and Edge it can also fix samples and upgrade plug-ins, if you switch that on: see Fixing in the page.",{"path":45,"title":46,"description":47},"\u002Fdocs\u002Fguide\u002Fcommand-line","The command line","Everything the app does, the livesaver command does too, and more: project status in Finder, a catalog of your sets to search, and codemods. Every command only plans unless you pass --apply.",{"path":49,"title":50,"description":51},"\u002Fdocs\u002Fguide\u002Fgetting-started","Getting started","livesaver finds the samples your Ableton Live sets have lost, collects them into their projects, and shows which plug-ins are missing. This page takes you from nothing to your first scan.",{"path":53,"title":54,"description":55},"\u002Fdocs\u002Fguide\u002Fhistory","History and undo","Everything livesaver changes is written down as a run: what it was asked, every step it took, and the original of every set it rewrote. That is what makes an undo possible, also weeks later.",{"path":57,"title":58,"description":59},"\u002Fdocs\u002Fguide\u002Fmissing","When samples stay missing","A fix can only find what is in the folders it searches. What stays missing is listed by where it came from, because what helps differs: a pack is installed again, an old drive is plugged in, a folder is added.",{"path":61,"title":62,"description":63},"\u002Fdocs\u002Fguide\u002Fplugins","Plug-ins","Live finds a plug-in by its format and its id, never by its name. livesaver reads which plug-ins your sets use and compares them with what is installed, the way Live does, so you know before you open a set what will be missing in it.",{"path":65,"title":66,"description":67},"\u002Fdocs\u002Fguide\u002Fquestions","Questions and answers","Short answers to what comes up first. If yours is not here, ask on GitHub.",{"path":69,"title":70,"description":71},"\u002Fdocs\u002Fguide\u002Fsafety","How your work is kept safe","livesaver edits the files your music lives in. These are the rules it keeps, so that nothing is lost.",{"path":73,"title":74,"description":75},"\u002Fdocs\u002Fguide\u002Fsamples","Fix missing samples","A set that has lost its samples opens in Live with “Media files are missing”. livesaver finds the files again by what they are, puts them into the project, and points the set at them, for every project at once.",{"path":77,"title":78,"description":79},"\u002Fdocs\u002Fguide\u002Fwindows","livesaver on Windows","livesaver is made and tested on a Mac. Windows is new: it is built from what Ableton documents about Live on Windows and from the way sets that were saved on Windows store their files. No one has tried it on a Windows computer with Live yet. This page says what is there, what differs from a Mac, and what is not known.",{"path":81,"title":82,"description":83},"\u002Fdocs\u002Fverification","Verification","What is checked, and how to repeat it. Checks on a real library are read-only; everything that\nwrites runs on temporary copies.",{"path":85,"title":86,"description":87},"\u002Fdocs\u002Fweb","The web app","apps\u002Fweb is one app (Vite, Vue, Nuxt UI) that runs in two situations:",{"id":89,"title":34,"body":90,"description":35,"extension":774,"meta":775,"navigation":776,"path":33,"seo":777,"stem":778,"__hash__":779},"docs\u002Fdocs\u002Fformat\u002Fplugins.md",{"type":91,"value":92,"toc":762},"minimark",[93,97,100,105,304,308,311,428,436,473,477,522,526,558,643,654,661],[94,95,34],"h1",{"id":96},"plug-ins-in-live-sets",[98,99,35],"p",{},[101,102,104],"h2",{"id":103},"storage","Storage",[106,107,108,218,268,287,301],"ul",{},[109,110,111,115,116,120],"li",{},[112,113,114],"strong",{},"VST2:"," ",[117,118,119],"code",{},"PluginDevice\u002FPluginDesc\u002FVstPluginInfo",[106,121,122,168],{},[109,123,124,125,128,129,132,133,136,137,140,141,128,144,128,147,128,150,128,153,128,156,128,159,128,162,128,165],{},"fields: ",[117,126,127],{},"Path",", ",[117,130,131],{},"PlugName"," (often the file name, e.g. ",[117,134,135],{},"Serum_x64","), ",[117,138,139],{},"UniqueId"," (int32 of the 4CC), ",[117,142,143],{},"Inputs",[117,145,146],{},"Outputs",[117,148,149],{},"NumberOfParameters",[117,151,152],{},"NumberOfPrograms",[117,154,155],{},"Flags",[117,157,158],{},"Version",[117,160,161],{},"VstVersion",[117,163,164],{},"IsShellClient",[117,166,167],{},"Category",[109,169,170,173,174],{},[117,171,172],{},"Preset\u002FVstPreset",":\n",[106,175,176,190,201],{},[109,177,178,181,182,185,186,189],{},[117,179,180],{},"Type",": 1178747752 = ",[117,183,184],{},"FBCh"," (opaque chunk) or 1182286443 = ",[117,187,188],{},"FxBk"," (parameter bank)",[109,191,192,128,195,128,198],{},[117,193,194],{},"ProgramCount",[117,196,197],{},"ParameterCount",[117,199,200],{},"ProgramNumber",[109,202,203,206,207,128,210,128,213,128,215],{},[117,204,205],{},"Buffer"," (hex), ",[117,208,209],{},"Name",[117,211,212],{},"PluginVersion",[117,214,139],{},[117,216,217],{},"ByteOrder",[109,219,220,115,223,226],{},[112,221,222],{},"VST3:",[117,224,225],{},"PluginDevice\u002FPluginDesc\u002FVst3PluginInfo",[106,227,228,251,265],{},[109,229,124,230,128,233,128,236,128,239,128,242,128,244,128,247,250],{},[117,231,232],{},"WinPosX\u002FY",[117,234,235],{},"NumAudioInputs\u002FOutputs",[117,237,238],{},"IsPlaceholderDevice",[117,240,241],{},"Preset\u002FVst3Preset",[117,243,209],{},[117,245,246],{},"Uid\u002FFields.0-3",[117,248,249],{},"DeviceType"," (1 instrument, 2 effect)",[109,252,253,256,257,260,261,264],{},[117,254,255],{},"Vst3Preset"," holds ",[117,258,259],{},"ProcessorState"," (hex) and ",[117,262,263],{},"ControllerState"," (hex, often empty)",[109,266,267],{},"no path",[109,269,270,115,273,276,277,280,281,128,283,286],{},[112,271,272],{},"AU:",[117,274,275],{},"AuPluginDevice\u002FPluginDesc\u002FAuPluginInfo"," with ",[117,278,279],{},"ComponentType\u002FSubType\u002FManufacturer"," (4CCs as ints), ",[117,282,209],{},[117,284,285],{},"Manufacturer",".",[109,288,289,292,293,296,297,300],{},[112,290,291],{},"Reading them fast:"," both device elements end in ",[117,294,295],{},"PluginDevice",", never nest, and hold the\nplug-in's state as text. One byte search for that name finds them all, and only their own\nelements need scanning (",[117,298,299],{},"pluginUses","): a Set is mostly clips and automation.",[109,302,303],{},"Live 12.4.5 and earlier never replace one format with another. A VST2 device shows as missing even when its VST3 version is installed.",[101,305,307],{"id":306},"vst3-class-id-from-a-vst2-id","VST3 class id from a VST2 id",[98,309,310],{},"Steinberg FAQ, \"Compatibility with VST 2.x\":",[106,312,313,330,342,357,389,418],{},[109,314,315,115,318,321,322,325,326,329],{},[112,316,317],{},"16 bytes:",[117,319,320],{},"'V' 'S' 'T'"," (processor) or ",[117,323,324],{},"'V' 'S' 'E'"," (controller), then the VST2 id as 4 bytes big-endian, then the first 9 characters of the ",[112,327,328],{},"lowercased"," effect name, zero-padded.",[109,331,332,115,335,338,339,286],{},[112,333,334],{},"Worked example, Serum:",[117,336,337],{},"UniqueId 1483109208 = 'XfsX'"," → ",[117,340,341],{},"56535458 66735873 6572756D 00000000",[109,343,344,345,347,348,351,352],{},"Because ",[117,346,131],{}," is often a file name, match installed VST3s by the first 7 bytes (",[117,349,350],{},"565354"," + VST2 id).\n",[106,353,354],{},[109,355,356],{},"With several matches, a class id whose name bytes match too is preferred; otherwise the first\nin sorted order.",[109,358,359,362,363,366,367,370,371],{},[112,360,361],{},"Live stores the UID"," as ",[117,364,365],{},"Fields.0-3"," = 4 ",[112,368,369],{},"signed big-endian int32",".\n",[106,372,373,383],{},[109,374,375,376,379,380],{},"FabFilter Pro-Q 4: ",[117,377,378],{},"-313016974, 1549813374, -1504849164, 7703407"," = ",[117,381,382],{},"ed57bd72-5c60-467e-a64d-d2f400758b6f",[109,384,385,386],{},"Massive: ",[117,387,388],{},"[1448301646, 1766678893, 1634956137, 1986330624]",[109,390,391,394,395,398,399],{},[112,392,393],{},"Framework default ids"," (useful when ",[117,396,397],{},"moduleinfo.json"," is missing):\n",[106,400,401,412],{},[109,402,403,404,407,408,411],{},"JUCE: component ",[117,405,406],{},"ABCDEF01 9182FAEB \u003Cmfr 4CC> \u003Cplugin 4CC>",", controller ",[117,409,410],{},"ABCDEF01 1234ABCD …","; the 4CCs equal the AU manufacturer and subtype",[109,413,414,415],{},"iPlug2: ",[117,416,417],{},"F2AEE70D 00DE4F4E \u003Cmfr> \u003Cunique id>",[109,419,420,423,424,427],{},[112,421,422],{},"AU link:"," the AU subtype often equals the VST2 id (Massive: ",[117,425,426],{},"aumu NiMa -NI-",").",[101,429,431,432,435],{"id":430},"finding-the-same-plug-in-in-another-format-plugins-audit","Finding the same plug-in in another format (",[117,433,434],{},"plugins audit",")",[98,437,438,439,442,443,445,446,449,450,453,454,456,457,460,461,464,465,468,469,472],{},"Strongest link first: the VST3 bundle ",[112,440,441],{},"declares"," the old class id in ",[117,444,397],{},"\n(",[117,447,448],{},"Compatibility","); the ",[112,451,452],{},"Steinberg"," id (",[117,455,350],{},"\u002F",[117,458,459],{},"565345"," + VST2 id); ",[112,462,463],{},"JUCE"," or ",[112,466,467],{},"iPlug2"," default\nids built from the AU codes; the ",[112,470,471],{},"AU code"," (subtype = VST2 id); the name alone is only a hint.",[101,474,476],{"id":475},"declared-compatibility","Declared compatibility",[106,478,479,502,512],{},[109,480,481,483,484,370,487],{},[117,482,397],{}," (JSON5, so trailing commas must be accepted) has ",[117,485,486],{},"\"Compatibility\": [{ \"New\": \"\u003Ccid>\", \"Old\": [\"\u003Ccid>\", …] }]",[106,488,489,499],{},[109,490,491,492,495,496,286],{},"Check both ",[117,493,494],{},"Contents\u002Fmoduleinfo.json"," and ",[117,497,498],{},"Contents\u002FResources\u002Fmoduleinfo.json",[109,500,501],{},"It is rare: of 69 VST3 bundles on one computer, 2 had one (Serum 2, Rough Rider 3).",[109,503,504,507,508,511],{},[117,505,506],{},"IPluginCompatibility",": a factory class in category ",[117,509,510],{},"\"Plugin Compatibility Class\"",". It is only reachable by loading the binary.",[109,513,514,517,518,521],{},[117,515,516],{},".vstpreset",": ",[117,519,520],{},"'VST3'"," + an int32 version + 32 ASCII hex characters of the class id at offset 8.",[101,523,525],{"id":524},"state-migration-vst2-vst3","State migration VST2 → VST3",[106,527,528,542,552],{},[109,529,530,533,534,537,538,541],{},[112,531,532],{},"Steinberg's rule:"," the host passes the complete FXB\u002FFXP stream to ",[117,535,536],{},"setState",". Its layout is ",[117,539,540],{},"['VstW' | size 8 | version 1 | bypass] 'CcnK' | byteSize | 'FBCh'|'FxBk' | version | fxID | fxVersion | numPrograms | …",", all big-endian.",[109,543,544,551],{},[112,545,546,547,550],{},"JUCE with ",[117,548,549],{},"CAN_REPLACE_VST2",":"," tries the VST2 state first, then the raw bytes.",[109,553,554,557],{},[112,555,556],{},"Verified per plug-in"," (only these count as safe):",[559,560,561,577],"table",{},[562,563,564],"thead",{},[565,566,567,571,574],"tr",{},[568,569,570],"th",{},"Plug-in",[568,572,573],{},"Strategy",[568,575,576],{},"Source",[578,579,580,592,603,619,633],"tbody",{},[565,581,582,586,589],{},[583,584,585],"td",{},"Massive",[583,587,588],{},"verbatim chunk; VST3 parameter ids = VST2 indices (automation kept)",[583,590,591],{},"Live-saved fixture",[565,593,594,597,600],{},[583,595,596],{},"Serum",[583,598,599],{},"verbatim chunk; parameter list reset",[583,601,602],{},"Live-saved fixture, abletoolz",[565,604,605,608,617],{},[583,606,607],{},"Omnisphere",[583,609,610,613,614],{},[117,611,612],{},"struct.pack(\"\u003CIIIIQ\", 999999999, 0, 1, 0, len) + chunk + bytes(4)",", hex uppercase, 80 chars per line; UID ",[117,615,616],{},"84e8de5f9255222296fae4133c935a18",[583,618,591],{},[565,620,621,624,630],{},[583,622,623],{},"Kilohearts",[583,625,626,627],{},"8-byte LE header ",[117,628,629],{},"{1, len}",[583,631,632],{},"abletoolz (facts)",[565,634,635,638,641],{},[583,636,637],{},"FabFilter",[583,639,640],{},"reframing\u002Ftrailer",[583,642,632],{},[98,644,645,646,649,650,653],{},"Everything else would need a small native helper that loads the plug-in: ",[117,647,648],{},"setState(FXB)",", then ",[117,651,652],{},"getState",". That is in the backlog.",[101,655,657,658,435],{"id":656},"conversion-rules-livesaver-plugins-upgrade","Conversion rules (",[117,659,660],{},"livesaver plugins upgrade",[106,662,663,733,739,749],{},[109,664,665,668],{},[112,666,667],{},"Blockers:",[106,669,670,679,688,693,704,718,727],{},[109,671,672,675,676],{},[117,673,674],{},"old_format",": MinorVersion \u003C ",[117,677,678],{},"10.0_377",[109,680,681,684,685],{},[117,682,683],{},"rack",": inside ",[117,686,687],{},"InstrumentGroupDevice|AudioEffectGroupDevice|DrumGroupDevice|MidiEffectGroupDevice",[109,689,690],{},[117,691,692],{},"no_vst3",[109,694,695,698,699,701,702],{},[117,696,697],{},"chunk",": not ",[117,700,184],{}," or empty ",[117,703,205],{},[109,705,706,709,710,713,714,717],{},[117,707,708],{},"links",": automation or modulation target referenced by a ",[117,711,712],{},"PointeeId",", or ",[117,715,716],{},"KeyMidi",", when parameter ids aren't verified",[109,719,720,723,724],{},[117,721,722],{},"default_links",": a linked parameter with ",[117,725,726],{},"ParameterId -1",[109,728,729,732],{},[117,730,731],{},"vst3_type",": category not instr or audiofx",[109,734,735,738],{},[112,736,737],{},"All or nothing"," per plug-in per set.",[109,740,741,744,745,748],{},[112,742,743],{},"Post-checks:"," well-formed, PluginDevice count unchanged, ",[117,746,747],{},"Vst3PluginInfo"," count up by exactly the converted count, sample-ref count unchanged.",[109,750,751,754,755,758,759,286],{},[112,752,753],{},"Kept children and parameter resets:"," see ",[117,756,757],{},"packages\u002Fplugins\u002Fsrc\u002Fconvert.ts","; checked against the Live-saved fixture ",[117,760,761],{},"fixtures\u002Fprojects\u002FVST2toVST3 Project",{"title":763,"searchDepth":764,"depth":764,"links":765},"",2,[766,767,768,770,771,772],{"id":103,"depth":764,"text":104},{"id":306,"depth":764,"text":307},{"id":430,"depth":764,"text":769},"Finding the same plug-in in another format (plugins audit)",{"id":475,"depth":764,"text":476},{"id":524,"depth":764,"text":525},{"id":656,"depth":764,"text":773},"Conversion rules (livesaver plugins upgrade)","md",{},true,{"title":34,"description":35},"docs\u002Fformat\u002Fplugins","QNQyut03MI6cSmENpmQM5kYojtX5y9Exon9dTiKpIJ8",1791245844291]