Key Tracking Device & LofiMat Freq Scaling

So, the first thing I decided to do with the Key-Tracking device was to use it in conjunction to make a harmonics synth with lofimat… :w00t:

Unfortunately, after some tinkering around, I realized that the scaling modes don’t entirely match up with the exponential scale that musical notes use. I tried setting g-1(49hz) to g-4(392hz), as they are notes that have round numbers… but the scaling modes just don’t work.

Any ideas guys? Do we need a new scaling mode? Am I just going about this all wrong?

I also did something similar during the test phase, bounding the Key-Tracking to the frequency of modulation of a RingMod filter.

I don’t think there is a solution to this, so I decided to live with the approximation.

Actually I just did a test with ringmod, and I got it working flawlessly. I’m thinking it’s just the scaling on the lofimat’s frequency.

For ringmod, use the following settings:
C0 16.35
D8 4698.64

That said, I REALLY want to be able to do this with lofimat … could a certain taktik look into this plz? :P

Tried it with BJ Lofi… had the same issues… though I’m pretty sure the scale was even more different.

This is also making me want to sync lfo to frequency as well. Unfortunately LFO only has that pesky LPC frequency :(

… any chance of getting actual frequency as an option on the LFO, guys?

… and also, perhaps it’s time for a High Frequency Oscillator(HFO) metadevice?

I can only imagine the possibilities of modulating certain parameters to the frequency of the note being played

I’m feeling the need to touch myself just thinking about this—errr I mean +1

Anyway back to the original topic… Any idea what I need to do to get the curve right for lofimat Taktik?

I was trying the same thing earlier, Bytesmasher. Well done on getting the scaling right.
Which scale curve did you use?

edit:
figured it out. Thumbs up.

Flat line… and I used a freq/note table to get the values

In general: you can scale any parameter manually using a custom LFO envelope as scaler.

Something like this chain:

<?xml version="1.0" encoding="UTF-8"?>  
<FilterDeviceChainClipboard doc_version="0">  
 <DeviceContainerSlot type="SequencerTrackDeviceChain">  
 <Devices>  
 <SequencerTrackDevice type="SequencerTrackDevice">  
 <IsActive>true</IsActive>  
 <IsSelected>false</IsSelected>  
 <SelectedPresetName>Init</SelectedPresetName>  
 <SelectedPresetIsModified>true</SelectedPresetIsModified>  
 <Panning>  
 <Value>0.5</Value>  
 <Visualization>Device only</Visualization>  
 </Panning>  
 <Volume>  
 <Value>0.81428641080856323</Value>  
 <Visualization>Device only</Visualization>  
 </Volume>  
 <Surround>  
 <Value>0.0</Value>  
 <Visualization>Device only</Visualization>  
 </Surround>  
 <PostPanning>  
 <Value>0.5</Value>  
 <Visualization>Device only</Visualization>  
 </PostPanning>  
 <PostVolume>  
 <Value>1.0</Value>  
 <Visualization>Device only</Visualization>  
 </PostVolume>  
 </SequencerTrackDevice>  
 <KeyTrackingDevice type="KeyTrackingDevice">  
 <IsActive>true</IsActive>  
 <IsSelected>false</IsSelected>  
 <SelectedPresetName>Init</SelectedPresetName>  
 <SelectedPresetIsModified>true</SelectedPresetIsModified>  
 <SrcInstrument>-1</SrcInstrument>  
 <KeyTrackingScaling>Linear</KeyTrackingScaling>  
 <KeyTrackingMode>Clamp</KeyTrackingMode>  
 <KeyTrackingMin>21</KeyTrackingMin>  
 <KeyTrackingMax>108</KeyTrackingMax>  
 <DestEffect>  
 <Value>2</Value>  
 <Visualization>Device only</Visualization>  
 </DestEffect>  
 <DestParameter>  
 <Value>6</Value>  
 <Visualization>Device only</Visualization>  
 </DestParameter>  
 <DestMin>  
 <Value>0.0</Value>  
 <Visualization>Device only</Visualization>  
 </DestMin>  
 <DestMax>  
 <Value>1.0</Value>  
 <Visualization>Device only</Visualization>  
 </DestMax>  
 </KeyTrackingDevice>  
 <LfoDevice type="LfoDevice">  
 <IsActive>true</IsActive>  
 <IsSelected>true</IsSelected>  
 <SelectedPresetName>Init</SelectedPresetName>  
 <SelectedPresetIsModified>true</SelectedPresetIsModified>  
 <RunTimePresetA type="FilterDevicePreset">  
 <DeviceSlot type="LfoDevice">  
 <Amplitude>  
 <Value>1.0</Value>  
 </Amplitude>  
 <Offset>  
 <Value>0.0</Value>  
 </Offset>  
 <Frequency>  
 <Value>9.9999999747524271e-007</Value>  
 </Frequency>  
 <Type>  
 <Value>4</Value>  
 </Type>  
 <CustomEnvelope>  
 <PlayMode>Linear</PlayMode>  
 <Length>88</Length>  
 <ValueQuantum>0.0</ValueQuantum>  
 <Points>  
 <Point>0,0.013179999776184559</Point>  
 <Point>87,0.68580001592636108</Point>  
 </Points>  
 </CustomEnvelope>  
 <CustomEnvelopeOneShot>false</CustomEnvelopeOneShot>  
 </DeviceSlot>  
 </RunTimePresetA>  
 <DestEffect>  
 <Value>3</Value>  
 <Visualization>Device only</Visualization>  
 </DestEffect>  
 <DestParameter>  
 <Value>1.0</Value>  
 <Visualization>Device only</Visualization>  
 </DestParameter>  
 <Amplitude>  
 <Value>1.0</Value>  
 <Visualization>Device only</Visualization>  
 </Amplitude>  
 <Offset>  
 <Value>0.0</Value>  
 <Visualization>Device only</Visualization>  
 </Offset>  
 <Frequency>  
 <Value>9.9999999747524271e-007</Value>  
 <Visualization>Device only</Visualization>  
 </Frequency>  
 <Type>  
 <Value>4</Value>  
 <Visualization>Device only</Visualization>  
 </Type>  
 <CustomEnvelope>  
 <PlayMode>Linear</PlayMode>  
 <Length>88</Length>  
 <ValueQuantum>0.0</ValueQuantum>  
 <Points>  
 <Point>0,0.013179999776184559</Point>  
 <Point>12,0.025801807641983032</Point>  
 <Point>24,0.050010278820991516</Point>  
 <Point>36,0.094572365283966064</Point>  
 <Point>48,0.16812294721603394</Point>  
 <Point>60,0.28166118264198303</Point>  
 <Point>73,0.44736841320991516</Point>  
 <Point>87,0.68580001592636108</Point>  
 </Points>  
 </CustomEnvelope>  
 <CustomEnvelopeOneShot>false</CustomEnvelopeOneShot>  
 </LfoDevice>  
 <Lofi2Device type="Lofi2Device">  
 <IsActive>true</IsActive>  
 <IsSelected>false</IsSelected>  
 <SelectedPresetName>Init</SelectedPresetName>  
 <SelectedPresetIsModified>true</SelectedPresetIsModified>  
 <Bits>  
 <Value>16</Value>  
 <Visualization>Device only</Visualization>  
 </Bits>  
 <Rate>  
 <Value>0.061731040477752686</Value>  
 <Visualization>Device only</Visualization>  
 </Rate>  
 <Noise>  
 <Value>0.0</Value>  
 <Visualization>Device only</Visualization>  
 </Noise>  
 <WetOut>  
 <Value>1.0</Value>  
 <Visualization>Device only</Visualization>  
 </WetOut>  
 <DryOut>  
 <Value>0.0</Value>  
 <Visualization>Device only</Visualization>  
 </DryOut>  
 <Interpolate>  
 <Value>1.0</Value>  
 <Visualization>Device only</Visualization>  
 </Interpolate>  
 </Lofi2Device>  
 </Devices>  
 </DeviceContainerSlot>  
</FilterDeviceChainClipboard>  

Copy the code and paste as device chain.

This is not a perfect curve. Just setting up 8 points in a hurry. But you get the idea.
If you have the time you can add 88 points (full piano size - 1 key per point) or more.
But it’s a bit PITA I guess as you have to calculate the points and edit each point in notepad (or copy/paste a point between instr/automation envelopes and LFO envelope) to get this spot on.

Well that would be fine presuming I could use a spline in the LFO :P

I have tried to compute a good one-shot LFO curve for my tutorial song, however I have encountered a problem which unfortunately I understood only after: the scaling of RingMod frequency is not linear, so my effort was worthless in the end.

In case someone needs a linear C-4…B-6 range with tone resolution (i.e., it does not take in count the semitones), here there are the settings for LFO Device:

  
<?xml version="1.0" encoding="UTF-8"?>  
<filterdeviceclipboard doc_version="0"><br>
  <deviceslot type="LfoDevice"><br>
	<isactive>true</isactive><br>
	<isselected>true</isselected><br>
	<selectedpresetname>Init</selectedpresetname><br>
	<selectedpresetismodified>true</selectedpresetismodified><br>
	<runtimepreseta type="FilterDevicePreset"><br>
	  <deviceslot type="LfoDevice"><br>
		<amplitude><br>
		  <value>1.0</value><br>
		</amplitude><br>
		<offset><br>
		  <value>0.0</value><br>
		</offset><br>
		<frequency><br>
		  <value>9.9999999747524271e-007</value><br>
		</frequency><br>
		<type><br>
		  <value>4</value><br>
		</type><br>
		<customenvelope><br>
		  <playmode>Linear</playmode><br>
		  <length>88</length><br>
		  <valuequantum>0.0</valuequantum><br>
		  <points><br>
			<point>0,0.013179999776184559</point><br>
			<point>87,0.68580001592636108</point><br>
		  </points><br>
		</customenvelope><br>
		<customenvelopeoneshot>false</customenvelopeoneshot><br>
	  </deviceslot><br>
	</runtimepreseta><br>
	<desteffect><br>
	  <value>2</value><br>
	  <visualization>Device only</visualization><br>
	</desteffect><br>
	<destparameter><br>
	  <value>0.0</value><br>
	  <visualization>Device only</visualization><br>
	</destparameter><br>
	<amplitude><br>
	  <value>1.0</value><br>
	  <visualization>Device only</visualization><br>
	</amplitude><br>
	<offset><br>
	  <value>0.0</value><br>
	  <visualization>Device only</visualization><br>
	</offset><br>
	<frequency><br>
	  <value>9.9999999747524271e-007</value><br>
	  <visualization>Device only</visualization><br>
	</frequency><br>
	<type><br>
	  <value>4</value><br>
	  <visualization>Device only</visualization><br>
	</type><br>
	<customenvelope><br>
	  <playmode>Linear</playmode><br>
	  <length>35</length><br>
	  <valuequantum>0.0</valuequantum><br>
	  <points><br>
		<point>0,0.0</point><br>
		<point>2,0.018694533035159111</point><br>
		<point>4,0.03967629000544548</point><br>
		<point>5,0.051112394779920578</point><br>
		<point>7,0.076067611575126648</point><br>
		<point>9,0.10407440364360809</point><br>
		<point>10,0.13551202416419983</point><br>
		<point>11,0.15265451371669769</point><br>
		<point>13,0.19003775715827942</point><br>
		<point>15,0.23200710117816925</point><br>
		<point>16,0.25487929582595825</point><br>
		<point>18,0.30478391051292419</point><br>
		<point>20,0.36080333590507507</point><br>
		<point>22,0.42368441820144653</point><br>
		<point>23,0.4579518735408783</point><br>
		<point>25,0.5327533483505249</point><br>
		<point>27,0.61665701866149902</point><br>
		<point>28,0.66240143775939941</point><br>
		<point>30,0.76223403215408325</point><br>
		<point>32,0.87426120042800903</point><br>
		<point>34,1.0</point><br>
	  </points><br>
	</customenvelope><br>
	<customenvelopeoneshot>true</customenvelopeoneshot><br>
  </deviceslot><br>
</filterdeviceclipboard>  
  

I will ask taktik how the scaling of RingMod is calculated

I’m tellin you IT-Alien, the ringmod is flat… use the settings I posted and you’ll see… compare to a frequency table and they’re right on, and you can do octaves and chord arpegs that sound perfect.

Great noww that we can reset the lfo with the keytracking device …setlfo to one shot and custom envelope to modulate filter3 cu toff
Our first synthie entirely made with renoise goodies ( and a steady hand to draw waveforms )
:)

you could reset the LFO with the velocity device all along :P

well then why the above LFO is unable to map RingMod frequencies correctly?

try loading my tutorial song and changing the device chain of it with this:

  
<?xml version="1.0" encoding="UTF-8"?>  
<filterdevicechainclipboard doc_version="0"><br>
  <devicecontainerslot type="SequencerTrackDeviceChain"><br>
	<devices><br>
	  <sequencertrackdevice type="SequencerTrackDevice"><br>
		<isactive>true</isactive><br>
		<isselected>false</isselected><br>
		<selectedpresetname>Init</selectedpresetname><br>
		<selectedpresetismodified>false</selectedpresetismodified><br>
		<panning><br>
		  <value>0.5</value><br>
		  <visualization>Device only</visualization><br>
		</panning><br>
		<volume><br>
		  <value>1.0</value><br>
		  <visualization>Device only</visualization><br>
		</volume><br>
		<surround><br>
		  <value>0.0</value><br>
		  <visualization>Device only</visualization><br>
		</surround><br>
		<postpanning><br>
		  <value>0.5</value><br>
		  <visualization>Device only</visualization><br>
		</postpanning><br>
		<postvolume><br>
		  <value>1.0</value><br>
		  <visualization>Device only</visualization><br>
		</postvolume><br>
	  </sequencertrackdevice><br>
	  <keytrackingdevice type="KeyTrackingDevice"><br>
		<isactive>true</isactive><br>
		<isselected>false</isselected><br>
		<selectedpresetname>Init</selectedpresetname><br>
		<selectedpresetismodified>true</selectedpresetismodified><br>
		<srcinstrument>0</srcinstrument><br>
		<keytrackingscaling>Linear</keytrackingscaling><br>
		<keytrackingmode>Soft</keytrackingmode><br>
		<keytrackingmin>48</keytrackingmin><br>
		<keytrackingmax>83</keytrackingmax><br>
		<desteffect><br>
		  <value>4</value><br>
		  <visualization>Device only</visualization><br>
		</desteffect><br>
		<destparameter><br>
		  <value>6</value><br>
		  <visualization>Device only</visualization><br>
		</destparameter><br>
		<destmin><br>
		  <value>0.0</value><br>
		  <visualization>Device only</visualization><br>
		</destmin><br>
		<destmax><br>
		  <value>1.0</value><br>
		  <visualization>Device only</visualization><br>
		</destmax><br>
	  </keytrackingdevice><br>
	  <hydradevice type="HydraDevice"><br>
		<isactive>true</isactive><br>
		<isselected>false</isselected><br>
		<selectedpresetname>Init</selectedpresetname><br>
		<selectedpresetismodified>true</selectedpresetismodified><br>
		<visiblepages>2</visiblepages><br>
		<inputvalue><br>
		  <value>0.015335351228713989</value><br>
		  <visualization>Mixer and Device</visualization><br>
		</inputvalue><br>
		<out1desteffect><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out1desteffect><br>
		<out1destparameter><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out1destparameter><br>
		<out1min><br>
		  <value>0.39171844720840454</value><br>
		  <visualization>Device only</visualization><br>
		</out1min><br>
		<out1max><br>
		  <value>0.6850619912147522</value><br>
		  <visualization>Device only</visualization><br>
		</out1max><br>
		<out1scaling>Linear</out1scaling><br>
		<out2desteffect><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out2desteffect><br>
		<out2destparameter><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out2destparameter><br>
		<out2min><br>
		  <value>0.77999973297119141</value><br>
		  <visualization>Device only</visualization><br>
		</out2min><br>
		<out2max><br>
		  <value>0.48999983072280884</value><br>
		  <visualization>Device only</visualization><br>
		</out2max><br>
		<out2scaling>Linear</out2scaling><br>
		<out3desteffect><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out3desteffect><br>
		<out3destparameter><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out3destparameter><br>
		<out3min><br>
		  <value>0.1800006777048111</value><br>
		  <visualization>Device only</visualization><br>
		</out3min><br>
		<out3max><br>
		  <value>0.60000038146972656</value><br>
		  <visualization>Device only</visualization><br>
		</out3max><br>
		<out3scaling>Exp Slow</out3scaling><br>
		<out4desteffect><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out4desteffect><br>
		<out4destparameter><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out4destparameter><br>
		<out4min><br>
		  <value>1.0</value><br>
		  <visualization>Device only</visualization><br>
		</out4min><br>
		<out4max><br>
		  <value>0.20000000298023224</value><br>
		  <visualization>Device only</visualization><br>
		</out4max><br>
		<out4scaling>Log Slow</out4scaling><br>
		<out5desteffect><br>
		  <value>3</value><br>
		  <visualization>Device only</visualization><br>
		</out5desteffect><br>
		<out5destparameter><br>
		  <value>1.0</value><br>
		  <visualization>Device only</visualization><br>
		</out5destparameter><br>
		<out5min><br>
		  <value>0.5526847243309021</value><br>
		  <visualization>Device only</visualization><br>
		</out5min><br>
		<out5max><br>
		  <value>0.75645112991333008</value><br>
		  <visualization>Device only</visualization><br>
		</out5max><br>
		<out5scaling>Linear</out5scaling><br>
		<out6desteffect><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out6desteffect><br>
		<out6destparameter><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out6destparameter><br>
		<out6min><br>
		  <value>0.24999998509883881</value><br>
		  <visualization>Device only</visualization><br>
		</out6min><br>
		<out6max><br>
		  <value>1.0</value><br>
		  <visualization>Device only</visualization><br>
		</out6max><br>
		<out6scaling>Linear</out6scaling><br>
		<out7desteffect><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out7desteffect><br>
		<out7destparameter><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out7destparameter><br>
		<out7min><br>
		  <value>0.25</value><br>
		  <visualization>Device only</visualization><br>
		</out7min><br>
		<out7max><br>
		  <value>0.94999998807907104</value><br>
		  <visualization>Device only</visualization><br>
		</out7max><br>
		<out7scaling>Linear</out7scaling><br>
		<out8desteffect><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out8desteffect><br>
		<out8destparameter><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out8destparameter><br>
		<out8min><br>
		  <value>0.24999997019767761</value><br>
		  <visualization>Device only</visualization><br>
		</out8min><br>
		<out8max><br>
		  <value>0.17698642611503601</value><br>
		  <visualization>Device only</visualization><br>
		</out8max><br>
		<out8scaling>Exp Slow</out8scaling><br>
		<out9desteffect><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out9desteffect><br>
		<out9destparameter><br>
		  <value>-1</value><br>
		  <visualization>Device only</visualization><br>
		</out9destparameter><br>
		<out9min><br>
		  <value>0.10968365520238876</value><br>
		  <visualization>Device only</visualization><br>
		</out9min><br>
		<out9max><br>
		  <value>0.46390253305435181</value><br>
		  <visualization>Device only</visualization><br>
		</out9max><br>
		<out9scaling>Linear</out9scaling><br>
	  </hydradevice><br>
	  <ringmoddevice type="RingModDevice"><br>
		<isactive>true</isactive><br>
		<isselected>false</isselected><br>
		<selectedpresetname>Init</selectedpresetname><br>
		<selectedpresetismodified>true</selectedpresetismodified><br>
		<oscillatortype><br>
		  <value>0.0</value><br>
		  <visualization>Device only</visualization><br>
		</oscillatortype><br>
		<frequency><br>
		  <value>0.55580955743789673</value><br>
		  <visualization>Device only</visualization><br>
		</frequency><br>
		<amount><br>
		  <value>0.79838711023330688</value><br>
		  <visualization>Device only</visualization><br>
		</amount><br>
		<phase><br>
		  <value>0.0</value><br>
		  <visualization>Device only</visualization><br>
		</phase><br>
		<inertia><br>
		  <value>0.015625</value><br>
		  <visualization>Device only</visualization><br>
		</inertia><br>
	  </ringmoddevice><br>
	  <lfodevice type="LfoDevice"><br>
		<isactive>true</isactive><br>
		<isselected>true</isselected><br>
		<selectedpresetname>Init</selectedpresetname><br>
		<selectedpresetismodified>true</selectedpresetismodified><br>
		<runtimepreseta type="FilterDevicePreset"><br>
		  <deviceslot type="LfoDevice"><br>
			<amplitude><br>
			  <value>1.0</value><br>
			</amplitude><br>
			<offset><br>
			  <value>0.0</value><br>
			</offset><br>
			<frequency><br>
			  <value>9.9999999747524271e-007</value><br>
			</frequency><br>
			<type><br>
			  <value>4</value><br>
			</type><br>
			<customenvelope><br>
			  <playmode>Linear</playmode><br>
			  <length>88</length><br>
			  <valuequantum>0.0</valuequantum><br>
			  <points><br>
				<point>0,0.013179999776184559</point><br>
				<point>87,0.68580001592636108</point><br>
			  </points><br>
			</customenvelope><br>
			<customenvelopeoneshot>false</customenvelopeoneshot><br>
		  </deviceslot><br>
		</runtimepreseta><br>
		<desteffect><br>
		  <value>2</value><br>
		  <visualization>Device only</visualization><br>
		</desteffect><br>
		<destparameter><br>
		  <value>0.0</value><br>
		  <visualization>Device only</visualization><br>
		</destparameter><br>
		<amplitude><br>
		  <value>1.0</value><br>
		  <visualization>Device only</visualization><br>
		</amplitude><br>
		<offset><br>
		  <value>0.0</value><br>
		  <visualization>Device only</visualization><br>
		</offset><br>
		<frequency><br>
		  <value>9.9999999747524271e-007</value><br>
		  <visualization>Device only</visualization><br>
		</frequency><br>
		<type><br>
		  <value>4</value><br>
		  <visualization>Device only</visualization><br>
		</type><br>
		<customenvelope><br>
		  <playmode>Linear</playmode><br>
		  <length>35</length><br>
		  <valuequantum>0.0</valuequantum><br>
		  <points><br>
			<point>0,0.0</point><br>
			<point>2,0.018694533035159111</point><br>
			<point>4,0.03967629000544548</point><br>
			<point>5,0.051112394779920578</point><br>
			<point>7,0.076067611575126648</point><br>
			<point>9,0.10407440364360809</point><br>
			<point>10,0.13551202416419983</point><br>
			<point>11,0.15265451371669769</point><br>
			<point>13,0.19003775715827942</point><br>
			<point>15,0.23200710117816925</point><br>
			<point>16,0.25487929582595825</point><br>
			<point>18,0.30478391051292419</point><br>
			<point>20,0.36080333590507507</point><br>
			<point>22,0.42368441820144653</point><br>
			<point>23,0.4579518735408783</point><br>
			<point>25,0.5327533483505249</point><br>
			<point>27,0.61665701866149902</point><br>
			<point>28,0.66240143775939941</point><br>
			<point>30,0.76223403215408325</point><br>
			<point>32,0.87426120042800903</point><br>
			<point>34,1.0</point><br>
		  </points><br>
		</customenvelope><br>
		<customenvelopeoneshot>true</customenvelopeoneshot><br>
	  </lfodevice><br>
	</devices><br>
  </devicecontainerslot><br>
</filterdevicechainclipboard>  
  

Thanks Byte-S for you private message; I know finally got what the problem was: if you use a large range as you and I did, there is a small but perceivable error which detunes the modulation which is due to the granularity of the values in the RingMod Frequency slider.

Using smaller ranges results in way more accurate results.

take for example this instant 60’s sci_fi generator :D

edit: removed the song comments which are related to another module, sorry