Development of "VPDpro. Arpeggia". Some demonstrations

The " VPDpro. Arpeggia" tool is the little brother of " VPDpro. Automa32"and it serves to control between 4 to 16 blocks of two horizontal points for automation editor. This allows you to easily create pieces of envelopes with this block addition feature. It is similar to an arpeggiator, with the advantage of being able to work with any parameter of any device in each track.

Arpeggia can have up to 99 presets of blocks and the best thing is that you can control the amplitude or separation between the 2 points that define each block.

7769 vpdpro-arpeggia-01.gif

It has a preview panel and allows you to transfer blocks from the beginning of one line to another.This panel is used to control the level of each block or delete blocks or eliminate groups of 4 blocks. Each block has up to 21 levels (0 to 10 in sections of 0.5)…

7770 vpdpro-arpeggia-02.gif

Here a pattern of 64 lines is used. It is possible to create an envelope and stretch it horizontally according to the value of the “Amplitude” (number of lines occupied by a block, until 16 lines) and “Amount” (the number of blocks, until 16).In total it is capable of covering up to 256 lines (16 x 16), half of a pattern of 512 lines.

Do not lose sight of the vertical blue bar, which indicates the selected line of the pattern.The screenshots have not gone very well (when pressing a button it is not appreciated…). It is the first time that I control the tool ^_^.I just realized that the Random button has a problem in its function. I guess I’ll fix it.

Arpeggia is another window module that will be part of the VPDpro multitool…

Note: this tool could be improved if the a set of 3 buttonsdrag with the mouse was used for each block. But I still do not know how to do this.In its place there are up to 20 buttons for each block.For the blocks I use negative margins to compact the buttons and get a more pleasant look.

Amazing… like always.

Amazing… like always.

Thanks!

This is for us Circe!:

7771 VPDpro-orchestral-01.png

Now I’m stuck with this new tool ( VPDpro. Orchestral ), to add tracks and groups in a comfortable way for our orchestral compositions.It is still a prototype.I want to think about it well so that it is very easy to add groups of tracks.with the order, name, color, etc…I need to add a group of “BATTERY”, below PERCUSSION.

Do you miss any instrument name? I accept suggestions!

When I get bored with one tool, I jump to another :lol:.

Thanks again… Bassoon
Add Flugelhorn on winds.Alto on voices

Thanks again… Bassoon
Add Flugelhorn on winds.Alto on voices

Basson and contrabassonare already included.

Flugelhornwill include it inside Winds. I Agree.I have to change the title “Woodwinds” by "Winds"encompassing all wind, wood and metal.By the way, have you been to the concerts of the FSO?I went on December 2 in Valencia. I loved very much! I recommend it to you. They tour around Spain. In 2018 they will also tour. In case it falls near you and you want to see it.

I leave a link in case you are interested:http://www.filmsymphony.es/

^^ ^^ ^_^how exaggerated is the music in the trailer!!!

Doble ss y doble oo. = Bassoon.?️

Doble ss y doble oo. = Bassoon.

:blink:I missed one “o”!!! Bassooooooooon!!! Ok! Thanks!

I do not rule out that there are more spelling mistakes…

Don’t have in mind.

This classification is already a little better and more complete:

7772 VPDpro-orchestral-02.png

To be continue… :slight_smile:

Oh, why I bought Volumeshaper and other tools?

This is looking great. VDPRO seems to have everything. :slight_smile:

ThatVPDpro. Arpeggia tool looks pretty amazing. I only would remove “VPDpro” from the name. Does it draw beyond pattern boundaries, so continues then in the next pattern?

Wondered, what does VPD stand for Raul?

Oh, why I bought Volumeshaper and other tools?

This is looking great. VDPRO seems to have everything. :slight_smile:

Thank you! Possibly increase a little more until I finish it…

I have finished both Automa32 and Arpeggia. All I have to do is fill in some tables with numbers for all the curves and envelopes of the presets and that costs a lot.With the automation editor it is possible to control any parameter of any device. If it were more advanced, more developed, it would have enormous potential. That’s why I created these tools. I wish it were all integrated and easier to use, without the need to resort to tools. But hey, a well-made tool is better than an external VST. Also, it’s free!

ThatVPDpro. Arpeggia tool looks pretty amazing. I only would remove “VPDpro” from the name. Does it draw beyond pattern boundaries, so continues then in the next pattern?

In the drop-down menus it will appear as “Arpeggia…”, or “Automa32…”. But these tools are daughters of VPDpro. In fact they can not work well without the main tool. Everything is integrated to be able to always use the same controls. Even if you have the Arpeggia window open, you are controlling VPDpro with the keyboard commands. It is a whole.Also from the VPDpro main window, you can invoke the other windows.

Arpeggia works without skipping the pattern.I have thought that it is better to follow Renoise’s idea of being squared, and to work pattern by pattern, separately.

I think it would be possible to program to cover two or more patterns, but it would be more expensive. Also, programming for the automation editor is a bit more messy than in other areas. I have some strange doubts derived with problems between the limits of the pattern and line. The initial pattern limit is 0.000 but the end I do not know exactly if it is x.999 or x.994 or what. And does not the second value seem to match the second to last, 0.004 and 0.996? 0.999?

Also, I think I have found a bug, related to the above.For some reason, it is not possible to eliminate the last possible point in a pattern using clear_range():

-- Remove all existing points in the given [from, to) time range from the 
-- automation.
renoise.song().patterns[].tracks[].automation[]:clear_range(from_time, to_time)

the maximum to_time is:

-- Maximum number of lines that can be present in a pattern.
renoise.Pattern.MAX_NUMBER_OF_LINES

renoise.Pattern.MAX_NUMBER_OF_LINES = 512 (lines) or 512.0000000000 lines

But in reality, the last point is the 512.999xxxxxx (time) approx.So, I do not know how todelete (clear) the last point in the case that has 512 lines in the selected pattern using clear_range. It is a special case. In summary, make tools that avoid errors because of the limits is a bit messy, because in addition to inserting points, you have to delete what was previously in the same area of each block; delete first, and then insert everything in the same function.

Now Arpeggia works fine, but it will only work on each pattern, without covering the next or the following ones.I just need to fill this table to the presets:

Click to view contents
--presets (rang 0.00 to 1.00, sections of 0.05 always)
VPD_ARP_PRESET = {
  --1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16
  { 0.50 , 0.55 , 0.50 , 0.45 , 0.50 , 0.55 , 0.50 , 0.45 , 0.50 , 0.55 , 0.50 , 0.45 , 0.50 , 0.55 , 0.50 , 0.45 }, --1
  { 0.00 , 0.05 , 0.10 , 0.15 , 0.20 , 0.25 , 0.30 , 0.35 , 0.40 , 0.45 , 0.50 , 0.55 , 0.60 , 0.65 , 0.70 , 0.75 }, --2
  { 0.25 , 0.30 , 0.35 , 0.40 , 0.45 , 0.50 , 0.55 , 0.60 , 0.65 , 0.70 , 0.75 , 0.80 , 0.85 , 0.90 , 0.95 , 1.00 }, --3
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --4
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --5
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --6
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --7
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --8
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --9
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --10
  --1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --11
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --12
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --13
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --14
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --15
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --16
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --17
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --18
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --19
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --20
  --1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --21
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --22
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --23
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --24
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --25
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --26
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --27
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --28
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --29
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --30
  --1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --31
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --32
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --33
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --34
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --35
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --36
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --37
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --38
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --39
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --30
  --1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --41
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --42
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --43
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --44
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --45
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --46
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --47
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --48
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --49
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --50
  --1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --51
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --52
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --53
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --54
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --55
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --56
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --57
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --58
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --59
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --50
  --1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --61
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --62
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --63
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --64
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --65
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --66
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --67
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --68
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --69
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --60
  --1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --71
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --72
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --73
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --74
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --75
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --76
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --77
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --78
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --79
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --70
  --1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --81
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --82
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --83
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --84
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --85
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --86
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --87
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --88
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --89
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --80
  --1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --91
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --92
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --93
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --94
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --95
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --96
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --97
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --98
  { 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --99
--{ 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 , 0.50 }, --100
}

Wondered, what does VPD stand for Raul?

V = Volume

P = Panning

D = Delay

:clownstep:

Ledger, putting the name of a tool can be the most expensive step.

Also, I think I have found a bug, related to the above.For some reason, it is not possible to eliminate the last possible point in a pattern using clear_range():

But in reality, the last point is the 512.999xxxxxx (time) approx.So, I do not know how todelete (clear) the last point in the case that has 512 lines in the selected pattern using clear_range. It is a special case. In summary, make tools that avoid errors because of the limits is a bit messy, because in addition to inserting points, you have to delete what was previously in the same area of each block; delete first, and then insert everything in the same function.

Yup, you’ll probably find that the last value is 513 Raul. Automation going from 0-64 lines, the user lua table giving point times from 1-65 (on a 64 line pattern.) Not a problem (so much, although it shouldn’t be with a ‘one off’ error) until you get to the maximum pattern length of 512 lines. User can draw in a point at > 512 (in lua point time terms), but lua automation functions only clear/accept the points between 1-512. Just to clarify that this is a little important point (no pun intended) Raul.

Thinking a little out loud, (if there is no other way of clearing that automation point table) as a side note… I don’t know if copying a dummy automation (using copy_from, that hasn’t got any time points > 512), then clearing that could completely clear the automation point/value table on a 512 line pattern (if there are some time points > 512 Raul.)

Yup, you’ll probably find that the last value is 513 Raul. …

I think not. The last value is 512.999xxxxxxx. I believe. If it were the “513” exact, I do not have any problem.By programming, I can write a point in the last time 512,999, but not delete it with clear_range.But I can erase the penultimate time, 512,994 (512,996, I do not remember exactly), using clear_range. It is as if clear_range does not have access to the last point.I mean with all the expanded zoom of the grid. It’s a bit strange.

Maybe, it is possible to add the deletion of this point to the end of the function, but this is what I call “a badly placed patch”.I am trying to make the functions as clean as I know. Therefore, I am surprised that I can not access this point. As you put in clear_range a value greater than 512.999xxxxxxxx (I do not know exactly what number it is), without reaching 513, it will return an error.

Anyway this case is a bit “hidden”. I never use 512 lines per pattern.But when programming, it is necessary to avoid any malfunction, although it is not a usual case.

User can draw in a point at > 512 (in lua point time terms), but lua automation functions only clear/accept the points between 1-512. Just to clarify that this is a little important point (no pun intended) Raul…

I can use:clear_range( 512, 512.999 ) without error.

If I use :clear_range( 512, 513) return error. 513 is not valid, because is > 512 lines.

*** std::logic_error: 'invalid 'ToTime' value. time must be >= 1 and <= Pattern.MAX_NUMBER_OF_LINES'
*** stack traceback:
*** [C]: in function 'clear_range'

But if I use:clear_range( 512, 512.999 )the range is not able to erase the point with the last possible time (I suppose 512.999 approximately).Yes it is able to erase the immediately previous one, 512,996 I think.

It is an extreme case. I can put :clear_range( 63, 63.999 )and manages to erase the last point with time 63,999.It seems that it is necessary to reach an exact 513 to be able to erase the last point, which is lower than it (512,999).

Do you have any function to print the exact time and value of the last existing point?In this case, 512.999 approx. (time)

7775 clear_range_to513.png

These are the kind of situations that cause me to waste more time.The majority has to do with avoiding errors by limits.

Edit:I have no problems inserting points, only when clearing.

Edit2:By the way, all this mess of cleaning is because I need to clear pieces of pattern, not the whole pattern.

Just to point out (no pun intended) I can draw a point in the automation and get a value of 513 in the point/value table here with Linux:

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
....cut output.....
[4] => table
    [time] => 512.99609375
    [value] => 0.60227274894714
[5] => table
    [time] => 513
    [value] => 0.59090906381607

Personally I think you have a point Raul :slight_smile:

:blink: :blink: :blink:

[1] => table
    [time] => 512.9375
    [value] => 0.66932272911072
[2] => table
    [time] => 512.9921875
    [value] => 0.54581671953201
[3] => table
    [time] => 512.99609375
    [value] => 0.43027889728546

This is what happens with R3.1.1 x64 in Windows 10 x64.These are the 3 times of the 3 points of the previous screenshot:

[time1] => 512.9375 (grid 511:240)

[time2] => 512.9921875
[time3] => 512.99609375 (last)

I can not drag the last point to the right.It is not possible to reach 513.

Can you try :clear_range (t1 , t2) to see if it clears up to 513?

Can you try :clear_range (t1 , t2) to see if it clears up to 513?

With a point/value table:

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
[1] => table
    [time] => 509
    [value] => 0.7062401175499
[2] => table
    [time] => 512.99609375
    [value] => 0.75
[3] => table
    [time] => 513
    [value] => 0.7045311331749

If I execute:

>>> renoise.song().patterns[1].tracks[1].automation[1]:clear_range(1,512.999999999)

I get (here with Linux):

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
[1] => table
    [time] => 512.99609375
    [value] => 0.75
[2] => table
    [time] => 513
    [value] => 0.7045311331749

If I execute:

>>> renoise.song().patterns[1].tracks[1].automation[1]:clear()

I get:

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
[1] => table
    [time] => 513
    [value] => 0.7045311331749

That 513 entry remains.

If I try:

>>> renoise.song().patterns[1].tracks[1].automation[1]:remove_point_at(513)

I get:

*** std::logic_error: 'invalid point time. time must be >= 1 and <= Pattern.MAX_NUMBER_OF_LINES'

If I copy an automation say from track 2 into track 1 with say:

renoise.song().patterns[1].tracks[1].automation[1]:copy_from(renoise.song().patterns[1].tracks[2].automation[1])

I get the points from track 2 into track 1. (There were no points > 512 in track 2):

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
[1] => table
    [time] => 25
    [value] => 0.5

I execute a clear:

>>> renoise.song().patterns[1].tracks[1].automation[1]:clear()

And therefore:

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
***No output***

To try to answer the difference between Linux and Windows, probably it just comes down to the difference with how embedded lua handles float point numbers between the two systems Raul. Similar to -> Small Bug in “Background Blend” values. Is value 51 omitted?

With a point/value table:

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
[1] => table
[time] => 509
[value] => 0.7062401175499
[2] => table
[time] => 512.99609375
[value] => 0.75
[3] => table
[time] => 513
[value] => 0.7045311331749

If I execute:

>>> renoise.song().patterns[1].tracks[1].automation[1]:clear_range(1,512.999999999)

I get (here with Linux):

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
[1] => table
[time] => 512.99609375
[value] => 0.75
[2] => table
[time] => 513
[value] => 0.7045311331749

If I execute:

>>> renoise.song().patterns[1].tracks[1].automation[1]:clear()

I get:

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
[1] => table
[time] => 513
[value] => 0.7045311331749

That 513 entry remains.

If I try:

>>> renoise.song().patterns[1].tracks[1].automation[1]:remove_point_at(513)

I get:

*** std::logic_error: 'invalid point time. time must be >= 1 and <= Pattern.MAX_NUMBER_OF_LINES'

If I copy an automation say from track 2 into track 1 with say:

renoise.song().patterns[1].tracks[1].automation[1]:copy_from(renoise.song().patterns[1].tracks[2].automation[1])

I get the points from track 2 into track 1. (There were no points > 512 in track 2):

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
[1] => table
[time] => 25
[value] => 0.5

I execute a clear:

>>> renoise.song().patterns[1].tracks[1].automation[1]:clear()

And therefore:

>>> rprint(renoise.song().patterns[1].tracks[1].automation[1].points)
***No output***

To try to answer the difference between Linux and Windows, probably it just comes down to the difference with how embedded lua handles float point numbers between the two systems Raul. Similar to -> Small Bug in “Background Blend” values. Is value 51 omitted?

Thanks 4Tey!!

Finally I have solved this issue by adding the cleaning at the end of the function of the exact time of the last point (time = 512.99609375).I do not like much having to resort to these solutions. Apparently, there is a rounding when you insert any point, so that the grid always falls to a value of + -0.00390625.

Now Arpeggia is already fine and there is no deadpoint in clearing a range of times within a 512 lines in selected pattern.

--clear level
function vpd_arp_clear_level( val_1, rns, sp, spt, spa, sli, amp, val_f )
  rns = renoise.song()
  sp = rns.selected_parameter
  spt = rns.selected_pattern_track
  sli = rns.selected_line_index
  amp = vws["VPD_ARP_AMPLITUDE"].value
  val_f = ( val_1 * amp - amp )
  if (sp) then
    spa = spt:find_automation( sp )
    if ( spa and vpd_arp_anchor == true ) then
      if ( (sli + val_f + amp) < 513 ) then
        spa:clear_range( sli + val_f, sli + val_f + amp )
        print("first individual")
      elseif ( (sli + val_f + amp) == 513 ) then
        spa:clear_range( sli + val_f, sli + val_f + amp -0.001 )
        ---last point
        if spa:has_point_at(512.99609375) then
          spa:remove_point_at(512.99609375)
        end
        print("last individual")
      end
    end
    ---
    for i = 0, 20 do
      vws["VPD_ARP_BT_"..val_1.."_"..i].color = VPD_ARP_CLR[1]
    end
  end
  ---
  VPD_ARP_BT_LEVEL[val_1] = nil
  --print(VPD_ARP_BT_LEVEL[val_1])
  --rprint(VPD_ARP_BT_LEVEL)
end

--clear level x4
function vpd_arp_clear_level_x4( value )
  for i = value, value + 3 do
    vpd_arp_clear_level( i )
  end
  rprint(VPD_ARP_BT_LEVEL)
end

--clear global level
function vpd_arp_gclear_level( rns, sp, spt, spa, sli, amo, amp )
  rns = renoise.song()
  sp = rns.selected_parameter
  spt = rns.selected_pattern_track
  sli = rns.selected_line_index
  amo = vws["VPD_ARP_AMOUNT"].value
  amp = vws["VPD_ARP_AMPLITUDE"].value
  if (sp) then
    spa = spt:find_automation( sp )
    if ( spa and vpd_arp_anchor == true ) then
      if ( ( sli + amo * amp ) < 513 ) then
        spa:clear_range( sli, sli + amo * amp )
        print("first global")
      elseif ( ( sli + amo * amp ) == 513 ) then
        spa:clear_range( sli, sli + amo * amp - 0.001 )
        ---last point
        if spa:has_point_at(512.99609375) then
          spa:remove_point_at(512.99609375)
        end
        print("last global")
      end
    end
  end
  ---
  for c = 1, 16 do
    for i = 0, 20 do
      vws["VPD_ARP_BT_"..c.."_"..i].color = VPD_ARP_CLR[1]
      vws["VPD_ARP_BT_G_"..i].color = VPD_ARP_CLR[1]
    end
    VPD_ARP_BT_LEVEL[c] = nil
  end
end

--clear all points
function vpd_arp_clear_all( sli, nol, sp, spt, spa )
  sli = renoise.song().selected_line_index + 0.007
  nol = renoise.song().selected_pattern.number_of_lines + 1.999
  sp = renoise.song().selected_parameter
  spt = renoise.song().selected_pattern_track
  --there might be no parameter selected...
  if (sp) then
    spa = spt:find_automation( sp )
    if (spa) then
      spa = spt:delete_automation( sp )
    end
  end
end

I enclose the rest of the functions related to erase the envelope or erase only time ranges…

Edit:I believe that as it is now, it will work well in Linux and in Windows.

Apparently, there is a rounding when you insert any point, so that the grid always falls to a value of + -0.00390625.

Automation has a fixed resolution of 256 points per line, so the position of each point does indeed get rounded off to the nearest 1/256th of a line.

You already discovered the magic value:

1 / 256 = 0.00390625