commit 707ea8faeba92fadcf7f6c9a05af55247039641b
parent 7baab57b1ed311c1a66f97be0018991d82a1be21
Author: Pascal Maheux <pmaheux@audiokinetic.com>
Date: Fri, 19 May 2023 17:13:42 -0400
SP-515: Add OpenAssociatedReaperProject metapackage
SP-2828: Add minimum REAPER version check
SP-2830: Remove reference to Strata
SP-2796: add information on required metadata
Change-Id: Ib14e11b6d1f708dfda20a682c73603c35e7fca4e
Diffstat:
5 files changed, 487 insertions(+), 7 deletions(-)
diff --git a/OpenAssociatedReaperProject/OpenAssociatedReaperProject.lua b/OpenAssociatedReaperProject/OpenAssociatedReaperProject.lua
@@ -0,0 +1,53 @@
+@description Open Associated REAPER Project
+@author Audiokinetic
+@version 1.0.0-rc.1
+@metapackage
+@provides
+ [nomain] Utilities.lua https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/$commit/OpenAssociatedReaperProject/Utilities.lua
+ [nomain] OpenAssociatedReaperProject_Script.lua https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/$commit/OpenAssociatedReaperProject/OpenAssociatedReaperProject_Script.lua
+ [main] OpenAssociatedReaperProject_Install Wwise Command.lua https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/$commit/OpenAssociatedReaperProject/OpenAssociatedReaperProject_Install%20Wwise%20Command.lua
+@changelog
+ Initial release.
+@about
+ # Open Associated REAPER Project
+ The Open Associated REAPER Project package allows you to open the associated REAPER project of a rendered wav file used in a Wwise project.
+ The package consists of three scripts:
+ - OpenAssociatedReaperProject_Install Wwise Command.lua installs the "Open Associated REAPER Project" Wwise command to open the associated REAPER project of a rendered wav file an configure the root lookup directory for the REAPER source projects.
+ - OpenAssociatedReaperProject_Script.lua is used by the Wwise command to find the associated project and region from the wav file.
+ - Utilities.lua expose utilities and helper functions for the previous two scripts.
+
+ ## Setup
+ To complete the installation, run the OpenAssociatedReaperProject_Install Wwise Command.lua action.
+
+ It will install the Wwise custom command: "Open Associated REAPER Project" and configure your REAPER projects root directory.
+ The same action can be use to update the REAPER projects root directory.
+
+ ## Minimum Requirements
+ REAPER v6.80
+ ### Important Note
+ Open Associated REAPER Project needs the Start offset and Title metadata embedded in the rendered file, make sure "Embed title/date/time if not provided" and "Embed start offset (media position in project)" in the REAPER Project Render Metadata are enabled before rendering the file.
+
+
+ ## License
+ Copyright (c) 2023 AUDIOKINETIC Inc.
+
+ The script in this file is licensed to use under the license available at:
+ https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/main/License.txt (the "License").
+ You may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software distributed
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations under the License.
+
+@license
+ Copyright (c) 2023 AUDIOKINETIC Inc.
+
+ The script in this file is licensed to use under the license available at:
+ https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/main/License.txt (the "License").
+ You may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software distributed
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations under the License.
+\ No newline at end of file
diff --git a/OpenAssociatedReaperProject/OpenAssociatedReaperProject_Install Wwise Command.lua b/OpenAssociatedReaperProject/OpenAssociatedReaperProject_Install Wwise Command.lua
@@ -0,0 +1,134 @@
+--[[
+ @description OpenAssociatedReaperProject_Install Wwise Command
+ @author Audiokinetic
+ @noindex
+ @provides
+ [main=main] . https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/$commit/OpenAssociatedReaperProject/OpenAssociatedReaperProject_Install%20Wwise%20Command.lua
+ @about
+ The script installs the Wwise command to open the associated REAPER project of a rendered wav file.
+ @license
+ Copyright (c) 2023 AUDIOKINETIC Inc.
+
+ The script in this file is licensed to use under the license available at:
+ https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/main/License.txt (the "License").
+ You may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software distributed
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations under the License.
+]]--
+
+info = debug.getinfo(1,'S')
+scriptPath = info.source:match[[^@?(.*[\/])[^\/]-$]]
+local utils = dofile(scriptPath.."Utilities.lua")
+
+if not utils.ReaperMinimumVersionCheck() then
+ reaper.ShowMessageBox("Installation aborted!", "Open Associated REAPER Project", utils.OK_MESSAGE_BOX)
+ return
+end
+
+if not utils.JSDependencyCheck() then
+ return
+end
+
+local introMessage = "This script will install the Open Associated REAPER Project command in Wwise and configure the root lookup directory for the REAPER projects."
+local userChoice = reaper.ShowMessageBox(introMessage, "Open Associated REAPER Project", utils.OK_CANCEL_MESSAGE_BOX)
+if userChoice == utils.CANCEL_RESULT then
+ reaper.ShowMessageBox("Installation aborted!", "Open Associated REAPER Project", utils.OK_MESSAGE_BOX)
+ return
+end
+
+-- setup Wwise command
+wwiseCommand = [[
+{
+ "version": 2,
+ "commands": [
+ {
+ "id": "ak.open_associated_reaper_project",
+ "displayName": "Open Associated REAPER Project",
+ "program": "{REAPER_PATH}reaper.exe",
+ "args": "${sound:originalWavFilePath} {SCRIPT_PATH}OpenAssociatedReaperProject_Script.lua",
+ "cwd": "",
+ "contextMenu": {
+ "enabledFor": "Sound",
+ "visibleFor": "Sound"
+ }
+ }
+ ]
+}
+]]
+
+if not utils.WindowsOS() then
+ wwiseCommand = [[
+ {
+ "version": 2,
+ "commands": [
+ {
+ "id": "ak.open_associated_reaper_project",
+ "displayName": "Open Associated REAPER Project",
+ "program": "open",
+ "args": "-n {REAPER_PATH}REAPER.app --args ${sound:originalWavFilePath} '{SCRIPT_PATH}OpenAssociatedReaperProject_Script.lua'",
+ "cwd": "",
+ "contextMenu": {
+ "enabledFor": "Sound",
+ "visibleFor": "Sound"
+ }
+ }
+ ]
+ }
+ ]]
+end
+
+reaperPath = utils.getReaperPath()
+appData = utils.getAppData()
+
+wwiseCommand = wwiseCommand:gsub("{REAPER_PATH}", reaperPath)
+
+info = debug.getinfo(1,'S')
+scriptPath = info.source:match[[^@?(.*[\/])[^\/]-$]]
+if utils.WindowsOS() then
+ scriptPath = scriptPath:gsub("\\", "\\\\")
+end
+
+wwiseCommand = wwiseCommand:gsub("{SCRIPT_PATH}", scriptPath)
+
+-- Install Wwise command
+openInReaperPath = appData.."/Audiokinetic/Wwise/Add-ons/Commands/"
+if utils.WindowsOS() then
+ openInReaperPath = openInReaperPath:gsub("/", "\\")
+end
+
+os.execute("mkdir "..openInReaperPath)
+openInReaperPath = openInReaperPath.."OpenAssociatedReaperProject.json"
+
+file, err = io.open(openInReaperPath, "w")
+if file then
+ file:write(wwiseCommand)
+ file:close()
+else
+ reaper.ShowMessageBox("Failed to write to "..openInReaperPath, "WriteOpenReaper", utils.OK_MESSAGE_BOX)
+ return
+end
+
+-- setup ReaperProjectsRoot.txt
+reaperProjectsRoot = scriptPath.."ReaperProjectsRoot.txt"
+retval = ""
+file, err = io.open(reaperProjectsRoot, "r")
+if file then
+ retval = file:read()
+ file:close()
+end
+
+intval, retval = reaper.JS_Dialog_BrowseForFolder("Select root directory of your REAPER projects.", retval)
+if intval == utils.OK_RESULT and retval then
+ file, err = io.open(reaperProjectsRoot, "w")
+ if file then
+ file:write(retval)
+ file:close()
+ end
+end
+
+local importantNote = "Important Note:\nOpen Associated REAPER Project needs the Start offset and Title metadata embedded in the rendered file, make sure \"Embed title/date/time if not provided\" and \"Embed start offset (media position in project)\" in the REAPER Project Render Metadata are enabled before rendering the file."
+reaper.ShowMessageBox("Installation completed! Restart Wwise to discover the new command.\n\n"..importantNote, "Open Associated REAPER Project", utils.OK_MESSAGE_BOX)
+
diff --git a/OpenAssociatedReaperProject/OpenAssociatedReaperProject_Script.lua b/OpenAssociatedReaperProject/OpenAssociatedReaperProject_Script.lua
@@ -0,0 +1,143 @@
+--[[
+ @description OpenAssociatedReaperProject_Script
+ @author Audiokinetic
+ @noindex
+ @provides
+ [nomain] . https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/$commit/OpenAssociatedReaperProject/OpenAssociatedReaperProject_Script.lua
+ @about
+ The script opens up the associated REAPER project of a wav file based on his metadata.
+ @license
+ Copyright (c) 2023 AUDIOKINETIC Inc.
+
+ The script in this file is licensed to use under the license available at:
+ https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/main/License.txt (the "License").
+ You may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software distributed
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations under the License.
+]]--
+
+info = debug.getinfo(1,'S')
+scriptPath = info.source:match[[^@?(.*[\/])[^\/]-$]]
+local utils = dofile(scriptPath.."Utilities.lua")
+
+local tempProject, _ = reaper.EnumProjects( -1, "" )
+
+local firstTrack = reaper.GetTrack(utils.CURRENT_PROJECT, 0)
+local mediaItemCount = reaper.CountTrackMediaItems(firstTrack)
+local mediaItem = reaper.GetTrackMediaItem(firstTrack, 0)
+local mediaItemTake = reaper.GetActiveTake(mediaItem)
+local pcmSource = reaper.GetMediaItemTake_Source(mediaItemTake)
+local filePath = reaper.GetMediaSourceFileName(pcmSource)
+
+
+if not reaper.file_exists(filePath) then
+ reaper.ShowMessageBox("Unable to locate file `" .. filePath .. "`", "Open Associated REAPER Project: Failed", OK_MESSAGE_BOX)
+ return
+end
+
+-- Read data from wav header --
+local pcmSource = reaper.PCM_Source_CreateFromFile(filePath)
+local projectName = utils.getMetadata(pcmSource, {"IXML:PROJECT", "IXML:Project", "IXML:project", "INFO:INAME"})
+local startOffset = utils.getMetadata(pcmSource, {"Generic:StartOffset"})
+local trackName = utils.getMetadata(pcmSource, {"IXML:USER:trackName", "IXML:USER:TRACKNAME", "IXML:USER:TrackName", "IXML:USER:trackname"})
+
+if startOffset == nil then
+ startOffset = "0:00.000"
+end
+
+if not projectName then
+ reaper.ShowMessageBox("IXML:PROJECT header missing or empty in selected file. The script expects the IXML:PROJECT header to contain the associated project name. Make sure 'Embed title/date/time if not provided' and 'Embed start offset' option in the Project Render Metadata are enabled.", "Open Associated REAPER Project: Failed", utils.OK_MESSAGE_BOX)
+ return
+end
+
+local projectDirectory = utils.getParentDirectory(filePath)
+
+local info = debug.getinfo(1, 'S')
+local scriptPath = info.source:match[[^@?(.*[\/])[^\/]-$]]
+local reaperProjectsRootPath = scriptPath.."ReaperProjectsRoot.txt"
+local file, err = io.open(reaperProjectsRootPath, "r")
+local reaperProjectsRoot = os.getenv("REAPERPROJECTSROOT")
+if file and not reaperProjectsRoot then
+ reaperProjectsRoot = file:read()
+ file:close()
+end
+
+local function findRppFile(dir, rppFile)
+ local i = 0
+ local file = reaper.EnumerateFiles(dir, i)
+ repeat
+ if file ~= nil and file == rppFile then
+ return dir .. utils.SEPARATOR_CHAR .. file
+ end
+ i = i + 1
+ file = reaper.EnumerateFiles(dir, i)
+ until file == nil
+
+ i = 0
+ local subDir = reaper.EnumerateSubdirectories(dir, i)
+ repeat
+ if subDir ~= nil then
+ local ret = findRppFile(dir .. utils.SEPARATOR_CHAR .. subDir, rppFile)
+ if ret ~= nil then
+ return ret
+ end
+ i = i + 1
+ subDir = reaper.EnumerateSubdirectories(dir, i)
+ end
+ until subDir == nil
+ return nil
+end
+
+local projectPath = findRppFile(reaperProjectsRoot, projectName .. ".rpp")
+
+if not projectPath then
+ projectName = string.gsub(projectName, "\n", " ")
+ reaper.ShowMessageBox("Unable to locate project `" .. projectName .. "` in `" .. reaperProjectsRoot .. "`", "Open Associated REAPER Project: Failed", utils.OK_MESSAGE_BOX)
+ return
+end
+
+-- Open project and set cursor to start offset --
+reaper.Main_OnCommand(41929, 0) -- opens new project tab
+reaper.Main_openProject("noprompt:" .. projectPath)
+
+local project, _ = reaper.EnumProjects( -1, "" )
+
+local markersAndRegions, _, _ = reaper.CountProjectMarkers(utils.CURRENT_PROJECT)
+
+local buf = ""
+for i = 0, markersAndRegions - 1 do
+ local _, isRegion, currentRegionPos, _, currentRegion, index, _ = reaper.EnumProjectMarkers3(0, i)
+
+ if isRegion and reaper.format_timestr(currentRegionPos, buf) == startOffset then
+ reaper.GoToRegion(0, index, true)
+ reaper.adjustZoom(100, 1, true, -1)
+ break
+ end
+end
+
+local trackView = reaper.JS_Window_FindChildByID(reaper.GetMainHwnd(), utils.TRACK_VIEW_ID)
+
+reaper.Main_OnCommand(40297,0) -- deselect all tracks
+
+if trackName then
+ for i = 0, reaper.CountTracks() - 1 do
+ local currentTrack = reaper.GetTrack(utils.CURRENT_PROJECT, i)
+ local _, currentTrackName = reaper.GetTrackName(currentTrack)
+
+ if currentTrackName == trackName then
+ reaper.SetTrackSelected(currentTrack, true)
+
+ -- Get Y postion of track and then scroll to it
+ local yPosition = reaper.GetMediaTrackInfo_Value(currentTrack, "I_TCPY")
+ reaper.JS_Window_SetScrollPos(trackView, "v", yPosition)
+ break
+ end
+ end
+end
+
+reaper.SelectProjectInstance(tempProject)
+reaper.Main_OnCommand(40860,0) -- close current project tab
+reaper.SelectProjectInstance(project)
diff --git a/OpenAssociatedReaperProject/Utilities.lua b/OpenAssociatedReaperProject/Utilities.lua
@@ -0,0 +1,116 @@
+--[[
+ @description Utilities
+ @author Audiokinetic
+ @noindex
+ @provides
+ [nomain] . https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/$commit/OpenAssociatedReaperProject/Utilities.lua
+ @about
+ Contains utility functions and constant used by the others scripts of the Open Associated REAPER Project package.
+ @license
+ Copyright (c) 2023 AUDIOKINETIC Inc.
+
+ The script in this file is licensed to use under the license available at:
+ https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/main/License.txt (the "License").
+ You may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software distributed
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations under the License.
+]]--
+
+local Utilities = {}
+
+-- constants --
+Utilities.OK_RESULT = 1
+Utilities.CANCEL_RESULT = 2
+Utilities.OK_MESSAGE_BOX = 0
+Utilities.OK_CANCEL_MESSAGE_BOX = 1
+Utilities.TRACK_VIEW_ID = 1000
+Utilities.CURRENT_PROJECT = 0
+Utilities.SEPARATOR_CHAR = string.find(reaper.GetOS(), "Win") ~= nil and "\\" or "/"
+local BROWSER_CMD = string.find(reaper.GetOS(), "Win") ~= nil and "start" or "open"
+
+-- helper functions --
+function Utilities.WindowsOS()
+ return string.find(reaper.GetOS(), "Win") == 1
+end
+
+function Utilities.openUrl(url)
+ os.execute(BROWSER_CMD .. ' "" "' .. url .. '"')
+end
+
+function Utilities.getReaperPath()
+ local reaperPath = tostring(reaper.GetExePath())
+ if Utilities.WindowsOS() then
+ reaperPath = reaperPath.."\\"
+ reaperPath = reaperPath:gsub("\\", "\\\\")
+ else
+ reaperPath = reaperPath.."/"
+ end
+ return reaperPath
+end
+
+function Utilities.getAppData()
+ local appData = ""
+ if not Utilities.WindowsOS() then
+ appData = os.getenv("HOME").."/Library/Application Support"
+ else
+ appData = os.getenv("APPDATA")
+ end
+ return appData
+end
+
+function Utilities.getMetadata(pcmSource, list)
+ for i = 1, #list do
+ local _, candidate = reaper.GetMediaFileMetadata(pcmSource, list[i])
+
+ if candidate and candidate ~= "" then
+ return candidate
+ end
+ end
+
+ return nil
+end
+
+function Utilities.getParentDirectory(path)
+ local pathReversed = string.reverse(path)
+
+ local nextSeperatorChar = string.find(pathReversed, Utilities.SEPARATOR_CHAR, 1)
+
+ return string.sub(path, 0, string.len(path) - nextSeperatorChar)
+end
+
+-- JS dependency check --
+function Utilities.JSDependencyCheck()
+ if not reaper.JS_Window_FindChildByID or not reaper.JS_Window_Find or not reaper.JS_Window_SetScrollPos or not reaper.JS_Dialog_BrowseForFolder then
+ local selectedOption = reaper.ShowMessageBox("The script requires the latest version of js_ReaScriptAPI be installed.\n\nView in ReaPack?", "Open Associated REAPER Project: Failed", OK_CANCEL_MESSAGE_BOX)
+
+ if selectedOption == OK_RESULT then
+ if reaper.ReaPack_BrowsePackages then
+ reaper.ReaPack_BrowsePackages("js_ReaScriptAPI")
+ else
+ selectedOption = reaper.ShowMessageBox("Unable to locate ReaPack. You can download ReaPack by going to https://reapack.com.\n\nGo there now?", "Open Associated REAPER Project: Failed", OK_CANCEL_MESSAGE_BOX)
+
+ if selectedOption == OK_RESULT then
+ openUrl("https://reapack.com")
+ end
+ end
+ end
+ return false
+ end
+ return true
+end
+
+-- REAPER minimum version requirement check
+function Utilities.ReaperMinimumVersionCheck()
+ local version = reaper.GetAppVersion()
+ version = version:match("[0-9]+%.[0-9]+")
+ if tonumber(version) < 6.80 then
+ reaper.ShowMessageBox("The required minimum version of REAPER is v6.80. Please update REAPER before running this script.", "Open Associated REAPER Project", 0)
+ return false
+ end
+ return true
+end
+
+return Utilities
+\ No newline at end of file
diff --git a/index.xml b/index.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<index version="1" name="Audiokinetic" commit="6cdc562e0b8daeca273b79a09b9e8244ba028bda">
+<index version="1" name="Audiokinetic" commit="3ff02e2876443beb7fd0f30df260d97a4511b409">
<category name="Extensions">
<reapack name="ReaWwise.ext" type="extension" desc="ReaWwise">
<metadata>
@@ -40,7 +40,7 @@ feature request section
}}}
of Audiokinetic's Community Q&A. Use ReaWwise as the Category when submitting a question.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 Legal\par}
-{\pard \ql \f0 \sa180 \li0 \fi0 Copyright \u169? 2022 {\field{\*\fldinst{HYPERLINK "https://audiokinetic.com"}}{\fldrslt{\ul
+{\pard \ql \f0 \sa180 \li0 \fi0 Copyright \u169 ? 2022 {\field{\*\fldinst{HYPERLINK "https://audiokinetic.com"}}{\fldrslt{\ul
Audiokinetic Inc.
}}}
All rights reserved.\par}
@@ -54,22 +54,20 @@ Karl Davis
<link rel="screenshot" href="https://github.com/audiokinetic/ReaWwise/blob/main/user-interface.png">User Interface</link>
</metadata>
<version name="1.0.1" author="Audiokinetic" time="2022-09-13T18:40:25Z">
- <changelog><![CDATA[Various bug fixes]]></changelog>
<source platform="win64" file="reaper_reawwise.dll">https://github.com/audiokinetic/ReaWwise/releases/download/1.0.1/reaper_reawwise.dll</source>
<source platform="darwin" file="reaper_reawwise.dylib">https://github.com/audiokinetic/ReaWwise/releases/download/1.0.1/reaper_reawwise.dylib</source>
</version>
- <version name="1.0.2" author="Audiokinetic" time="2022-09-21T18:20:16Z">
- <changelog><![CDATA[Various bug fixes]]></changelog>
+ <version name="1.0.2" author="Audiokinetic" time="2022-09-21T20:22:30Z">
<source platform="win64" file="reaper_reawwise.dll">https://github.com/audiokinetic/ReaWwise/releases/download/1.0.2/reaper_reawwise.dll</source>
<source platform="darwin" file="reaper_reawwise.dylib">https://github.com/audiokinetic/ReaWwise/releases/download/1.0.2/reaper_reawwise.dylib</source>
</version>
- <version name="1.0.3" author="Audiokinetic" time="2022-09-23T20:49:08Z">
+ <version name="1.0.3" author="Audiokinetic" time="2022-09-23T20:59:21Z">
<changelog><![CDATA[Bug fix:
- Fixed issue where the preview panel is empty due to parsing RENDER_TARGETS incorrectly for REAPER 6.68]]></changelog>
<source platform="win64" file="reaper_reawwise.dll">https://github.com/audiokinetic/ReaWwise/releases/download/1.0.3/reaper_reawwise.dll</source>
<source platform="darwin" file="reaper_reawwise.dylib">https://github.com/audiokinetic/ReaWwise/releases/download/1.0.3/reaper_reawwise.dylib</source>
</version>
- <version name="1.0.4" author="Audiokinetic" time="2022-11-18T15:12:11Z">
+ <version name="1.0.4" author="Audiokinetic" time="2022-11-18T19:04:37Z">
<changelog><![CDATA[New Features:
- Added "ReaWwise: Open", "ReaWwise: Close" and "ReaWwise: Transfer To Wwise" actions to REAPER's action list. And added AK_Json_Clear and AK_Json_ClearAll functions to ReaScript.
@@ -89,6 +87,40 @@ Bug Fixes:
</version>
</reapack>
</category>
+ <category name="OpenAssociatedReaperProject">
+ <reapack name="OpenAssociatedReaperProject.lua" type="script" desc="Open Associated REAPER Project">
+ <metadata>
+ <description><![CDATA[{\rtf1\ansi\deff0{\fonttbl{\f0 \fswiss Helvetica;}{\f1 \fmodern Courier;}}
+{\colortbl;\red255\green0\blue0;\red0\green0\blue255;}
+\widowctrl\hyphauto
+
+{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel0 \b \fs36 Open Associated REAPER Project\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 The Open Associated REAPER Project package allows you to open the associated REAPER project of a rendered wav file used in a Wwise project. The package consists of three scripts:\par}
+{\pard \ql \f0 \sa0 \li360 \fi-360 \bullet \tx360\tab OpenAssociatedReaperProject_Install Wwise Command.lua installs the "Open Associated REAPER Project" Wwise command to open the associated REAPER project of a rendered wav file an configure the root lookup directory for the REAPER source projects.\par}
+{\pard \ql \f0 \sa0 \li360 \fi-360 \bullet \tx360\tab OpenAssociatedReaperProject_Script.lua is used by the Wwise command to find the associated project and region from the wav file.\par}
+{\pard \ql \f0 \sa0 \li360 \fi-360 \bullet \tx360\tab Utilities.lua expose utilities and helper functions for the previous two scripts.\sa180\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 Setup\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 To complete the installation, run the OpenAssociatedReaperProject_Install Wwise Command.lua action.\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 It will install the Wwise custom command: "Open Associated REAPER Project" and configure your REAPER projects root directory. The same action can be use to update the REAPER projects root directory.\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 Minimum Requirements\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 REAPER v6.80\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 Important Note\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 Open Associated REAPER Project needs the Start offset and Title metadata embedded in the rendered file, make sure "Embed title/date/time if not provided" and "Embed start offset (media position in project)" in the REAPER Project Render Metadata are enabled before rendering the file.\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 License\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 Copyright (c) 2023 AUDIOKINETIC Inc.\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 The script in this file is licensed to use under the license available at: https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/main/License.txt (the "License"). You may not use this file except in compliance with the License.\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\par}
+}
+]]></description>
+ </metadata>
+ <version name="1.0.0-rc.1" author="Audiokinetic" time="2023-07-06T15:35:21Z">
+ <changelog><![CDATA[Initial release.]]></changelog>
+ <source file="Utilities.lua">https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/3ff02e2876443beb7fd0f30df260d97a4511b409/OpenAssociatedReaperProject/Utilities.lua</source>
+ <source file="OpenAssociatedReaperProject_Script.lua">https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/3ff02e2876443beb7fd0f30df260d97a4511b409/OpenAssociatedReaperProject/OpenAssociatedReaperProject_Script.lua</source>
+ <source main="main" file="OpenAssociatedReaperProject_Install Wwise Command.lua">https://raw.githubusercontent.com/audiokinetic/Reaper-Tools/3ff02e2876443beb7fd0f30df260d97a4511b409/OpenAssociatedReaperProject/OpenAssociatedReaperProject_Install%20Wwise%20Command.lua</source>
+ </version>
+ </reapack>
+ </category>
<category name="Scripts">
<reapack name="Strata_Open associated Strata project from selected audio file.lua" type="script" desc="Strata_Open associated Strata project from selected audio file">
<metadata>