![]() |
#1 |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]()
(See the 0.5.13 release post.)
Hello REAPER users, I'd like to announce an alpha preview release of Reaticulate: an articulation management system for REAPER. reaticulate.com There are other solutions to this problem available of course, but I believe Reaticulate offers a few unique things. A few highlights:
![]() ![]() Reaticulate is installable via ReaPack: https://reaticulate.com/release.xml As this is an initial alpha preview release there are a few things missing, and probably a few things unintentionally broken. Notably, there is not yet a GUI for creating custom banks, so you'll have to edit bank files by hand and learn a bit about Reaticulate's custom markup used to extend reabank files. This is all documented, although the documentation, as with everything else, is a WIP. ![]() If you can stand my rambling, I've done a video to cover the features and operation of Reaticulate. Even if you tune out after the 2 minute mark, you should have a pretty good sense of what it's about. I welcome all bug reports, suggestions, and other feedback, either here, or on the GitHub issue tracker. [Cross-posted on the Reaper forum, vi-control.net, and thesoundboard.net. Apologies if you frequent multiple forums and this is feeling spammy.] Last edited by tack; 02-19-2024 at 12:18 PM. |
![]() |
![]() |
![]() |
#2 |
Human being with feelings
Join Date: Jun 2012
Posts: 348
|
![]()
This looks really promising. I watched the whole video.
When I compose, I like to perform the notes using a general purpose articulation (a short attack with sustain) and then I go back afterwards and draw in the key switch notes I want for each note or group of notes. C2 might be sustain, E2 for staccato, F2 for pizzicato for example. I see in your picture, below the piano roll, the articulations are displayed. Can I draw in the articulation I want below the piano roll or do I have to record my key switch selections to get them to appear there? Another question. Sometimes I'll record a violin for example and after I've programmed my articulations (which are key switch notes below the violin range) I decide I want to copy those same MID notes to cello and then shift them down an octave or two. I also copy the key switch notes from violin to cello and then shift those notes above the cello range (which is where the key switches for my cello are active). With your Reaticulate plugin, can I still do something like that, where I can copy MIDI notes from one instrument to another and also copy your articulations from one instrument to another? I would imagine that would be 2 separate copy operations. One for the MIDI notes, one for the articulation changes.
__________________
Paul Battersby Virtual Playing Orchestra - free sample library @ http://virtualplaying.com |
![]() |
![]() |
![]() |
#3 | ||
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]()
Amazing!
![]() Quote:
See 1:28 in the video for a demonstration. Quote:
Unlike with CCs, Reaper doesn't have a mode to automatically select program changes underneath selected notes. I plan to investigate the possibility of adding a feature to have Reaticulate optionally do this (tracked here), so you get a similar behavior to CCs. Cheers! |
||
![]() |
![]() |
![]() |
#4 | |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]() Quote:
So you could do your live performing as described, trigger the action, and it'll convert all the keyswitch notes (C2, E2, etc) to program changes for easy visibility in the MIDI Editor. Then you can go back over them and massage via step input. |
|
![]() |
![]() |
![]() |
#5 |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]()
I thought I'd mention in case it wasn't clear: to have the program changes show in the MIDI editor, just add a lane that's set to "Bank/Program Select"
|
![]() |
![]() |
![]() |
#6 |
Human being with feelings
Join Date: Apr 2013
Location: France
Posts: 10,761
|
![]()
Pretty impressive pack and it even has a dedicated website ! Well done !
It seems a pretty good alternative to BRSO Articulate and sfer alternative articulation manager, especially because the dev is open (in fact, these alternative behave very differently too). Thanks for sharing :P
__________________
Free ReaScripts - Premium Scripts - Custom Scripts Dev - Learn ReaScript - XR Theme - Stash Files - ReaLinks - Website - ReaComics - Alien 2347 - Donation |
![]() |
![]() |
![]() |
#7 | ||
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]() Quote:
Quote:
Ultimately the closet nature of both these projects was a deal breaker for me, because I really wanted additional functionality. Had they been open -- or at least Stephane's solution -- I almost certainly would have contributed improvements rather than do my own thing. In the end though I think my own thing ended up solving the problem better for my particular workflow. Also I suffer helplessly from NIH syndrome so it kind of worked out. ![]() |
||
![]() |
![]() |
![]() |
#8 |
Human being with feelings
Join Date: Sep 2017
Posts: 998
|
![]()
Great work, Tack!
Looking forward to implementing this! |
![]() |
![]() |
![]() |
#9 |
Human being with feelings
Join Date: Feb 2009
Location: Reaper HAS send control via midi !!!
Posts: 4,067
|
![]()
Wow, thanks for free and open source!
Could we add those articulations in notation view and it would play correctly, no? Then you could compose the articulations. Side comment to https://www.youtube.com/watch?v=ZO6eQt6L1KI Why bome midi translator and not oscii-bot? Last edited by TonE; 11-26-2017 at 10:06 PM. |
![]() |
![]() |
![]() |
#10 |
Human being with feelings
Join Date: Jan 2013
Posts: 163
|
![]()
Spent a little time trying this out and it's very promising indeed. Really well thought out, well documented and stable through my initial testing - great quality work for an alpha preview.
I'll knock up a bank or two for some Embertone instruments and let you know how I get on. |
![]() |
![]() |
![]() |
#11 | ||
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]() Quote:
Quote:
![]() Last edited by tack; 11-26-2017 at 10:26 PM. |
||
![]() |
![]() |
![]() |
#12 | |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]() Quote:
In general, community bank submissions are most welcome. ![]() |
|
![]() |
![]() |
![]() |
#13 | |
Human being with feelings
Join Date: Oct 2017
Location: Black Forest
Posts: 5,232
|
![]() Quote:
|
|
![]() |
![]() |
![]() |
#14 |
Human being with feelings
Join Date: Aug 2014
Posts: 11,103
|
![]()
Wow, this is really well presented and looks like a LOT of work has gone into it. Thanks so much for being so generous with your time!
I really don't have time at the moment to get properly stuck in, but wanted to give some words of appreciation and encouragement. Maybe in the new year I'll add some mapping for LASS First Chair and the Sample Modelling instruments I've got, if no-one else has by then. Thanks again ![]() |
![]() |
![]() |
![]() |
#15 | |
Human being with feelings
Join Date: Feb 2009
Location: Reaper HAS send control via midi !!!
Posts: 4,067
|
![]() Quote:
-accent -fermata -marcato -portato -staccatissimo -staccato -tenuto A .lua which can sync between these events could do the trick, as an early experimentation field. I mean sync from notation to reaticulate events. PHP Code:
|
|
![]() |
![]() |
![]() |
#16 |
Human being with feelings
Join Date: Nov 2015
Posts: 608
|
![]()
I can't believe my eyes ... thanks sooooooooo much for you effort! Tack, I don't have words to express my gratitude.
Last edited by Vagalume; 11-27-2017 at 04:23 PM. |
![]() |
![]() |
![]() |
#17 | |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]() Quote:
Ideally, in fact, these notation events could be used directly to trigger articulation changes in the underlying patches (translated by the Reaticulate JSFX as it currently does for program changes). The problem though is that the articulation (or other custom notation) events seem to be sent after the notes they decorate, not before. Hopefully that's fixed by the time articulation maps lands. In the meanwhile, I think I'd rather not have any attempt at notation view integration at all than to do something half baked. |
|
![]() |
![]() |
![]() |
#18 | |
Human being with feelings
Join Date: Feb 2009
Location: Reaper HAS send control via midi !!!
Posts: 4,067
|
![]() Quote:
I would keep the original design using program change/bank select events as this is very general, so very good. This would work with any synths with bank select and program change, like Synth1 or Oatmeal. Not everyone wants to compose and run after Hans Zimmer. Better would be simply syncing .lua or other extra .lua dancing around those bank select, program change, notation articulation events. Regarding after the note instead of before the note, yes, the sync .lua could behave a bit intelligent and jump over its previous note, then it would be again before the note. Possible? Yes. ![]() Yeah, the libraries have many more articulations, this can be, that is why it is only a small experiment, not a fully finished end solution, just the beginning, only to see, how it feels if you can directly compose in the notation editor while creating your notes. Workflow could be like: -open midi editor,notation view, add notes, add articulations (both using mouseover, hit some qwerty key) -hit ENTER (that would switch over to arrange, plus notation to reaticulate sync, plus optional PLAY) -hit ENTER again, to switch back to midi editor,notation view edit,ENTER,ENTER edit,ENTER,ENTER edit,ENTER,ENTER ... Last edited by TonE; 11-27-2017 at 03:26 PM. |
|
![]() |
![]() |
![]() |
#19 |
Human being with feelings
Join Date: Nov 2015
Posts: 608
|
![]()
Hi Tack, I checked yesterday Reaticulate creating a new virtual instrument with the Kontakt factory banks and Spitfire Symphonic Strings and it worked perfectly, (the structure of the default factory banks is not the best). The part of creating my own banks is tricky to me so I haven’t tried it out.
Then I checked Reaticulate with one of my orchestral templates and works too, no problem at all. Anyway I have a doubt: my templates consist on instances of Kontakt, inside each of them I have 16 tracks, First I tried out using it in the Kontakt track, and them in each of the 16 tracks. Maybe I am wrong but I see that you are using just Kontakt instances without tracks inside. Is this the best way to use Reaticulate? Should I change my templates to use Reaticulate efficiently? I haven't found any bug at the moment, I will try with different libraries this weekend, maybe I would like it narrower ... but this is really subjetive I guess ![]() Last edited by Vagalume; 11-28-2017 at 06:37 AM. |
![]() |
![]() |
![]() |
#21 | |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]()
What would you recommend to improve it?
Quote:
You can use ctrl-mousewheel to adjust the overall zoom level of the UI. I realize the box of 16 MIDI channels takes up a good amount of horizontal real-estate. At some point I'll look at how to make it reflow a bit better for narrower panels. Thanks for the feedback! |
|
![]() |
![]() |
![]() |
#22 |
Human being with feelings
Join Date: May 2017
Posts: 14
|
![]()
Hello there,
Just wanted to thank you for this wonderful set of scripts. It really makes life so much more simple. |
![]() |
![]() |
![]() |
#23 |
Human being with feelings
Join Date: Jan 2013
Posts: 163
|
![]()
I've spent a couple of hours playing with this and it still seems rock solid to me - haven't seen any unexpected behaviour.
Here's what I've come up with for Embertone's Fischer Viola: //---------------------------------------------------------------------------- //! g="Embertone/Fischer Viola" n="Fischer Viola" //! m="Embertone Fischer Viola 1.0" Bank 37 10 Embertone - Viola //! c=textured i=vibrato g=2 n="default vibrato" o=note:27 27 vib default //! c=textured i=vibrato g=2 n="progressive vibrato" o=note:28 28 vib prog //! c=textured i=vibrato g=2 n="open string vibrato" o=note:29 29 vib open //! c=textured i=vibrato g=2 n="gentle vibrato" o=note:30 30 vib gentle //! c=textured i=vibrato g=2 n="passionate vibrato" o=note:31 31 vib passion //! c=default i=note-whole g=3 n="sord/sul off" o=note:43/note:42 43 sord-sul off //! c=default i=con-sord g=3 n="con sord" o=note:41/note:43 41 con sord //! c=default i=sul-pont g=3 n="sul pont" o=note:42/note:44 44 sul pont //! c=default i=sul-tasto g=3 n="sul tasto" o=note:42/note:45 45 sul tasto //! c=default i=sul-pont g=3 n="sul pont/con sord" o=note:41/note:44 48 cs sul pont //! c=default i=sul-tasto g=3 n="sul tasto/con sord" o=note:41/note:45 49 cs sul tasto //! c=fx i=bow-up g=4 n="color on" o=note:33 33 color on //! c=fx i=bow-down g=4 n="color off" o=note:34 34 color off //! c=long i=note-whole o=note:36 36 sustain //! c=short i=staccato o=note:38 38 staccato //! c=short i=pizz o=note:39 39 pizz //! c=short-dark i=tremolo o=note:40 40 tremolo //---------------------------------------------------------------------------- I'd welcome any corrections or suggestions. How set is your bank format at this point? Would it be better to wait before spending much time writing additional user banks? Edit: Another question, I may be missing something obvious but is there a way to add the articulations to the track other than recording while clicking them (or step recording them)? Last edited by gmgmgm; 11-28-2017 at 10:37 AM. |
![]() |
![]() |
![]() |
#24 |
Human being with feelings
Join Date: Jan 2009
Posts: 1,033
|
![]()
Very cool.
I'll echo the need for this to sync with the notation view. I get that articulation maps are coming at some point, but I think you could have a separate (optional) script that copies the bank entry to notation or vice versa. I might try to cobble together a proof of concept unless you have any objections. |
![]() |
![]() |
![]() |
#25 |
Human being with feelings
Join Date: Oct 2017
Location: Black Forest
Posts: 5,232
|
![]()
I'm not 100% sure if I got this right, but I think the numbers in front of the articulation represent the program change number, which can be triggered by a MIDI controller / Lemur / TouchOSC.
|
![]() |
![]() |
![]() |
#26 | |||
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]() Quote:
![]() Quote:
I also demonstrated a few in the video: actions for next/previous articulation (which I use from my control surface), an action to scroll through the list (to use via an encoder say, or the mousewheel if you prefer), and also actions to activate articulations by specific program number, which you could do from e.g. a tablet. When you trigger these actions with the MIDI editor open and step input enabled, then they will be inserted in the MIDI item. Otherwise, they should be captured via live recording. Or, if not recording or step-inputting, you can of course activate them just for ad hoc use. Quote:
Reaper can't step record program events unfortunately (or at least it didn't when I tried last year). So the right way to trigger an articulation is through one of the actions I mentioned earlier (or by clicking on the articulation button in the GUI, but that's not always the most practical approach). |
|||
![]() |
![]() |
![]() |
#27 |
Human being with feelings
Join Date: Feb 2009
Location: Reaper HAS send control via midi !!!
Posts: 4,067
|
![]()
When suggesting it I was thinking of users like you or Mr. PC mainly. Not for myself. Maybe for this orchestra: https://www.youtube.com/watch?v=Pu2JwwG3bjA
|
![]() |
![]() |
![]() |
#28 | |
Human being with feelings
Join Date: Feb 2009
Location: Reaper HAS send control via midi !!!
Posts: 4,067
|
![]() Quote:
When using php and /php around templates looks a little better, see: PHP Code:
|
|
![]() |
![]() |
![]() |
#29 | |
Human being with feelings
Join Date: Jan 2013
Posts: 163
|
![]() Quote:
I suppose I was hoping for an insert method better suited to messing about in the MIDI editor with an already-recorded track. Something like "right click the articulation in the Reaticulate gui to insert it at the current time position", perhaps. I guess this would only avoid having to put Reaper in/out of step record mode, but I tend to forget to switch it off - and also I'm a lazy, lazy man. |
|
![]() |
![]() |
![]() |
#30 | |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]() Quote:
![]() Thanks for that. I find I'm terribly self-conscious about going on for too long. I try to be brief but routinely fail. Last edited by tack; 11-28-2017 at 05:55 PM. |
|
![]() |
![]() |
![]() |
#31 | |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]()
I wanted to underline one of the goals for factory banks.
This is an excerpt from the documentation that I'll just quote directly: Quote:
UACC has got problems, but I think it's mostly good enough for these purposes. I did think of doing my own spec for articulation mapping, but, well, oblig. Of course you can do whatever you want for user banks, but if you're sharing with the goal that your contribution is merged into the factory bank -- something that I'm absolutely encouraging and thrilled to see as I'd love to flesh these out for other users -- I just ask that you follow UACC where possible and follow the other recommendations in the docs. Other key points: articulation names are lower case (except to differentiate between e.g. trill m2 and trill M2), and group 1 should be used for the main articulation group (the one with most articulations that control the instrument) rather than things like legato on/off. |
|
![]() |
![]() |
![]() |
#32 | |
Human being with feelings
Join Date: Jan 2013
Posts: 163
|
![]() Quote:
For example, in rewriting my Fischer Viola bank to conform, the various vibrato styles don't really fit. Assigning the default style to 16 seems right, but should the other four possibilities be assigned in the UACC FX range (90 - 99) or perhaps to a number outside current UACC (> 112)? A similar case is controls that do nothing but turn off articulations. Or should this sort of functionality (not really articulation) remain outside banks aimed at inclusion in the factory banks? |
|
![]() |
![]() |
![]() |
#33 | |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]() Quote:
It really is a judgment call. For those programs that aren't clear cut, I match them as best as I can, and if it's completely in left field, yeah, pick either an unassigned program, or an uncommon program if you run out. The ones I personally feel are more important to get right: 1: long normale (non-legato for chords) 7: long muted (e.g. con sordino) 8: long soft (sul tasto, or flautando, or hollow, or something played at an unusually soft dynamic) 9: long hard 11: tremolo/flutter 20: legato 40: staccato or generic short 42: spiccato or very short 56: pizzicato 70-74: trill Of course many patches have multiple articulations that could qualify, so in those cases I assign the one I think is most representative or common in the context of the patch. There's something I haven't quite settled on philosophically -- I think that uncertainty shows through in the factory banks right now -- which is what to do with patches that use mode toggles (e.g. legato on/off, con sordino on/off) as opposed to discrete articulations (long normale, long con sordino, legato normale, legato con sordino, etc.) like Spitfire does. One idea I quite like in practice is activating a single program and knowing exactly what you're going to get. Especially the ones listed above. For example, I like being able to send program 1 and know that, no matter what, I can play chords; or program 20, and know, if the patch supports it, I can play a play a monophonic line with legato transitions. Or program 42, and I'll get biting shorts. This is useful for sketching contexts -- quickly activate the basic sound you want to achieve without farting around with multiple articulation keys -- and then you can go in later and massage the MIDI data. I was not always true to this idea in the factory banks (e.g. with the Bohemian and Cinematic Studio Strings), and I think I'm regretting that. In these cases, I've been considering creating separate companion banks for the purpose of sketching, and avoiding the problematic program numbers in the main bank. So, take for example Cinematic Studio Strings, where we have these programs: 20: legato on (group 2) 19: legato off (group 2) 7: con sordino (group 3) 2: senza sordino (group 3) 1: sustain (group 1) This means it isn't the case that I can send program 20 and know I'll be able to play a legato normale line, because if the patch is currently on, say, staccato, I'll need to additionally activate sustain. But that means sending program 1, where the expectation I should be able to play chords. It's a real mess. ![]() Instead, I think it perhaps wise to avoid program 1, 7, and 20 in the main bank and reassign these to something else. Then have a companion bank, which could be loaded along side the main bank in the track, to implement this "one program to rule them all" combination programs, like what I ended up demonstrating in the video. Maybe this does argue for something more precisely specified than what UACC is offering. I want to have my cake and eat it too: consistency and uniformity across different libraries from different vendors, and be able to support a varied ecosystem of different implementation approaches by those vendors. There's me rambling again. If you followed that stream of consciousness and you have some opinions on the matter, I'm quite interested. Last edited by tack; 11-28-2017 at 07:38 PM. |
|
![]() |
![]() |
![]() |
#34 |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]()
In case it's not clear from the above, program numbers in the factory banks are subject to change during the alpha preview phase.
![]() |
![]() |
![]() |
![]() |
#35 | |
Human being with feelings
Join Date: Jan 2013
Posts: 163
|
![]() Quote:
There's just too many ways to organise this stuff. I wrote Cubase expression maps for several libraries and tried to standardise, but the various functionalities and implementations among the manufacturers just made it a dog's breakfast of compromises. You've obviously given this considerable thought. I'd recommend doing whatever makes the most sense to you, for the way you intend to use Reaticulate. Let others know what you decide so that they can assist if they want to. It's already a great contribution to the Reaper community. |
|
![]() |
![]() |
![]() |
#36 |
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]()
Program 8 was perhaps a bad example. Indeed, 17 is pretty unambiguous for sul tasto (and there's piles of precedent in the factory banks). I think no matter how to slice it, "a dog's breakfast" is a fine description.
![]() Anyway, yes, need to have bit of a think on this. |
![]() |
![]() |
![]() |
#37 |
Human being with feelings
Join Date: Jun 2014
Posts: 77
|
![]()
I too watched the entire demo vid. Amazing tool. Great video too! A really fascinating and useful tool. Thanks Jason.
|
![]() |
![]() |
![]() |
#38 |
Human being with feelings
Join Date: May 2017
Posts: 14
|
![]()
The problem with doing so many combination programs as you stated above so that there is not a whole lot of different controls to be applied at one time, (the most clear example for me is Legato/ non-legato switch) is that if you make out all the combinations so as to take care of the multiple output (with notes and ccs to match) you end up with twice as many programs.
Now, one of the powers I like in your solution is that you have given us 10 actions ready to go straight to the articulation one wants, this in combination with another layer of abstraction seems to make the most sense to me. This extra layer can be many things: - Menu buttons, or actions: Basically reduplicating and renaming (or regrouping) those actions to whatever you want, and have sets created per library. - OSC messages (again basically sending the same but arranging display so as to show remotely the correct names). - Web Remote (Same thing, calling up the 10 actions with the correct names depending on the library). In this way, the level of abstraction is left to the user, but you make the most out of those 10 actions, as otherwise you'd need twice as many. Of course it is not perfect, it is more work, and when switching from from a legato articulation to a non legato one, you'd need to toggle two buttons rather than one, but if its something that you do often you could just assign one button that triggers both actions. Still, as I said is one more layer and more work on the user, but let's not forget that these options are there to use. |
![]() |
![]() |
![]() |
#39 | ||
Human being with feelings
Join Date: Jan 2014
Location: Ontario, Canada
Posts: 1,638
|
![]() Quote:
I think, though, there is a good reason to provide some consistency for a set of very common articulations for the sketching use-case. A strict set of programs which will emit all the necessary output events to get the patch into exactly the state defined by the program (e.g. program 1: non-legato long sustains senza sordino), that Just Work no matter what track is selected. All other programs, although perhaps still adhering to UACC if there's a reasonable match, are more lax in that they don't take extra care to set those things like sordino, legato, etc. I'm warming up to the idea. There's a gap in Reaticulate's functionality that I'd need to close, which is that if a program emits an output event to set, say, legato off, and there is another specific "legato off" program in another group mapped to that output event, Reaticulate won't realize it should activate that program in the other group. That should be easily fixed, and then it would allow these "all inclusive" programs to co-exist with the more narrowly defined programs that more closely align with the patch's true behavior. Quote:
![]() Early incarnations of Reaticulate defined the type of output event at the bank level (e.g. note, CC and which CC number, destination channel number) and then used the program number to signify the value for the output event (e.g. if the bank's output type was note, then program 42 would send note 42). I had a minor breakthrough that made me realize I could allow for multiple specific output events for each individual program. This does allow for some great flexibility, as you point out. Yes, of course I'm agonizing about exactly how the factory banks should work, but the user is free to do whatever suits their specific workflow and preferences. I like the idea of leveraging Web Remote, and I'm interested to see what users cook up there. Last edited by tack; 11-29-2017 at 10:15 AM. |
||
![]() |
![]() |
![]() |
#40 |
Human being with feelings
Join Date: May 2014
Location: Norway
Posts: 1,003
|
![]()
This looks really nice. Great job on this!
As someone who recently started using sample libraries, articulation-switching has been one of the biggest hurdles. The current method I use is quite cumbersome. |
![]() |
![]() |
![]() |
Thread Tools | |
|
|