Jump to content


Photo

New Tool (2.8): Guru


  • Please log in to reply
349 replies to this topic

#1 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 02 April 2012 - 22:31

Guru is a Renoise tool for editing sounds on external hardware synthesizers via midi.

Guru provides a generic user interface for editing all the parameters of a synth. All parameters are midi assignable in Renoise, so they can be mapped to a midi controller.

The patches created using Guru can be saved as files, so you can save you own preset sounds and share with others.

Posted Image

Latest version:
Note! Updating will delete files that are not supplied with the tool, including synth definitions you are working on (that are not included with Guru yet), so make sure you backup you work first

Documentation:

Edited by Cornbeast, 02 July 2012 - 22:20.

  • taktik, Dr. Drips, Ledger and 8 others like this

#2 esaruoho

esaruoho

    Guruh Motha Fakka is Levitating and Knows Everything About Renoise Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPipPipPip
  • 2533 posts
  • Gender:Male
  • Location:Kontula, Helsinki, Finland
  • Interests:// Free Energy // Cymatics // Sound visualization // Sustainable energy production // Apple devices // Tesla Motors //

Posted 02 April 2012 - 22:33

hmm, what would it take to offer presets, for like, f.ex., alphajuno2? ;)

| lackluster Website | lackluster on bandcamp | lackluster on facebooklackluster on soundcloud | esaruoho on twitter |

esaruoho@gmail.comesaruoho on reddit | esaruoho on ello | 

| OS X 10.11 El Capitan | Mac Book Pro 2.66 GHz Intel Core 2 Duo / 8GB 1067 MHz DDR3 |

| Latent Impulse Tracker/Scream Tracker 3/Schism Tracker <-> Renoise fanatic |

More API functions, please! ;)

#3 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 02 April 2012 - 22:50

hmm, what would it take to offer presets, for like, f.ex., alphajuno2? ;)


Yo! I plan to make some presets :-), just haven't got the time. And if anyone makes a synth mapping I will include it with the tool, and offer it to download aside as well.

But it's really really simple.

For Juno 2:

http://www.vintagesy...oland/sysex.php

10 	VCF Cutoff (0..7F) 	F0 41 36 00 23 20 01 10 00 F7

The values in that table are hexadecimal, and you want it to be decimal. So go here: http://www.statman.i...exadecimal.html

10 = 16. 16 is the number.

return SynthDefinition {
  name = "Roland Alpha Juno 1, 2 & MKS-50",
  author = "Cornbeast [cornbeast@cornbeast.com]",
  sysex_message_start = {0x41, 0x36, 0x00, 0x23, 0x20, 0x01},
  Container {
    name = "VCF",
    Parameter {
      id = "vcf_cutoff",
      name = "VCF Cutoff",
      number = 16
    }
  }
}

Cheers

#4 dby

dby

    Big Super GrandMasta Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPip
  • 767 posts
  • Gender:Male

Posted 03 April 2012 - 04:54

Great. You put this together faster than I figured out how Ctrlr works. :)

I'll try to make a mapping for the DSI Tetra.

#5 dby

dby

    Big Super GrandMasta Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPip
  • 767 posts
  • Gender:Male

Posted 03 April 2012 - 06:23

Getting an error message when installing:

'C:\Users\Dby\AppData\Roaming\Renoise\V2.8.0\Scripts\Tools\com.cornbeast.Guru.xrnx\' failed to load.

Please remove this tool or contact the author (Cornbeast [cornbeast@cornbeast.com]) for assistance...

cannot open C:\Users\Dby\AppData\Roaming\Renoise\V2.8.0\Scripts\Tools\com.cornbeast.Guru.xrnx\/synthdefinitions/example_synth_def.lua: No such file or directory
stack traceback:
[C]: in function 'dofile'
main.lua:61: in function 'read_synth_definitions'
main.lua:50: in function 'init'
main.lua:88: in main chunk

#6 dby

dby

    Big Super GrandMasta Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPip
  • 767 posts
  • Gender:Male

Posted 03 April 2012 - 07:01

Any suggestions on how I could map Oscillator shape in a nice way that don't screw up MIDI mappings. It's one parameter... 0 = Osc off, 1 = Saw, 2 = Tri, 3 = Saw/Tri mix... and 4-103 Pulse wave, width 0 - 99. I usually just map a single slider, but it would be nice if there was five buttons and a slider for pulse width... But I'd still like to be able to map to one MIDI knob. Any ideas? I'll just make a single slider for now.

#7 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 03 April 2012 - 08:18

Getting an error message when installing:

'C:\Users\Dby\AppData\Roaming\Renoise\V2.8.0\Scripts\Tools\com.cornbeast.Guru.xrnx\' failed to load.

Please remove this tool or contact the author (Cornbeast [cornbeast@cornbeast.com]) for assistance...

cannot open C:\Users\Dby\AppData\Roaming\Renoise\V2.8.0\Scripts\Tools\com.cornbeast.Guru.xrnx\/synthdefinitions/example_synth_def.lua: No such file or directory
stack traceback:
[C]: in function 'dofile'
main.lua:61: in function 'read_synth_definitions'
main.lua:50: in function 'init'
main.lua:88: in main chunk


Hmm, looks like I got the path wrong. But it works for me on Win 7. What OS are you using?

#8 dby

dby

    Big Super GrandMasta Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPip
  • 767 posts
  • Gender:Male

Posted 03 April 2012 - 08:36

I'm on Vista 32-bit.

#9 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 03 April 2012 - 08:55

Any suggestions on how I could map Oscillator shape in a nice way that don't screw up MIDI mappings. It's one parameter... 0 = Osc off, 1 = Saw, 2 = Tri, 3 = Saw/Tri mix... and 4-103 Pulse wave, width 0 - 99. I usually just map a single slider, but it would be nice if there was five buttons and a slider for pulse width... But I'd still like to be able to map to one MIDI knob. Any ideas? I'll just make a single slider for now.

Hmm, tricky, but not impossible. Let's figure something out.

One simple but ugly solution would be to have one knob with values 0,1,2,3 and a slider with values 0-100 and then add the ability to let one value sent be two values added to eachother. So, knob = 3 + slider = 50 = 53. But the ugly part is, if button = 2 and slider = 50 = 53, then it would not be Tri, but Pulse.

So, I'm thinking about adding the ability to attach functions in the definitions, so that you can do your own logic for special cases. Still not sure how this would look, but something like this maybe:

Container {
	Parameter {
		id = "osc_waveform_switch",
		number = 55,
		items = {"Off,"Saw","Tri","S/T mix","Pulse"},
		value_function = function(value){
			if (value > 2) then
				return value + some_way_to_reference_other_param_values("osc_waveform_slider")
			end
			return value
		},
	},
	Parameter {
		id = "osc_waveform_slider",
		number = 55,
		max_value = 100,
		value_function = function(value){
			if (some_way_to_reference_other_param_values("osc_waveform_switch") > 2)
				return value + some_way_to_reference_other_param_values("osc_waveform_switch")
			end
			return some_way_to_reference_other_param_values("osc_waveform_switch")
		},
	}
}

Edited by Cornbeast, 03 April 2012 - 08:55.


#10 mr_mark_dollin

mr_mark_dollin

    Guruh Motha Fakka is Levitating and Knows Everything About Renoise Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPipPipPip
  • 2823 posts
  • Gender:Male
  • Location:In the Pattern Matrix.
  • Interests:Quiet Revolutions.

Posted 03 April 2012 - 09:01

Damn, and here I was thinking this tool would open up a window where a Guru could speak cryptically to me about how to finish my song. ;)
Posted Image

#11 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 03 April 2012 - 09:03

I'm on Vista 32-bit.

Hmm, ok, if you have scripting enabled, please try to modify the path for the function that tries to load the file to have backslashes.

Here you see, its on line 58: http://code.google.c...u.xrnx/main.lua

Damn, and here I was thinking this tool would open up a window where a Guru could speak cryptically to me about how to finish my song. ;)

Sorry, this guru can only speak cryptically to other synths ;-)

#12 taktik

taktik

    Renoise Developer

  • Admins
  • PipPipPipPipPipPipPipPipPipPipPipPipPipPipPipPip
  • 15040 posts
  • Gender:Male
  • Location:Berlin, Germany
  • Interests:füße waschen

Posted 03 April 2012 - 09:36

Hmm, ok, if you have scripting enabled, please try to modify the path for the function that tries to load the file to have backslashes.


This should do:
local folder_path = os.currentdir() .. "synthdefinitions"

os.currentdir() will always return a path with a trailing slash on all platforms.

Amazing work, btw!

#13 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 03 April 2012 - 09:51

This should do:

local folder_path = os.currentdir() .. "synthdefinitions"

os.currentdir() will always return a path with a trailing slash on all platforms.

Roger that, will fix tonite.

Amazing work, btw!

Thanks!

#14 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 03 April 2012 - 10:07

This should do:

local folder_path = os.currentdir() .. "synthdefinitions"


Oh, and by the way, what security considerations are there to take into account here.

The code in a lua file read in and executed can do really malicious stuff, right? Or are there limitations for the tools?

I'm thinking about maybe making online sharing of synth defs, maybe downloadable via the tool. If so, I need to manually approve all the submissions. Probably a good idead anyway, but I'm just thinking...

#15 drakmaniso

drakmaniso

    Advanced Member

  • Normal Members
  • PipPipPip
  • 102 posts
  • Gender:Not Telling

Posted 03 April 2012 - 10:52

Nice work! My waldorf microQ needs a new power supply, but if I get it to work I'll try to contribute a mapping for it.

Oh, and by the way, what security considerations are there to take into account here.

The code in a lua file read in and executed can do really malicious stuff, right? Or are there limitations for the tools?

Using setfenv, you can limit which lua functions are available to the definition files. If you set it to a table containing only your functions/classes, then I don't think anything malicious is possible.

Edited by drakmaniso, 03 April 2012 - 11:00.


#16 Jalex

Jalex

    Big Masta Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPip
  • 515 posts
  • Gender:Male

Posted 03 April 2012 - 11:42

Very strange bug, after instal this script, rigth now dont work any funktuon in the prefernce when i clic select audio card roll, roll fast close and i do not select item. and dont work in the pattern selected area when I hold objects do not transfer.

osx 64 bit

Edited by Jalex, 03 April 2012 - 11:44.


#17 dby

dby

    Big Super GrandMasta Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPip
  • 767 posts
  • Gender:Male

Posted 03 April 2012 - 13:02

I have made some progress, but I don't understand what I should enter after "sysex_message_start ="

I didn't think I needed it since it's all NRPN so far, but I get an error on startup:

.\class_synthdefinition.lua:11: SynthDefinition.sysex_message_start is missing
stack traceback:
  [C]: in function 'assert'
  .\class_synthdefinition.lua:11: in function <.\class_synthdefinition.lua:8>
  [C]: in function 'SynthDefinition'
  ....cornbeast.Guru.xrnx\/synthdefinitions/dsi_tetra.lua:1: in main chunk
  [C]: in function 'dofile'
  main.lua:61: in function 'read_synth_definitions'
  main.lua:50: in function 'init'
  main.lua:88: in main chunk

The DSI Tetra manual has this on sysex:

Sysex Messages
Universal System Exclusive Message (Device Inquiry)
Status Description
1111 0000 System Exclusive (SysEx)
0111 1110 Non-realtime message
0vvv vvvv If MIDI channel is set to 1-16, 0vvvvvvv must match (unless MIDI Channel
= ALL); always responds if 0vvvvvvv = 0111 1111.
0000 0110 Inquiry Message
0000 0001 Inquiry Request
1111 0111 End of Exclusive (EOX)
Tetra responds with:
Status Description
1111 0000 System Exclusive (SysEx)
0111 1110 Non-realtime message
63
0vvv vvvv If MIDI Channel = ALL, 0vvvvvvv = 0111 1111. Otherwise 0vvvvvvv =
Channel Number 0-15.
0000 0110 Inquiry Message
0000 0010 Inquiry Reply
0000 0001 DSI ID
0010 0110 Tetra ID (Family LS)
0000 0001 Family MS
0000 0000 Family Member LS
0000 0000 Family Member MS
0jjj nnnn Main Software version: jjj — Minor rev; nnnn — Major rev
0000 0000 Zero Byte
0000 0000 Zero Byte
1111 0111 End of Exclusive (EOX)
plus some about data dumps.

And this might be related?
Packed Data Format
Data is packed in 8 byte “packets”, with the MS bit stripped from 7 parameter
bytes, and packed into an eighth byte, which is sent at the start of the 8 byte
packet.
Example:
Input Data                  Packed MIDI data
1 A7 A6 A5 A4 A3 A2 A1 A0   1 00 G7 F7 E7 D7 C7 B7 A7
2 B7 B6 B5 B4 B3 B2 B1 B0   2 00 A6 A5 A4 A3 A2 A1 A0
3 C7 C6 C5 C4 C3 C2 C1 C0   3 00 B6 B5 B4 B3 B2 B1 B0
4 D7 D6 D5 D4 D3 D2 D1 D0   4 00 C6 C5 C4 C3 C2 C1 C0
5 E7 E6 E5 E4 E3 E2 E1 E0   5 00 D6 D5 D4 D3 D2 D1 D0
6 F7 F6 F5 F4 F3 F2 F1 F0   6 00 E6 E5 E4 E3 E2 E1 E0
7 G7 G6 G5 G4 G3 G2 G1 G0   7 00 F6 F5 F4 F3 F2 F1 F0
                            8 00 G6 G5 G4 G3 G2 G1 G0
This explains why it takes 293 MIDI bytes to transmit 256 Program data bytes.

Edited by dby, 03 April 2012 - 13:23.


#18 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 03 April 2012 - 13:43

I have made some progress, but I don't understand what I should enter after "sysex_message_start ="


Agwwfff midi is the worst mess I've ever seen. But we will get trough this.

Try setting mode to NRPN and see if this works:

Parameter{
	id = "filter-frequency",
	name = "Filter frequency",
	type = "nrpn",
	number = 215,
	max_value = 164
}

See manual section under NRPN / Program Parameter Data for more parameter numbers / values

But you need to uncomment line 21 in class_parameter.lua :-)

And you're right sysex start should not be needed there, just enter anything for the time being...

Edited by Cornbeast, 03 April 2012 - 13:44.


#19 dby

dby

    Big Super GrandMasta Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPip
  • 767 posts
  • Gender:Male

Posted 03 April 2012 - 14:05

Ok, I just copied the line from the example file, and now it opens. Looks ok. Lets see if I can get it to communicate with the Tetra.

I have been defining all NRPN's.

I don't understand what I need to uncomment, sorry. :huh:

#20 dby

dby

    Big Super GrandMasta Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPip
  • 767 posts
  • Gender:Male

Posted 03 April 2012 - 14:15

This is what I got so far:
return SynthDefinition {
  name = "DSI Tetra",
  author = "DBY",
  sysex_message_start = {0x41, 0x36, 0x00, 0x21, 0x20, 0x01},
  Container {
    name = "DSI Tetra",
    style = "panel",    
    Container {
      name = "OSC",
      Container {
      name = "OSC 1",
        Parameter {
          id = "osc_1_freq",
          name = "Frequency",
          type = "nrpn",
          number = 0,
          max_value = 120
        },
        Parameter {
          id = "osc_1_freq_fine",
          name = "Fine Tune",
          type = "nrpn",
          number = 1,
          max_value = 100,
          default_value = 50
        },
        Parameter {
          id = "osc_1_shape",
          name = "Shape",
          type = "nrpn",
          number = 2,
          max_value = 103
        },
        Parameter {
          id = "osc_1_glide",
          name = "Glide",
          type = "nrpn",
          number = 3,
          max_value = 127
        },
        Parameter {
          id = "osc_1_key",
          name = "Key Track",
          type = "nrpn",
          number = 4,
          items = {"Off","On"},
          max_value = 1
        },
        Parameter {
          id = "sub_osc_1",
          name = "Sub OSC",
          type = "nrpn",
          number = 5,
          max_value = 127
        }
      },

      Container {
        name = "OSC 2",
        Parameter {
          id = "osc_2_freq",
          name = "Frequency",
          type = "nrpn",
          number = 6,
          max_value = 120
        },
        Parameter {
          id = "osc_2_freq_fine",
          name = "Fine Tune",
          type = "nrpn",
          number = 7,
          max_value = 100,
          default_value = 50
        },
        Parameter {
          id = "osc_2_shape",
          name = "Shape",
          type = "nrpn",
          number = 8,
          max_value = 103
        },
        Parameter {
          id = "osc_2_glide",
          name = "Glide",
          type = "nrpn",
          number = 9,
          max_value = 127
        },
        Parameter {
          id = "osc_2_key",
          name = "Key Track",
          type = "nrpn",
          number = 10,
          items = {"Off","On"},
          max_value = 1
        },
        Parameter {
          id = "sub_osc_2",
          name = "Sub OSC",
          type = "nrpn",
          number = 11,
          max_value = 127
        }
      },
      Parameter {
        id = "osc_hard_sync",
        name = "Hard Sync",
        type = "nrpn",
        number = 12,
        items = {"Off","On"},
        max_value = 1
      },
      Parameter {
        id = "glide_mode",
        name = "Glide Mode",
        type = "nrpn",
        number = 13,
        items = {"Fixed Rate","Fixed Rate Auto","Fixed Time","Fixed Time Auto"},
        max_value = 3
      },
      Parameter {
        id = "osc_slop",
        name = "OSC Slop",
        type = "nrpn",
        number = 14,
        max_value = 5
      },
      Parameter {
        id = "pitch_range",
        name = "Pitch Bend Range",
        type = "nrpn",
        number = 15,
        max_value = 12
      },
      Parameter {
        id = "osc_mix",
        name = "OSC 1-2 Mix",
        type = "nrpn",
        number = 16,
        max_value = 127,
        default_value = 64
      },
      Parameter {
        id = "noise_level",
        name = "Noise Level",
        type = "nrpn",
        number = 17,
        max_value = 127
      },
      Parameter {
        id = "feedback_volume",
        name = "Feedback Volume",
        type = "nrpn",
        number = 18,
        max_value = 127
      },
      Parameter {
        id = "feedback_gain",
        name = "Feedback Gain",
        type = "nrpn",
        number = 19,
        max_value = 127
      }
    }
  }
}

I have set max values, but the sliders still go to 16383.
There is some sort of communication, the sound is changed but not the way it's supposed to.

Edited by dby, 03 April 2012 - 14:19.


#21 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 03 April 2012 - 14:21

I have set max values, but the sliders still go to 16383.
There is some sort of communication, the sound is changed but not the way it's supposed to.


Yo!

Yeah, the 16383 is a misunderstanding from my part, that's what you need to uncomment in my code.

If you have renoise scripting enabled you can open the file "class_parameter.lua" in my tool and edit it.
On line 21, just add "--" and try again.

#22 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 03 April 2012 - 14:34


        Parameter {
          id = "osc_1_freq",
          name = "Frequency",
          type = "nrpn",
          number = 0,
          max_value = 120
        },


Ah, and hte number has to be the nrpn parameter number according to the tetra manual. 215 is filter frequency for example!

#23 dby

dby

    Big Super GrandMasta Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPip
  • 767 posts
  • Gender:Male

Posted 03 April 2012 - 14:45

Yes Osc 1 Frequency is param 0, according to the manual. I got OSC 1 working, not sure why the second is not, I'll have to double check the numbers.

#24 dby

dby

    Big Super GrandMasta Member

  • Normal Members
  • PipPipPipPipPipPipPipPipPipPipPip
  • 767 posts
  • Gender:Male

Posted 03 April 2012 - 14:55

The numbers seem correct. And I can control both oscillators with the Ctrlr panel I started building yesterday. Looks like it's the parameters inside the OSC 2 container that isn't working. Everything below seems to work fine.

Edited by dby, 03 April 2012 - 14:57.


#25 Cornbeast

Cornbeast

    Super Advanced Member

  • Normal Members
  • PipPipPipPip
  • 179 posts

Posted 03 April 2012 - 15:22

The numbers seem correct. And I can control both oscillators with the Ctrlr panel I started building yesterday. Looks like it's the parameters inside the OSC 2 container that isn't working. Everything below seems to work fine.

Oh, but I think you have to use column B in the "Program Parameter Data" table of the manual, where Oscillator 1 Frequency is 200, not 0.

Dont' ask me why :-)

Oh, but I think you have to use column B in the "Program Parameter Data" table of the manual, where Oscillator 1 Frequency is 200, not 0.

Dont' ask me why :-)


Or is it two voices, A and B?
A = column A = 0
B = column B = 200

?