WEBVTT
00:00:00.139 --> 00:00:04.203
Hello everyone, this is X-Raym,
for the third part of the tutorial
00:00:04.204 --> 00:00:08.822
about Lua coding for
REAPER ReaScript.
00:00:08.823 --> 00:00:12.418
Today, we will work on Items.
00:00:12.419 --> 00:00:16.020
We will get infos of first selected items,
00:00:16.021 --> 00:00:19.795
and then, we will learn
how to modify them.
00:00:19.796 --> 00:00:23.978
We will start by the script
we wrote last time.
00:00:25.003 --> 00:00:32.441
I will set Notepad++ this way
so that it stay in foreground.
00:00:32.442 --> 00:00:37.501
Imagine that I want to get
the infos of that items.
00:00:38.786 --> 00:00:44.028
First, I have to return this item
in a variable.
00:00:45.037 --> 00:00:50.243
I check the API Doc,
and I write "Selected Item"
00:00:50.244 --> 00:00:54.750
We see that there are some
functions about Item Selection
00:00:55.770 --> 00:00:59.105
The function that we want
is this one.
00:00:59.106 --> 00:01:00.967
"GetSelectedMedialtem"
00:01:02.298 --> 00:01:08.830
If we add a project number ID
and an integer
00:01:08.831 --> 00:01:10.442
we get an Item.
00:01:11.703 --> 00:01:15.029
Project ID is 0 for current project.
00:01:15.030 --> 00:01:19.899
And the integer is the place
of the item in selection.
00:01:19.900 --> 00:01:25.096
If it is the first item,
the integer will be 0.
00:01:25.097 --> 00:01:30.928
Demo. I will create a function "Main"
00:01:30.929 --> 00:01:35.362
which will contain the core
of my script.
00:01:35.363 --> 00:01:38.223
Hop, I put the function end
00:01:38.224 --> 00:01:41.206
at the end of the script,
I call "Main".
00:01:41.207 --> 00:01:47.971
I move the call to that function below
so that it is more clean
00:01:47.972 --> 00:01:51.104
just before the call of Main.
00:01:51.105 --> 00:01:54.704
Remember, ShowConsoleMsg("")
is used to clean the console.
00:01:54.705 --> 00:02:01.444
I take this.
This function return an item.
00:02:01.445 --> 00:02:05.131
So I will stock this item in a variable.
00:02:05.132 --> 00:02:10.672
Item = reaper. GetSelectedMedialtem()
00:02:10.673 --> 00:02:15.648
Here I delete value type reference,
we don't need it.
00:02:15.649 --> 00:02:20.067
As first parameter,
0 for current project,
00:02:20.068 --> 00:02:27.248
and 0 as ineteger,
for First Selected Item.
00:02:29.177 --> 00:02:30.994
If I run the scrip...
00:02:34.048 --> 00:02:38.547
The console open because of
ShowConsoleMsg(""), but nothing happen.
00:02:39.882 --> 00:02:42.818
If I display item in the console...
00:02:45.264 --> 00:02:48.430
Hop, save, run..
00:02:48.431 --> 00:02:52.940
We see that the item
is a special type of data
00:02:52.941 --> 00:02:55.217
called userdata.
00:02:55.218 --> 00:02:59.392
Userdata in Lua represent an array value...
00:02:59.393 --> 00:03:03.870
but all you have to remember is that
00:03:03.871 --> 00:03:09.820
this userdata is specific to this item
the project with a unique ID.
00:03:09.821 --> 00:03:13.080
We will try to get infos on this item.
00:03:15.076 --> 00:03:20.704
I get back in function list,
And I enter Item Infos.
00:03:21.918 --> 00:03:26.069
I see that there is a function
GetMedialtemlnfo_Value
00:03:26.070 --> 00:03:28.774
and there is a variant for Take properties.
00:03:28.775 --> 00:03:32.750
We will focus on item.
So, I click on GetMedialtemlnfo_Value
00:03:32.751 --> 00:03:35.257
and I see this function.
00:03:35.258 --> 00:03:40.386
If I want to get the state of
Mute of the item.
00:03:42.493 --> 00:03:45.519
I add a breakline,
it is more readable.
00:03:45.520 --> 00:03:49.783
I add item_mute =
00:03:49.784 --> 00:03:51.486
and I copy this function.
00:03:55.032 --> 00:04:02.676
The item that we will set as parameter
is the item stored in item variable.
00:04:02.677 --> 00:04:06.445
I activate the automatic break lines
of Notepad++ so it is more readable...
00:04:07.792 --> 00:04:13.235
As second parameter, it asks for the
name of the type of value we want
00:04:13.236 --> 00:04:18.452
It has to be a string
so I write "".
00:04:18.452 --> 00:04:22.281
The parameter we want in our case
is called "B_Mute".
00:04:22.282 --> 00:04:25.088
I copy "B_Mute"
and I paste it here.
00:04:27.569 --> 00:04:34.038
I delete that...
I add a break line here...
00:04:39.180 --> 00:04:43.047
and I ask to the console
to display the value of item_mute.
00:04:44.986 --> 00:04:46.209
I get back here.
00:04:47.486 --> 00:04:49.089
I run the script.
00:04:49.090 --> 00:04:52.120
And we see that the value is 0.
00:04:52.121 --> 00:04:57.057
If I mute the item
and I run the script again...
00:04:57.058 --> 00:05:01.921
we see that when the item is muted,
the value displayed is one.
00:05:01.922 --> 00:05:07.674
In other words,
GetMedialtemlnfo_Value("B_Mute")
00:05:07.675 --> 00:05:12.406
return 1, when the item is muted.
00:05:12.407 --> 00:05:17.411
Another parameter very interesting
is the position.
00:05:18.417 --> 00:05:22.550
We will duplicate this line.
00:05:22.551 --> 00:05:25.643
We name this variable item_pos.
00:05:27.602 --> 00:05:30.653
We add the parameter "D_POS"
00:05:30.654 --> 00:05:35.970
and we will display the value
of this variable.
00:05:35.971 --> 00:05:39.917
So that we can see better,
I will add...
00:05:39.918 --> 00:05:45.471
"Item Mute =" ..
00:05:47.190 --> 00:05:50.957
And here "Item Position =" ..
00:05:59.080 --> 00:06:01.367
I save and run.
00:06:03.248 --> 00:06:08.040
It seems that I made a mistake somewhere...
00:06:08.041 --> 00:06:13.821
Oh I forgot to add points
to tell we merge two strings.
00:06:13.822 --> 00:06:15.635
I run the script again.
00:06:15.636 --> 00:06:19.879
We see Item Mute = 0 and
Item Position = 0
00:06:19.880 --> 00:06:25.642
Item Position = 0 because
I made a mistake here (one trailing space).
00:06:25.643 --> 00:06:32.298
We will have to be vigilent when coding one small
space at the wrong place can broke the script.
00:06:32.299 --> 00:06:33.789
I run the script again.
00:06:36.288 --> 00:06:41.391
Here we see the item position
in seconds.
00:06:41.392 --> 00:06:48.106
As you can see, it is very precise.
00:06:48.107 --> 00:06:51.473
If I want to display the duration,
I duplicate
00:06:52.723 --> 00:06:56.274
I get the parameter value here.
00:07:00.107 --> 00:07:01.759
I replace.
00:07:02.817 --> 00:07:06.255
I rename the variable.
00:07:07.672 --> 00:07:13.077
And I duplicate that too,
and display the item length.
00:07:15.475 --> 00:07:19.251
I save, I select the item
I run the script.
00:07:20.476 --> 00:07:24.506
We see that the item length
as the same value as the item pos
00:07:24.507 --> 00:07:30.218
because I forgot to copy paste
the variable here...
00:07:30.219 --> 00:07:32.408
VoilĂ . I run again.
00:07:35.009 --> 00:07:37.319
We will see that the
item length is 9 seconds.
00:07:37.320 --> 00:07:45.320
If I make it shorter, it display 5s,
if I extend, it displays 9 seconds.
00:07:46.162 --> 00:07:51.677
Another item parameter often used
by scripters is the volume.
00:07:51.678 --> 00:07:55.740
I will show you how it works,
because it is a bit special.
00:07:55.741 --> 00:07:58.465
I duplicate this.
00:07:58.466 --> 00:08:00.322
"D_VOL"
00:08:00.323 --> 00:08:07.028
Note that the variable can be named
with every name that you want.
00:08:09.560 --> 00:08:13.045
I duplicate this line.
00:08:16.218 --> 00:08:18.081
And I wrote item_vol here.
00:08:19.572 --> 00:08:23.081
If I execute the script, I can see that
item_vol = 1
00:08:23.082 --> 00:08:27.326
However, I see that item volume
is set to 0 dB.
00:08:28.336 --> 00:08:31.889
It is because the scale of the
vol parameter displayed in the console
00:08:31.890 --> 00:08:36.346
is completly different.
00:08:36.347 --> 00:08:41.341
The value returned bu "D_VOL"
is on a log scale.
00:08:42.479 --> 00:08:49.701
If item_vol = 0, it means that
that item volume is -inf dB
00:08:49.702 --> 00:08:55.105
If item_vol > 1, it means that
the item had a volume boost.
00:08:55.106 --> 00:08:59.694
I'll show you, if I set -7 dB,
and that I run the script again...
00:08:59.695 --> 00:09:02.807
We see that it is 0.4 (log scale)
00:09:02.808 --> 00:09:07.580
If I boost at 10 dB, it is equal to 3
(approx).
00:09:07.581 --> 00:09:12.429
2 on log scale is for 6 dB boost
(approx).
00:09:12.430 --> 00:09:16.254
To convert the log scale value
into dB
00:09:16.255 --> 00:09:18.557
We have to do some maths.
00:09:18.558 --> 00:09:23.018
It is a bit complicated but
we can use a code snippet
00:09:23.019 --> 00:09:30.528
a small code chunk that you can use
without having to write it from scratch
00:09:30.529 --> 00:09:34.557
You only have to understand
what variable you have to replace.
00:09:34.558 --> 00:09:38.531
Here, we just have to replace
some variable names.
00:09:38.532 --> 00:09:46.532
We will replace VolDB by item_voldB so
that it matches our other variable naming
00:09:46.712 --> 00:09:50.931
Here, the value to put
is the value of item_vol
00:09:52.214 --> 00:09:56.935
which is transform
by this formula.
00:09:56.936 --> 00:10:02.952
If I display item_volDB here...
00:10:02.953 --> 00:10:05.942
we can see that here is 0dB.
00:10:05.943 --> 00:10:10.249
And here is too. If I set to -7db
it displays -7 in the console.
00:10:10.250 --> 00:10:13.908
If I go to +6db it displays +6.
00:10:13.909 --> 00:10:19.449
There is other nice parameters,
00:10:19.450 --> 00:10:20.940
such as fades length,
00:10:22.410 --> 00:10:25.378
snap offset position,
00:10:25.379 --> 00:10:27.787
and color of the object.
00:10:27.788 --> 00:10:32.145
Now imagine that we want to
modify these values.
00:10:32.146 --> 00:10:38.197
There is a sister function of
GetMedialtemlnfo_Value which is...
00:10:38.198 --> 00:10:40.082
I'll show you...
00:10:43.251 --> 00:10:46.313
which is SetMedialtemlnfo_Value
00:10:46.314 --> 00:10:52.321
we can see that it look like the Get
version so that there a third parameter
00:10:52.322 --> 00:10:54.912
which is the new value we want
to set.
00:10:54.913 --> 00:10:56.472
I will copy that.
00:10:58.569 --> 00:10:59.569
Put it here...
00:11:00.980 --> 00:11:05.387
The item we want to modify
is still in the item variable.
00:11:05.388 --> 00:11:12.178
We will start by setting
the mute parameter.
00:11:15.096 --> 00:11:17.830
"B_MUTE"
00:11:17.831 --> 00:11:21.885
As new value, we set 0.
00:11:21.886 --> 00:11:23.241
If I run the script...
00:11:24.415 --> 00:11:25.946
Nothing happens.
00:11:25.947 --> 00:11:29.894
But if I zoom out,
or click, you see that
00:11:29.895 --> 00:11:32.185
the item has been unmuted.
00:11:32.186 --> 00:11:35.080
We have to add at the end of the script
00:11:35.081 --> 00:11:38.332
a simple function UpdateArrange
00:11:38.333 --> 00:11:42.490
which allows to update the arrange view
if some items have been modified.
00:11:42.491 --> 00:11:45.430
Now, if I change the script...
00:11:46.488 --> 00:11:49.707
You see that I don't need to click
00:11:50.907 --> 00:11:52.949
to refresh the arrange view
(and the item).
00:11:53.974 --> 00:11:55.615
Now if I want to modify...
00:11:57.467 --> 00:11:59.984
the position...
00:11:59.985 --> 00:12:03.548
I write a new position in seconds.
00:12:05.326 --> 00:12:09.618
I set "D_POSITION" as second parameter.
00:12:09.619 --> 00:12:14.360
And now my item should go to 1.5 second.
00:12:14.361 --> 00:12:17.100
The item is nicely placed at 1.5 s
in the project.
00:12:20.874 --> 00:12:22.862
If I set 3...
00:12:24.178 --> 00:12:25.474
it will go there...
00:12:25.475 --> 00:12:28.318
We can of course use calculations.
00:12:28.319 --> 00:12:30.730
5 + 10
00:12:30.731 --> 00:12:33.123
and it will go at position 15 s.
00:12:33.124 --> 00:12:35.436
To modify the volume,
00:12:35.437 --> 00:12:39.834
I will advice you to modify the
volume converted in dB.
00:12:39.835 --> 00:12:44.502
But you will have to set it back
to log to make the modification valid.
00:12:44.503 --> 00:12:49.069
If we want to add
+1 dB to our item
00:12:50.098 --> 00:12:53.000
We can do the following thing...
00:12:53.001 --> 00:12:54.387
And here I do...
00:12:55.989 --> 00:12:59.209
reaper. SeMedialtemlnfo_Value(item,
"D_VOL"...
00:13:03.370 --> 00:13:06.411
reaper. SeMedialtemlnfo_Value(item,
"D_VOL", item_volDB)
00:13:06.412 --> 00:13:12.276
It is still express into dB
we have to convert it in Log scale
00:13:12.277 --> 00:13:16.507
Here is the code snippet.
00:13:19.554 --> 00:13:21.231
We put it here.
00:13:22.495 --> 00:13:29.694
And we replace calc
the variable we have to change,
00:13:29.695 --> 00:13:35.448
by what we wanted (our dB value +1)
00:13:35.449 --> 00:13:39.064
I unmute the item,
and I run the script.
00:13:42.689 --> 00:13:48.138
The item goes to position 0,
its volume had a +1 dB boost,
00:13:48.139 --> 00:13:51.430
and it is not muted anymore.
If I run the script again...
00:13:51.431 --> 00:13:54.966
we will see that the item volume
gets another extra +1 dB boost.
00:13:54.967 --> 00:14:00.724
If I want to substract 1 dB,
I set - here, and when I run the script...
00:14:02.232 --> 00:14:03.621
The item volume goes down.
00:14:03.622 --> 00:14:08.760
In the next videos, we will see how to get the
parameter values of several selected items
00:14:08.761 --> 00:14:11.485
and how to modify them
one after the other.