Renoise Forum

Subscribe to Renoise Forum feed
Latest topics
Updated: 9 hours 20 min ago

I bought a used copy Reason 10 ..lol

May 17, 2024 - 22:15

A long long time ago …( 2005-2006 ) I ‘ve used a not so legalcopy of reason , and curiosity got the most of me so I bought a second hand license of reason 10 , for fun right ?
SO …surprise , you need to be online to launch the program ., ffs ,every time you launch it , let that sink in for a second .
Other then that ,most of the devices haven’t aged soo well and it doesn’t bring me anything that I can’ to in reakotr or pure data or any other decent program -vst .
So a gentle reminder , we as renoise users are so spoiled with the simple registration process .
ONline when launching a program , the fucktards : ) , thank god I got it for a modest price of 75 euro

Rant over

3 posts - 2 participants

Read full topic

Categories: Forum

Processing DSP FX on Sample

May 17, 2024 - 18:11

Is it possible to get a progress count in % on this in the status field?

I sometimes use Renoise for processing tape audio recordings with a chain of VST effects. So then I use the TFX-button in the waveform editor - works great but can sometimes take a while to process.

As I’ve seen % on other actions (like rendering a song or previewing a sample) maybe it could be implemented here too?

1 post - 1 participant

Read full topic

Categories: Forum

Marbles, Microwaves & Vibrating lines

May 17, 2024 - 17:41

Marbles

Peace out!

1 post - 1 participant

Read full topic

Categories: Forum

Freeze Track Snippet

May 17, 2024 - 09:53

@esaruoho had a question and problem rendering a track, in order to “freeze” it.

Here’s a snippet on how this could work. Maybe this helps others too. I think this has been done in other tools as well:

-- Define render state (initialized when starting to render) local render_context = { source_track = 0, target_track = 0, target_instrument = 0, temp_file_path = "" } -- Callback function to load the rendered file into a sample buffer -- of the first sample of the first instrument function rendering_done_callback() local song = renoise.song() song:describe_undo("Freeze Track") local source_track = song:track(render_context.source_track) -- Turn All Render Track Note Columns to "Off" for i=1,source_track.max_note_columns do source_track:set_column_is_muted(i, true) end -- Collapse Render Track source_track.collapsed = true -- Unsolo Source Track source_track:solo() -- Insert New Track Next to Render Track local target_track = song:insert_track_at(render_context.target_track) song.selected_track_index = render_context.target_track -- Rename New Track using Render Track Name target_track.name = (render_context.source_track .. " Rendered") -- Insert C-4 + Rendered Instrument number to Rendered Track local target_pattern = song:pattern(1):track(render_context.target_track) local target_note_column = target_pattern:line(1):note_column(1) target_note_column.note_string = "C-4" target_note_column.instrument_value = render_context.target_instrument - 1 -- Create New Instrument local target_instrument = song:insert_instrument_at(render_context.target_instrument) target_instrument.name = target_track.name -- Load the rendered audio file into the sample buffer local target_sample_buffer = target_instrument:insert_sample_at(1).sample_buffer target_sample_buffer:load_from(render_context.temp_file_path) os.remove(render_context.temp_file_path) end function freezeTrack() local song = renoise.song() song:describe_undo("Freeze Track") -- Set render context render_context.source_track = song.selected_track_index render_context.target_track = render_context.source_track + 1 render_context.target_instrument = #song.instruments render_context.temp_file_path = os.tmpname(".wav") -- Solo Source Track local source_track = song.tracks[render_context.source_track] if not source_track.solo_state then source_track:solo() end -- Render Selected Track local render_options = { sample_rate = 44100, bit_depth = 32, interpolation = "precise", priority = "high", } -- Start rendering with the correct function call local success, error_message = song:render( render_options, render_context.temp_file_path, rendering_done_callback) -- Handle possible errors during the render initiation if not success then renoise.app():show_error("Rendering failed: " .. error_message) end -- Rest is done when rendering finished end freezeTrack()

1 post - 1 participant

Read full topic

Categories: Forum

How to define start_pos end_pos for render

May 16, 2024 - 23:22

how do i set start_pos + end_pos to be “the selection in track”? or how to define “the whole song”?

-- Optionally, set start_pos and end_pos if you want to render a specific part of the song

1 post - 1 participant

Read full topic

Categories: Forum

Released my 2nd VST3 plugin! Anyone willing to give it a spin?

May 16, 2024 - 22:41

Hi!

This is sort of a follow-up to Released my first VST3 plugin / beta testers needed.
The new project is over here https://www.kvraudio.com/product/firefly-synth-by-sjoerdvankreel and here GitHub - sjoerdvankreel/firefly-synth: Semi-modular synthesizer and FX plugin for Windows, Linux and Mac, VST3 and CLAP..

With a bugfix in Renoise 3.4.4 (Possible (probable?) bug w.r.t. vst3 parameter flushing - #9 by ffx) firefly synth should now run fine in renoise as long as you stick to a single version of the plugin. Although I still cannot “officially” support renoise untill this Saved automation data does not respect VST3's parameter id is resolved or I find a workaround myself.

Major changes wrt the previous project (InfernalSynth):

  • Win/Lin/Mac support
  • FM support
  • Distortion module

There’s some Renoise-specific demo material over here: firefly-synth/demos/demo at main · sjoerdvankreel/firefly-synth · GitHub.

Thanks to all who helped me out last year, and any feedback welcome on the new project.

-cheers, Sjoerd

1 post - 1 participant

Read full topic

Categories: Forum

Linux system realtime performance tuning

May 16, 2024 - 22:28

Hey people. I’ve just come around another thread, and found info on how to make a Linux system ready for realtime audio performance a bit lacking.

I don’t know what audio optimizied distros preconfigure in this regard. But you can make many other distributions realtime ready with a few tunings.

There are already some rather nice pages on this like https://wiki.linuxaudio.org/wiki/system_configuration, but I think it’d be cool to have a more simple guideline on what methods to try to make a machine ready for stable realtime renoise action.

Here’s what I do on Ubuntus and it probably applies well to other distos, as well. Some steps are straighforward to give more stability, others only work when you have specific hardware problems.

Each step can have the potential to make the system a little more realtime stable. I think I will write them in the order that you may apply them or try applying them when tuning a system until you’re satisfied. You should test your performance i.e. with cyclictest after applying more specific steps each time you change something in your system.

The first 3 steps I’d always apply first are:

  • stop all background (user or decorative) programs you don’t need. You can run other tools, but try to avoid unnecessary candy or other ressource-intensive programs.

  • Activating the RT priorities, rtprio+memlock, this is distro specific i.e. with dpkg reconfigure or manually in limits.conf or with another package manage, or sometimes it can be done while installing things like jack

  • The next vital step is turning off CPU frequency stepping. Each time the CPU switches, the realtime audio can get corrupted due to the delay. I use the command cpupower frequency-set -g performance (or cpupower frequency-set -g powersave to disable), and put it into a suoders enabled script that is executed before starting the jack server (and another one after closing it down to reset the tuning). Take care with this step, only do it on a system that is safe to run at thermal load. You may have to or want to use other programs that cpupower, or use different frequency mode names. On older systems of Ubuntu it may have been necessary to disable a daemon in Ubuntu that would reset the CPU to ondemand or powersave, you can do such things in the same script.

  • The third seems to be file system/sata driver related, on many systems I need to put the mount options of the system drives and other drives the system is using during audio load to “noatime”, else the system will have a lot of dropouts.

  • General tuning means not allowing intensive jobs running in the background of the computer. Uninstall or stop automatic tasks that eat your CPU or do background processing. You can do this (turning on and off) like I do in the script that would switch CPU scaling when starting the audio server. I of use my PC and internet for other tasks or to assist tracking while running renoise, but it’s better not to let it do other demanding things at the same time.

After this tuning, I’d test the system, it should already be much more stable. The next steps depend on what kind of system you are using and your hardware or kernel. Sometimes these things only make sense, when you’re sure of what you’re doing and when you’re doing it right.

  • Use a tuned kernel, lowlatency or realtime…sometimes it will help very much, sometimes, if the culprit is some odd hardware misconfiguration or incompatibility it may seem that it doesn’t help, at first
  • You can always try disabling certain devices like wifi or bluetooth, especially external dongles or connected devices if you are using an USB sound card. Howerver the next step can address issues coming from this while still allowing other devices being used
  • The rtirq script is something very good when you configure it right, and it can become even more powerful if you use a proper lowlatency or realtime kernel that would support such action. You need to put your sound card interrupt high up above the priority list, and put anything nonvital related to hardware to sound processing below the audio threads of the sound program and also below the audio server (jack…). If using USB, you may have to tweak and poke a little, even disabling devices, to find that magic USB jack that is not jammed up by other devices and that you could individually priorize to get a stable sound
  • maybe you can also have performance gains if you configure even more aggressive file system tunings like disabling journaling or using alternate file systems. I find noatime usually already cuts this well. You’ll see if you monitor latency, when a lot of file system related tasks break the realtime audio you need to do more about it.
  • graphics drivers often come in multiple flavors, i.e. proprietary and open source. If you find you have the choice to use either without drawbacks, or have problems with one of them, you might find that using the other one can give you a better realtime performance. Also there may be different graphics driver options that can affect the realtime performance, so this is also a place to investigate if the driver makes problems.
  • You can try to disable further CPU speed stepping or sleep modes, to reduce the amount of lag due to CPU spikes. Somtimes this can be done in the bios, or with special tools. Take much care with this what you do, so you don’t mess up your CPU scaling or overheat devices not cooled well enough. Even if you use a system of full throttle with audio only giving it a low load, there may suddenly come situations where all cores are maxed for a while (rendering etc.), and then you need a pc that keeps cool. Keep checking the lm-sensors!

So this is what I found are the most vital steps to try. For troubleshooting when unexpected problems occur (xruns keep rolling in despite all rteasonable tunings done), then you need tools to investigate the problem.

The latencytop, cyclictest and hwlatdetector, and similar are way better than just starting jack and looking for the xrun counter, or even just using alsa and listening for gaps. If you know a hardware/system latency by long term realistic measurements in µs, i.e. 1200 or 260, then you know that there will be a possibility for hardware dropouts as long as that number of microseconds, i.e. there will be 1.2ms dropouts, or 0.26ms. This is the numbers that tools like cyclictest or hwlatdetector spit out. This means, i.e. for a latency of 5ms, you have to assume that the CPU can only handle so much load until the operation would be interrupted by a stray or regular latency dropout that is i.e 1.2 or 0.26 ms long. So the lower the measurement, the better the system is and the lower your latency can go.

Cyclictest measures how well your audiothread can process. Hwlatdetector measures if there are system calls (SMI) from the BIOS, which the operating system cannot see. This is stuff you cannot interrupt, so if you have long SMIs, then you have to either tweak the BIOS, or you have to swap the hardware or use a different system, if the SMIs make it too unstable and when you cannot resolve them. This is why some machines can be better for realtime load than others, i.e. workstation computers might fare better than some cheap consumer gear. Somtimes you have odd situations where it’s the other way around, then a cheap PC is really good, while an expensive one decides to calculate lots of system optimizations in BIOS that break your realtime performance…

tools like latencytop then again can help you finding certain tasks that jam up your system, i.e. when you find some “jdb” threads blocking everything, then you may know that the file system driver is jamming things up and you need to tune or disable atime or journalling, or it may be a thread related to another user space process locking the system for too long.

The last and ultimate rabbit hole when you cannot find the culprit is stuff like ftrace/trace-cmd or perftools i.e. perf sched. This is stuff you need deep knowledge for, but if nothing helps, it may help you debug the kernel and find the kernel/driver module/thread that locks up the interrupts for too long so your sound gets jammed up (and cyclictest will show you by how much…). Sometimes it’s literally individual drivers, and changing options, the driver, or disabling or reconfiguring some hardware can help things. Sometimes it’s and upgrade or downgrade, or you need to fix it with kernel command line options enabling or disabling the culprit. Stuff like this already helped me fixing it by identifying file system tasks (atime) and graphics driver issues as culprit for bad latency stability. I don’t know how many people would go as far as baking their own kernel to fix a problem, I already did this to enable options that would help identifying the problem (ftrace options).

So this has still become a quite lengthy post, but I hope it can help others to make their system more realtime stable. I think you can drive renoise down to 5-8ms latency in jack, but then renoise itself can make problems and cause xruns. You can definitely get a system down to like 1 or 2 ms if you tweak it hard enough and the audio software you are using is not too intensive and optimized well (renoise is not fit for this yet, I believe…). This goes especially for recording or realtime effects applicatoins. I’d rather stay withing 4-8ms to stay safe, because else you need a really stripped down system and still risk hickups when you use more intensive recording software. The lower you go in latency, the more CPU the audio processing will eat. That’s the price of having a low latency.

If you have some experience with tuning your system and want to brag how low it gues, when you know other vital steps to do or consider, or other tools or methods to help tuning or identifying culprits, please post up here. Linux systems tweaked right can give you this solid ship that never breaks and that drives sound like a rocket. A linux system will not do random junk in the background, and even if it does, you’ll be able to find out how to disable this. Keep it rocking!

1 post - 1 participant

Read full topic

Categories: Forum

Renoise hard crash

May 16, 2024 - 20:52

Had a hard crash,cant really remember what i was doing.This is the log file

CrashLog: Handling Exception! Code : C0000005
CrashLog: 000000014062AEF7: l9_ippsLn_32f_A21 +25D407
CrashLog: 000000014062AF24: l9_ippsLn_32f_A21 +25D434
CrashLog: 000000014062AF24: l9_ippsLn_32f_A21 +25D434
CrashLog: 000000014062AF24: l9_ippsLn_32f_A21 +25D434
CrashLog: 000000014062AF24: l9_ippsLn_32f_A21 +25D434
CrashLog: 000000014062AF24: l9_ippsLn_32f_A21 +25D434
CrashLog: 000000014062AF24: l9_ippsLn_32f_A21 +25D434
CrashLog: 000000014062AF24: l9_ippsLn_32f_A21 +25D434
CrashLog: 0000000140631061: l9_ippsLn_32f_A21 +263571
CrashLog: 000000014074C6A3: l9_ippsLn_32f_A21 +37EBB3
CrashLog: 0000000140733A5E: l9_ippsLn_32f_A21 +365F6E
CrashLog: 000000014044482A: l9_ippsLn_32f_A21 +76D3A
CrashLog: 0000000140444765: l9_ippsLn_32f_A21 +76C75
CrashLog: 000000014056665A: l9_ippsLn_32f_A21 +198B6A
CrashLog: 00000001407AABF0: l9_ippsLn_32f_A21 +3DD100
CrashLog: 000000014087CAA8: l9_ippsLn_32f_A21 +4AEFB8
CrashLog: 000000014087CC26: l9_ippsLn_32f_A21 +4AF136
CrashLog: 00000001407ACFBA: l9_ippsLn_32f_A21 +3DF4CA
CrashLog: 000000014070C5A2: l9_ippsLn_32f_A21 +33EAB2
CrashLog: 000000014072C63D: l9_ippsLn_32f_A21 +35EB4D
CrashLog: 0000000140768C72: l9_ippsLn_32f_A21 +39B182
CrashLog: 000000014076855C: l9_ippsLn_32f_A21 +39AA6C
CrashLog: 000000014072C63D: l9_ippsLn_32f_A21 +35EB4D
CrashLog: 000000014071FEF4: l9_ippsLn_32f_A21 +352404
CrashLog: 0000000140763058: l9_ippsLn_32f_A21 +395568
CrashLog: 000000014071AAB6: l9_ippsLn_32f_A21 +34CFC6
CrashLog: 000000014071FD26: l9_ippsLn_32f_A21 +352236
CrashLog: 00000001403FD6E3: l9_ippsLn_32f_A21 +2FBF3
CrashLog: 00000001403F8840: l9_ippsLn_32f_A21 +2AD50
CrashLog: 00000001403FDFD6: l9_ippsLn_32f_A21 +304E6
CrashLog: 0000000140DE7E43: l9_ippsLn_32f_A21 +A1A353
CrashLog: 00007FF86C427344: BaseThreadInitThunk +00014

Application: Caught an unhandled fatal exception (Thread: GUI)!
Application: Saving a backup…

CrashLog: Handling Exception! Code : C0000005
CrashLog: 000000014062D5B0: l9_ippsLn_32f_A21 +25FAC0
CrashLog: 000000014062D5DD: l9_ippsLn_32f_A21 +25FAED
CrashLog: 000000014062D5DD: l9_ippsLn_32f_A21 +25FAED
CrashLog: 000000014062D5DD: l9_ippsLn_32f_A21 +25FAED
CrashLog: 000000014062D5DD: l9_ippsLn_32f_A21 +25FAED
CrashLog: 000000014062D5DD: l9_ippsLn_32f_A21 +25FAED
CrashLog: 000000014062D5DD: l9_ippsLn_32f_A21 +25FAED
CrashLog: 000000014062D5DD: l9_ippsLn_32f_A21 +25FAED
CrashLog: 000000014062D1AC: l9_ippsLn_32f_A21 +25F6BC
CrashLog: 0000000140C14B21: l9_ippsLn_32f_A21 +847031
CrashLog: 00000001403F7438: l9_ippsLn_32f_A21 +29948
CrashLog: 000000014071F3E8: l9_ippsLn_32f_A21 +3518F8
CrashLog: 00000001407203D6: l9_ippsLn_32f_A21 +3528E6
CrashLog: 000000014071AD42: l9_ippsLn_32f_A21 +34D252
CrashLog: 000000014071FD3D: l9_ippsLn_32f_A21 +35224D
CrashLog: 00000001403FD6E3: l9_ippsLn_32f_A21 +2FBF3
CrashLog: 00000001403F8840: l9_ippsLn_32f_A21 +2AD50
CrashLog: 00000001403FDFD6: l9_ippsLn_32f_A21 +304E6
CrashLog: 0000000140DE7E43: l9_ippsLn_32f_A21 +A1A353
CrashLog: 00007FF86C427344: BaseThreadInitThunk +00014
CrashLog: 00007FF86D0E26B1: RtlUserThreadStart +00021

1 post - 1 participant

Read full topic

Categories: Forum

Idea: A Visualization Tool for Learning Renoise Keybindings (Shortcuts)

May 16, 2024 - 07:45

Renoise keybindings are powerful but difficult to memorize, so I am creating a tool that reads the configuration file and visualizes it on a keyboard layout. I’m not sure if there is any demand for this, so I would like to share the idea here.

I will show you the prototype source code and screenshots.

GitHub GitHub - sdmkun/com.renoise.KeybindVisualizer.xrnx

Contribute to sdmkun/com.renoise.KeybindVisualizer.xrnx development by creating an account on GitHub.

Current features:

  • Reads KeyBindings.xml and visualizes it on a keyboard layout
  • Displays keybindings when modifier keys (Ctrl, Shift, Alt) are pressed

Features to be added:

  • Support for general keyboard layouts (currently only Japanese layout)
  • Automatic loading of currently applied keybindings
  • Changing and saving keybindings within the tool
  • Display of the numeric keypad
  • Improved visibility (e.g., iconizing keybinding categories)

Feel free to share any feedback.

1 post - 1 participant

Read full topic

Categories: Forum

Reaktor 6.5 & Cloudlab 200t

May 15, 2024 - 21:04

Anyone into Cloudlab?

The Yard

Enjoy!

1 post - 1 participant

Read full topic

Categories: Forum

Can slice markers be moved with API?

May 15, 2024 - 13:46

can the API be used to move slicemarkers left&right?

1 post - 1 participant

Read full topic

Categories: Forum

Pattern editor keyboard shortcut delete / backspace not working on Mac

May 15, 2024 - 11:05

Using Renoise 3.4.3 on a Macbook M1 (MacOS 14.4.1), recently switched to an external (PC!) keyboard.
All the additional keys work except delete / backspace (super critical). Is this a known issue?

1 post - 1 participant

Read full topic

Categories: Forum

New Linux PC - best option?

May 14, 2024 - 21:57

I’m going to buy a new PC on which I will install Linux (MX Linux most likely)

Will Renoise profit when buying a separate graphics card or would you choose onboard graphic?

With my current i5 4460 and onboard graphic the GUI behaves sluggish when the track number is increasing. No such issues with an AMD PROCESSOR on a Lenovo laptop.

Either I let it build from that shop

Magic Computer GmbH Magic Computer bietet IT, Reparatur, Hard- und Software zu Bestpreisen.

Günstige IT und Elektronik: PC, Computer, Hardware, Software. IT-Service und Reparatur in der Region Karlsruhe. Bestpreise bei Office, Gaming, Enterprise.

or I get something like that Lenovo here

Hauptshop Deutsch ThinkCentre Neo 50s G3 - Desktop - Intel Core i7 12700 @ 2,1 GHz - 16 GB DDR4...

ThinkCentre Neo 50s G3 (Prozessortyp: Intel Core i7; Arbeitsspeichertyp: DDR4; Schnittstellen: 1x Audio / Mikrofon - 3.5 mm Combo, 1x LAN RJ-45, 1x HDMI, 1x Audio - Ausgang - 3.5 mm, 1x USB 3 Typ C, 1x DisplayPort, 1x Audio - Eingang - 3.5 mm, 4x USB...

Price: EUR 549

Ajother option would be a Cirrus7 fanless PC. They are known to run Linux well.

cirrus7 – 23 Feb 18 cirrus7 - passiv gekühlte mini-PCs - made in Germany

Passiv gekühlte mini-PCs made in Germany. Komplett lautlos durch Aluminium Kühlkörpergehäuse aus eigener CNC-Fertigung.

What would you recommend and how are your experiences with Linux / Renoise and AMD vs. INTEL?

1 post - 1 participant

Read full topic

Categories: Forum

How to always-hide the track dsp list on the left?

May 13, 2024 - 10:41

i would like to hide this, and keep it hidden. is there a way?

1 post - 1 participant

Read full topic

Categories: Forum

Instrument volume doesn't match track volume at unity gain?

May 13, 2024 - 03:28

I have an instrument that is effectively clipping the output of the instrument, hitting 0 dB before it goes into a track, and the gain slider is at 0 dB as well. The sample is normalized. When I play the instrument in a track (with no gain adjustments and the final output gain slider also at 0dB), the output is 6 dB quieter. I’ve checked by putting a volume reader on both the FX chain of the instrument (it hits 0 dB0), and at the end of my track’s signal chain (where it hits -6 dB). Is this normal behavior, or is it coming into play because the instrument’s output is too hot and Renoise automatically lowers it?

1 post - 1 participant

Read full topic

Categories: Forum

VST parameter value changes before reaching automation

May 12, 2024 - 16:01

Hi,

I wonder if this is normal behaviour. I set the cutoff frequency of DIVA to maximum by hand, but as soon I start the track the cutoff switches to the value which is set in line 5. Does that make any sense?

1 post - 1 participant

Read full topic

Categories: Forum

My electronic music project

May 12, 2024 - 12:38

definitive link to my songs
https://archive.org/details/@andromeda_maurizio_amati_

1 post - 1 participant

Read full topic

Categories: Forum

Best friends 4-ever: VCV Rack + Hydrasynth Explorer

May 12, 2024 - 11:01

Caring for us

Caring for us

Also on Patchstorage for further exploration.

1 post - 1 participant

Read full topic

Categories: Forum

Automation Bug (Spikes at the beginning of a line)

May 12, 2024 - 09:22

Hello everybody,
I’m pretty sure I discovered an envelope automation bug in renoise.
This bug happens only if an automation point is exactly at the beginning of a line AND at least one other automation point is placed before the next line begins.

Current (buggy) playback behaviour seems to be like this:
At the beginning of each line, Renoise scans what is the automation value at the end of this line, sets this automation value for the duration of one tick (at a beginning of the line), then contiues the other ticks with the correct values.

Correct behavior would be like this:
Renoise would not set the automation value of the end of the line at the beginning of the line (for one tick).

/*
It’s hard to describe, so I will upload a xrns file.
*/
Sorry, I can’t upload, because the upload button says “new users can not upload attachments”.

It has a VST3 dependency (Surge XT), but you can replace it with another synth.

Please open the envelope curve of Doofer Macro1, watch the line numbers, the placement of automation points, and listen to the pitchbend automation.

Thank you!

My System:
Debian AMD64
Renoise 3.4.4

1 post - 1 participant

Read full topic

Categories: Forum

Slices and 0Bxx Command

May 12, 2024 - 07:28

When a sample is sliced and triggered via note in the pattern editor along with 0B01 command on the same line, if the the stop playback of sample option is unchecked(not highlighted) the 0B01 command will then trigger the sample to play backwards from the end of the entire sample rather than the end of the slice. This does NOT happens when the sampler is configured to stop playback at the end of the slice.

I don’t know if this is intended but it is a major inconvenience because I tend to leave that box unhighlighted when slicing samples. The renoise sampler is great(the best) at slicing drum breaks but it is well equipped for melodies and loops as well. Is there a workaround, or perhaps this can be fixed.

1 post - 1 participant

Read full topic

Categories: Forum

Pages