/* * ReaScript Name: Retrospective Record (audio) * EEL script for Cockos REAPER * Author: EUGEN27771 * Author URI: http://forum.cockos.com/member.php?u=50462 * Licence: GPL v3 * Version: 3.0 */ //==v20151213==Reaper v5.1,SWS 2.8.2==// //////////////////////////////////////////////////////////////////////////////////////////////// //==================JS_RRAudio TEXT(Do not change this text!!!)================================// #JS_RRAudio = " desc:ForRetroRec(Audio) v20151213(b1) options:maxmem=33554432 slider1:1<0,4096,1>-Track Number slider2:0<0,1,1>-Insert Audio slider3:0<0,4095,1>-Slot slider4:0<0,33554432,1>-DATA slider5:1<0,1,1{No(As Rec Out Mode),Yes(As Rec Normal Mode)}>Compensate Latency slider6:0<0,8192,1>-data @init ext_noinit=1; buf=0; //max_buf=65536-8192*4;//MaxBuf For Experi Only,DEL IT*** max_buf=33554432-8192*4;//MaxBuf Val=33521664 res_buf=8192*2;//Reserve buffer for Compensate Latency items=33550336;//Offset for DATA(last 4096 slots) Thresh=10;//Its Optimal Thresh Value items[4094]=srate;//Save Srate(4094 slot) @slider Track_Num = slider1; Insert = slider2; //==DATA Sliders==// //==Data cycle=3,Set 0,3,6,9,12 etc for Read-Set data=//=4092,4093,4094==Item Count,Total Lenhth(smpl),srate==// //==Data slider represent Item Start(in sec),other values set S_Start,S_Len for Insert Audio==// slider5 ? Lat_Offset=(slider6)*2 : Lat_Offset=0; slider4=items[slider3];//slider3=MAIN CONTROL SLIDER,slider4=MAIN DATA SLIDER!!! S_Start=items[slider3+1]+Lat_Offset;//Item buf pos-offset(Star) in smpls for export_buff() S_Len=items[slider3+2];//ITEM Lenght in smpls for export_buff() @block Start_Play_Position = play_position;//B_start //==If play position changed,Save Last Ppos,Prev Len,Start Ppos and buf pos-offset to memory==// (i>0&&i0.125 ? (items[4092]+=1;//Its New Item,Update Item_Count items[j]=i/2-items[j-1]/2;//Its PREV_ITEM Lenght(in smpls) j+=1;//To Next data Cycle items[j]=Start_Play_Position;//New ITEM start(in sec) items[j+1]=i;//Item buf pos-offset(in smpls) j+=2; );//End Last_Play_Position = Start_Play_Position+samplesblock/srate;//B_end @sample slider6==8192 ? (i=0; j=0; items[4093]=0; items[4092]=0; slider6=0;);//i,j,len,count=0 value=8192(from RRScript) play_state==0 ? (i=0; j=0;);//i,j=0 when playback stopped play_state==1||play_state==5 ? (i==0 ? (maxsamples = max(abs(spl0),abs(spl1)) * 10^16;//maxsmplval*10^16 maxsamples>Thresh ? (items[4092]=1;//Its 1-st Item in Item_Count items[0]=play_position;//1-st item play_pos items[1]=0;//1-st item buf pos-offset,always=0 j=2;) : items[4093]=0;);//Else reset TOTAL Lenght //==Save each Sample to buf[]==// i<=max_buf+res_buf && maxsamples>Thresh ? (buf[i]=spl0;buf[i+1]=spl1; items[4093]=i/2;//Its TOTAL Lenght //If,then Update temporary LAST_ITEM Lenght(in smpls)// i<=max_buf ? items[j]=i/2-items[j-1]/2; i+=2;); );//End //==Mute True,else Pass True(to next JS)==// i>max_buf ? (spl0=spl0;spl1=spl1;) : (spl0=0;spl1=0;); @gfx 1 1 Insert==1 ? (Insert=0; export_buffer_to_project(S_Start,S_Len,2,srate,Track_Num,0,tempo); slider2=0;); " ;;;;;;////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// function Create_JS_Utility() (GetResourcePath(#Res_Path);//Get Resouces Path #File_Patch = strcat(#JS_Folder_Name,#JS_FX_Name);//Concat strings #Full_Path = strcat(#Res_Path,#File_Patch);//Concat strings JS_FILE = fopen(#Full_Path, "w");//Create JSFX fwrite(JS_FILE,#JS_RRAudio, 0); fclose(JS_FILE); JS_FILE;//func return ); function Find_JS_Track()//==Find Track w JS-utility(uses #JS_Track_Name)==// (i=0;loop(CountTracks(0), Cur_Track_ID = GetTrack(0,i); GetSetMediaTrackInfo_String(Cur_Track_ID, "P_NAME", #Curr_Track_Name, 0); stricmp(#JS_Track_Name,#Curr_Track_Name) == 0 ? Track_ID = Cur_Track_ID;i+=1;); Track_ID;//Return ); function Insert_JS_Track()//===Insert Track(if not found);Create JS(if not Exist);Set Specific JS_Track Parameters===// ( InsertTrackAtIndex(0,Defaults);//Insert Track,Index=0 Track_ID = GetTrack(0, 0); GetSetMediaTrackInfo_String(Track_ID, "P_NAME", #JS_Track_Name, 1);//Get Track_ID;Set Track Name SetMediaTrackInfo_Value(Track_ID,"B_SHOWINTCP",0);SetMediaTrackInfo_Value(Track_ID,"B_SHOWINMIXER",0);//Hide TRACK in TCP & Mixer FX_index = TrackFX_GetByName(Track_ID,#JS_FX_Name,1);//Insert JSFX and Get FX_index FX_index<0 ? (MB = MB("The desired JS-utility is not found!\nWould you like to create it?\n(In REAPER\\Effects\\utility folder)", "Info", 0); //===Create JS in Reaper resoursces folder(Patch\REAPER\Effects\midi)==// MB ? (Create_JS_Utility() ? FX_index=TrackFX_GetByName(Track_ID,#JS_FX_Name,1);//Create JS//Insert JSFX//Get index FX_index==0 ? MB("Successfully!", "Info", 0) : MB("Failed...", "Info", 0);););//Verify//End Create&Insert JSFX //==============Set Specific JS_Track Parameters==============// Track_ID>0 && FX_index==0 ? (SetMediaTrackInfo_Value(Track_ID,"I_RECARM",1);SetMediaTrackInfo_Value(Track_ID,"I_RECMON",1);//Rec-Arm = Enable//Rec-Monitor = Enable SetMediaTrackInfo_Value(Track_ID,"I_RECINPUT",Rec_IN);SetMediaTrackInfo_Value(Track_ID,"I_RECMODE",2);//Set Rec_IN and Mode=Disable(Mon Only) SetMediaTrackInfo_Value(Track_ID,"B_MAINSEND",0);//No send to master/parent track! //=====Clone JSFX(aka Buffers)-for RRAudio ONLY=====// RR_Type ? (SetOnlyTrackSelected(Track_ID);//Select Only! JS_Track Main_OnCommandEx(NamedCommandLookup("_S&M_COPYFXCHAIN5"), 0, 0);//Copy JS GetUserInputs("Set the number of buffers", 1 , "Set number of buffers(1-16):", #Buffs);//Set match("%i",#Buffs, Buffs);//as Integer = Buffs Buffs<1 ? Buffs=1; Buffs>16 ? Buffs=16;//If user set val<1 or val>16 loop(Buffs-1, Main_OnCommandEx(NamedCommandLookup("_S&M_COPYFXCHAIN10"),0,0);); );//Paste(clone) JS SetMediaTrackInfo_Value(Track_ID,"I_SELECTED",0);//Unselect Track TrackList_AdjustWindows(0);//Update Tracklist MB("Done!","Info",0); );//End Set Specific JS_Track Parameters Track_ID;//Return ); //=====================================Main Operations and functions(RRAudio)=====================================// function Glue_Items() (CountSelectedMediaItems(0)>1 ? Main_OnCommandEx(40362, 0, 0);//IF count>1,Glue Sel Items items[Item_Number]=GetSelectedMediaItem(0,0);//Get-Save Glued_ID to items[] SelectAllMediaItems(0,0);//Unsel ALL Items in Project Item_Number+=1;//Next ); function Implode_Glued_Items() (New_Lenght=Max_Pos-Min_Pos;//Its Constant value For ALL Items Glued_Count=Item_Number;//Amt of Glued Items Item_Number=0; loop(Glued_Count, Glued_ID=items[Item_Number];//Get Glued_ID from items[Item_Number] Take_ID=GetActiveTake(Glued_ID);//Get Active Take_ID from Current Glued_Item Item_Start=GetMediaItemInfo_Value(Glued_ID, "D_POSITION");//Get Item Start Start_Offset=Min_Pos-Item_Start;//Calculate Offset for source Audio //==Set Item Parameters==// SetMediaItemInfo_Value(Glued_ID, "B_LOOPSRC", 0);//LoopSource=0 SetMediaItemInfo_Value(Glued_ID, "D_POSITION", Min_Pos);//Set New Position SetMediaItemTakeInfo_Value(Take_ID, "D_STARTOFFS", Start_Offset);//Set Offset for Compensate Position SetMediaItemInfo_Value(Glued_ID, "D_LENGTH", New_Lenght);//Set New_Lenght for Item #NewName = #TrackName; sprintf(#Item_Number, "%d",Item_Number+1);//Num To String(and 1-based count) strcat(#NewName,#Item_Number);//Name + NUMBER GetSetMediaItemTakeInfo_String(Take_ID,"P_NAME",#NewName,1);//Rename Item to par_Track name+Num*** SetMediaItemSelected(Glued_ID,1);//Select Item Main_OnCommand(40543, 0);//Implode Selected Items into Takes Item_Number+=1; ); Main_OnCommand(NamedCommandLookup("_XENAKIOS_SELECTLASTTAKEOFITEMS"), 0);//Select Last Take in Item RESET ? (FX_index=0;loop(JS_FX_Count,TrackFX_SetParam(Track_ID,FX_index,5,8192);FX_index+=1;););//RESET JSs After Script Executed UpdateArrange();//Update the arrangement ); //====================================================================================================================// function Insert_and_Close()//execute until the condition is true (TrackFX_GetParam(Track_ID,FX_index,1,minval,maxval)>0 ? defer("Insert_and_Close();") : (TrackFX_Show(Track_ID, FX_index, 0);//Close After Insert Buf_Curr_Segm+=1; Buf_Segm_Count>Buf_Curr_Segm ? //To Next Buf Segment in Current JS defer("Set_JS_Parameters();") : //Else To Next JS (FX_index+=1;Buf_Curr_Segm=0;defer("Main();");); );//End ); function Set_JS_Parameters()//==Set Specific Parameters in JS for Insert Audio==// ( j=Buf_Curr_Segm*3;//j(3-base cycle) is special Value for Control JS parameters! TrackFX_SetParam(Track_ID, FX_index, 5, Latency);//Set SpecSlider(latency=BufOffset value) TrackFX_SetParam(Track_ID, FX_index, 2, j+2);//Set j+2 slot Lenght=TrackFX_GetParam(Track_ID,FX_index,3,minval,maxval);//Get Current Buf_Segment Length from JS(in smpls) TrackFX_SetParam(Track_ID, FX_index, 2, j);//Set j slot Buf_Start=TrackFX_GetParam(Track_ID,FX_index,3,minval,maxval)-Proj_Offset;//Get Buf_Start from JS(in sec),regard Proj_Offset //==IF Prev_End>Current_Start,Glue Prev_Selected Items(Buf_Segments)==// Buf_Curr_Segm>0 && (Buf_End-Buf_Start)>0.0001 ? Glue_Items(); Buf_End=Buf_Start+Lenght/srate;//Now Update Buf_End(in sec) //==Update Min_Pos,Max_Pos==// Min_Pos=min(Min_Pos,Buf_Start);//Update Min Position Max_Pos=max(Max_Pos,Buf_End);//Update Max Position //==Set Cursor,Call Insert_and_Close() SetEditCurPos(Buf_Start, 0, 0);//Set CursPos=Buf_Start for Insert Item TrackFX_SetParam(Track_ID, FX_index, 0, Track_Num-1);//Set Prmtr-Track number in JS TrackFX_SetParam(Track_ID, FX_index, 1, 1);//Set Prmtr-Insert Audio=1 in JS TrackFX_Show(Track_ID, FX_index, 1);//Open JS FX(it is necessary) Insert_and_Close();//Call Insert_and_Close() function ); function Main() (//==Get_Set JS Basic Parameters==// TrackFX_SetParam(Track_ID, FX_index, 2, 4092);//Set 4092 slot Buf_Segm_Count=TrackFX_GetParam(Track_ID,FX_index,3,minval,maxval);//Get Buf_Segm_Count from curr JS TrackFX_SetParam(Track_ID, FX_index, 2, 4093);//Set 4093 slot Total_Lenght=TrackFX_GetParam(Track_ID,FX_index,3,minval,maxval);//Get Total Buf Lenght from curr JS(in smpls) FX_index==0 ? (Min_Pos=65536;Max_Pos=-65536;);//Initial-reset Min-Max Positions //===Set_JS_Parameters() func , else(if ALL Inserted) Glue last items and Implode glued into Takes===// FX_index0 ? (Set_JS_Parameters();) : (Glue_Items(); Implode_Glued_Items();); ); //====================================================================================================================// //===========Basic Names and Main Data==========// #JS_FX_Name = "ForRetroRec(Audio) v20151213(b1)";//JS-utility Name #JS_Folder_Name = "/Effects/utility/";//Destination folder #JS_Track_Name = #JS_FX_Name;//JS_Track_Name(the same as JS_FX_Name) #Buffs="2";//Default Buffs Value in UserInput RR_Type = 1;//RR_FLAG(0=RRMidi;1=RRAudio) Rec_IN = 1024;//1024=Stereo Channels RESET=1;//RESET After ALL Audio Inserted(0=No,1=Yes) items = 8384512;//items offset //====Find_JS_Track====Insert,IF Track w JS-utility not Found====// Find_JS_Track() == 0 ? Insert_JS_Track();//Insert Track and JS(Create JS,if need) Sel_Track_ID = GetSelectedTrack(0,0);//Get 1-st selected Track ID(For ADD AUDIO-DATA) GetSetMediaTrackInfo_String(Sel_Track_ID, "P_NAME", #TrackName, 0);//Get Sel_Track_Name(for rename New Item-Takes) Track_Num = GetMediaTrackInfo_Value(Sel_Track_ID, "IP_TRACKNUMBER");//Get Track Number JS_FX_Count = TrackFX_GetCount(Track_ID);//Get JS_FX_Count //==Get Project Offset and Latency for RRAudio==// TrackFX_GetParam(Track_ID,FX_index,4,minval,maxval) ? //Get Comp Latency value from JS (TrackFX_SetParam(Track_ID, FX_index, 2, 4094);//Set slot 4094 srate=TrackFX_GetParam(Track_ID,FX_index,3,minval,maxval);//Get Samplerate GetInputOutputLatency(In_Latency,Out_Latency);//Get Latency(in smpls) Latency=(In_Latency+Out_Latency););//Calc Total Latency(in smpls) Proj_Offset=GetProjectTimeOffset(0, rndframe);//Get Project Offset //====Insert Audio on the Track(if exist)====// Sel_Track_ID ? (SelectAllMediaItems(0,0); Main(););//Execute Main and all incusive functions