Jump to content


  • Posts

  • Joined

  • Last visited

Personal Information

  • State

kapGo's Achievements


Enthusiast (6/17)

  • First Post
  • Collaborator
  • Conversation Starter
  • Week One Done
  • One Month Later

Recent Badges



  1. aye, @Autosteve , in the interest of getting things moving along for the williams sys4-7 drop in rPi sound engine i am shifting dev to a python based lib called pydub. it uses libav and ffmpeg for playback but more importantly has a nice set of features that should offer a lot of config options for playback types in an easy to use manner. this means that others will be able to add and change stuff as they see fit and install shouldnt be too complex. i will open a new topic later so as not to hijack this thread, when i have something useful to demo...
  2. its a long slow slog at the moment, with little additions and fixes that seem to take forever. the marquee lighting system is a bit tricky in that its going to require odd looking bits of off-cuts glued and/or fastened to other bits in the attempt to get a field of light hitting the perspex marquee. so far its like this: its two CCFLs with a 12v power unit that i got years ago from jaycar for a lightbox that is no longer used. they don't sell these anymore and i wonder if its cos of the mercury inside... well they are brighter then any i got from the busted laptop. i haven't tested the laptop fresnel ( is that right name?) screens yet but there are two of them, one for vertical spread and the other horizontal spread, the latter is below: this might be useful cos the two CCFLs are aren't as wide as the lettering on the marquee so it may help to spread the light further to the sides. but it also may dampen it, only a test later will tell. meanwhile back in the cabinet, all the internals are finding their places and the wiring is getting sorted out with me trying to make sure audio and power don't cross etc. The audio card is mounted on the side wall close enough to the monitor so i can add a little window for its unfortunately necessary power switch - hard rubbish finds have their own quirks huh. The 60-in-1 card is mounted flat at the moment but i'd prefer it to be vertical to minimise possible "accidents" - less surface area and all that. The hard rubbish found PSU is one of those ones used in old office desktop PCs so its not exactly high powered but has enough juice for maybe a 2 core, dvd, integrated graphics and maybe a peripheral or two. i think thats enough to power this arcade cabinet, including a 12v line from the HDD/FDD (yeah its that old) cable to power the marquee lights. the only bad part at the moment is the 4-way power board which is another unfortunate necessity. it ends up being easier to use this as i need two 240v ac sources and a 18-20v dc source. however the one thats in the photo above is cheap, crap and ultimately blew its little fuse... bleh. Still don't know what to do with all the extra jamma connector leads that aren't being used, i don't want to cut or remove any of them so they are just clumsily bundled in the corner there and held in place with cable ties and a curtain drawstring stay. but mainly all of this slow tedious stuff means that me and the wee bairn can power up the arcade and give it a test... half expecting problems but everything works despite the months of storage and build in a dirty, leaky, bird infested garage (the birds have since been politely encouraged to find a new abode). still lots of little bits and pieces to do, like the proper marquee perspex mount, fasten the CCFLs, batten the PSU properly, cable clean up, affix the coin and 1-up buttons, final touch ups of black paint and protective top-coat. So far i managed to "demo" to the touch-screen kid some of my favourite arcade games from so many years ago such as Xevious, 1942, 1943 (top music) and Time Pilot. button mashing and wrangling the joystick really needs a full arcade cabinet cos its such a satisfying feeling to do this as opposed to "tapping" and "dragging" with a finger on a piece of glass.
  3. Marquee time. And time to try and get stencilling to work - all of this takes place on the reverse side of the perspex. this is a bit pic heavy but it may be of use to someone other than myself. I ended up just pushing on with the whole thing instead of faffing around with test painting etc. Maybe not the wisest move but meh. gotta push on. First thing was to print out the psd and use it as a template for cutting out the pvc film, as per above. and carefully, slowly sticking it to the perspex. and then commence painting, using the cheapo acrylic paint from the big blue office supplies shop up the road. its goes on thinly so i cross-hatch the brush stroke directions and end up doing about 5-6 coats. the texture it leaves is really nice, almost like a close knit fabric. then the moment of truth for this technique : the removal of the pvc film. slowly and a letter at a time, and wow, it leaves a nice clean edge. much better than when i used copy paper as a stencil :P for the three-d letter effect i decided to use masking tape instead of another layer of the pvc film, mainly cos i wasn't confident that i could cut, layout and stick the pvc to the marquee in perfect alignment. also stuck the print out underneath the perspex so i could see what it was i was meant to be painting next. luckily it turned out better than i expected. slow and careful removal of the masking tape bits left a good clean alignment. there were a few places/joins that needed going over again with a tiny brush but overall the result was encouraging. next bits were the decorative elements which are some stars and a kind of milky way looking cloud of blue. the stars were made by dipping a 2B pencil into the paint and stabbing everywhere. the blue clouds were painted by hand using the same technique of cross hatching 5-6 coats. then a final complete mask to protect the letters so the final layer, the black, can be painted. the black can be painted over the stars and a bit of overlap over the clouds but i figured the letters should remain clear of the black especially when it ends up being back-lit. finished and it looks like this. it still has the protective plastic over the face so it looks a bit fuzzy. but you get the gist. it was only after i started painting it that i noticed the weird backwards "F" letter (which is "d" in english). when the font is written properly that "F" is on an angle, but when it is presented in the perspective view that matches the defender marquee, the "F" goes perpendicular. well it looks a bit weird and out of place but it aint my alphabet. last pic, this is of the test fitting in the cabinet. a thin sheet of mdf (2-3 mm) will be used to build a frame which will be covered in some off-cuts of black flannelette that i got from the local fabric shop. the intention is that the fabric will dampen the marquee from any vibrations that the nearby speakers kick out. next is to construct the holders for the fluoro lamps and the sheets of 2D gauze (or whatever its called) i yanked out of a busted laptop lcd.
  4. The last major bits are being added with the marquee getting a look in finally. Got some perspex sheets from the big ol' hardware warehouse down the road, cut it to size with a jigsaw and plonked it in to the cabinet to see how it all fits. And to try figure on how it can be secured. The marquee art is going to be based on the defender cabinet marquee but instead of the word "defender" im going to put the word "arcade" written in Aurebesh (the star wars common language). And im also going to try and get some sort of stenciling system worked out cos i have avoided it so far and really should get it sussed. Here is a photo of the artwork reversed and layed-up in photoshop, printed ready to be used as a guide for cutting the shapes out of some pvc self adhesive film. firstly a bit of a test on some perspex off-cuts to see how well the pvc sticks, how well it contains the paint and how well it can be removed. cutting the stencil was relatively easy using a stanley knife, sticking it was pretty easy though fiddly due to the smallish gap between the two main parts and it was easy to remove. but there was the problem of bleed in some sections. bleh. depending on which layer it happens on it may not be a problem with a bit of careful scrapping...
  5. Got to install the speakers into the cabinet with a bit of secondary drilling using the spade bit to route out some space for the speaker cones: yeah fine, not exactly aligned in any sensible way but it adds character ;) - but actually there will be some speaker grills to go over the cutouts. i have a feeling that these may need to be purchased... but will keep looking around the mean streets of melbourne for hard rubbish piles. these sony speakers have nice long cables attached that reach all the way down from the top of the cabinet to the circuit board shelf. the extra use of the spade bit helped allow more room for the cones to pulse, or whatever the technical term for oscillating with the sound waves is. i ran a test using an S5 phone playing some Chibi-tech (specifically Moe Moe Kyunstep) at full volume on both phone and hi fi amp. this track is performed on some famicons (8 bit like a lot of the arcaded games originally were), has a great expressive dynamic range and is great to listen to as it's farkin' anthemic, especially as the wee bairn had never heard this before. Speaker cones moved a fair bit but within the cut out spaces and the mid range was really prominent whereas the bass was a bit lacking. I think a reflex pipe may be useful in this cabinet and there is room for it. oh and a start was made on the clear coats as this really has to get finished before i die of old age.
  6. Did a bit more detailing work on the sideart, this time on the xwings and added more engine exhaust. getting the red to look good on the black background is a bit tricky but maybe taking time and several coats of thin paint is the way to go. really want to get this done so i can get around to adding the clear coats but i keep wanting to add more bits here and there, d'oh. but structurally its onto the speaker cut outs on the top panel above the lcd. i put them at the back as the front will need space for whatever lighting system ends up being used for the marquee. also there will more than likely need to be an enclosure of sorts around the speakers to help generate the lower-mids and bass frequencies. the sony speakers used a reflex port too but i doubt i be adding that. the cutouts were made with a drill and a 30mm spade bit that i had used previously to cut the holes for the buttons and joystick. At the moment the main speaker cutouts have a central circle and four orbital ones to hopefully allow enough room for the speaker cone but retain a bit of a spoke to help protect the speaker from accidental knocks ( how you'd knock them i dont know... ). I have a feeling i will end up cutting away those spokes and just having a large hole that matches the diameter, but i didnt have the speakers with me at the time to test how it all goes together. the test fitting will come next session.
  7. The hard rubbish found Sony hifi is alive and functioning. Im gonna assume it was either a non functioning cd drive or the apple connector change from 30 pin to the latest iphone version of lightning or something that made the owners chuck it out. Here it is with its opened case just before removing all the shielding and other bits of casings. Its still visibly wet from the rain, so there was another night of waiting for it to dry out before testing the components. Nice build sony. Visible on the left is the audio line jack (3.5mm) which then goes directly to the main board. in the middle is the speaker breakout board with lots of shielding on the cables going in and out of it. to the right is the 19.5v DC in board with a fuse, diode and 2 buses. The speakers had to be wrenched out of their enclosures, and they are a little small but i will have to wait and see what happens when they are put in the arcade cabinet. Again with shielding on the cables. And here it is after a quick speaker test and a check for any schematics (could only find some datasheets for the Audio DSP, Speaker Amp and USB Audio Decoder ICs so far). I would rather it runs on 12v but i think the higher voltage is only required for the onboard amps. these are rated for 10-26v supply and with the 19v already coming in they arent all that loud. Not sure on the speaker specs either. Its running audio from an old music player that isnt very loud but it all works. Switching the functions to Audio In is retained after power down along with volume settings, so a test was then made of booting it up without the display and control board attached and it still boots up and works. next is to try and bypass the power switch, which has the board boot into a standby mode requiring a button press to get it to play audio. Still, a good find and one that may fit with the defender-ish cabinet, at least aesthetically :)
  8. The puttying is now finished and a few layers of covering black paint have been applied, leaving maybe a final coat applied with a roller to get a bit of a texture. Still more crappy weather has been leaking rain into the garage (which isnt mine) but with the cabinet on castors its not so much of a concern. Plus the tarp is wrapped around it after every session. Anyway more funner things as its time for the last bits of detailing to go on the ships and maybe the death star. Here the xwing has some greys added and a start on the engine exhausts which in the movies is a sort of white to red gradient. it kinda looks ok so far. more detailing will be done over the next few sessions too. I havent found any time to figure on any of the recruitment type blurb things mentioned in the last post, but its still a thing that i reckon may be a good idea. But meanwhile, even though its been raining all day, me and the wee bairn hit the streets on bmx bikes looking for hard rubbish bits to make him a robot costume, and low and behold theres a Sony CMT-CX5 CD, DAB, ipod (old 30 pin type) sitting half in a box and getting wet. with both speakers too. its still wet so i havent been able to test what state its in yet, it needs 19.5 V dc in and trusted reviews said in its cons section: Lacks a little midrange, Not the most attractive system, Could be louder. But KapGo's wombling review of street treasure says: doesn't need a mid range as it will be in a giant MDF bass bin, it will look plenty good taken apart and sitting in the defender-ish cabinet, yes maybe could be louder but it has a line-in and was free... next thing to find on the mean streets of surburbia is an old lcd which may have working CCFLs for the use with the marguee.
  9. ha, i realised almost immediately after posting that i shouldn't think out loud in a forum post :) - the clock stuff was simply me thinking about the ways the pinball cpu board would be connecting to the rPi for sound triggers and yeah theres no need at all for a clock signal. The other thing i was thinking about was the source of the grounding for the pins on the original williams hardware - am i right in assuming that the ground source can/will come from the cpu board? cos at the moment im triggering the mcp23008 pins with the ground from the rPi?
  10. its been a bit of a while since i last got to do anything as school holidays took over and a few other things too. but now theres some time to "rescue" the ol' cabinet from the bombsite/garage... : above is how its was wrapped for a bit (i have since improved this technique) but its didnt stop tonnes of sawdust, concrete splatter, water damage from freaky rains and a weird white stain that as yet remains unidentified. luckily, i laughed at the state. cos what else can you do. this, however, has changed the order of things a bit (like there ever was an order). firstly is to finally get around to putting the castors on the base so it can be moved around more easily as well as lifting the whole cabinet a couple of inches off the floor. the next thing is to get the sideart sealed asap. with spring and daylight savings etc, the sun now can stream straight in to the garage and i dont like that at all, plus weirdo melbourne rains. i knifed some wood putty (probably the wrong kind but it was at the hardware shop for cheaps) into the screw holes with a plastic spatula thing. this took two passes to end up with a nice smooth finish in the holes. So far only the black space bits of the cab are getting this treatment as i reckon the planet and death star are ok with the few visible phillips heads. after a bit of sanding i can then mask off the ties and xwings and then apply the last black coat and then some sort of sealer. oh yeah i did add the green lasers blasts form the ties but its so small it looks tokenistic, not threatening to blow you up etc. plus i am thinking about adding a "recruitment" blurb in the remaining black space around both sides of the cabinet, like those "Join the Imperial Navy" posters, but maybe not so fascistic and more along the lines of the older ones that something like "enlist today, see the galaxy" - you know, the nice, kind, caring empire of yore ;)
  11. i got the mcp23008 -> interrupt -> rPI reads to load a numerically associated audio file and play it. this is without its own thread or interruptible playback. the code is messy but its currently using alsa and libsndfile to do the work here, also there are some notes about using the userland libraries but i havent gotten around to linking them yet. But these will have the low level bcm_host, khronos and omx_core stuff which may or may not be useful, it depends on performance. file handling is very messy at the moment but i think loading all the audio files into memory as opposed to constant IO reads is preferable. also with the audio files i have edited a folder down to 16 bit files but i think the libsndfile can deal with the whatever format automatically, it just requires a proper SF_INFO to set the parameters for playback. whether this file conversion hits performance is another matter. this is a pretty useful library that ive only just started looking into: http://www.mega-nerd.com/libsndfile/ i cant remember cos it was late last night but i think the rPi has it in the default repo. another thing is the method to handle the stop/reset triggers. on a lot of the earlier williams 4-7 roms this is at trigger #19 but some of the later ones (Varkon, Cosmic Gunfight, etc) have this moved to other values. also there are modifier triggers and multi-tap triggers that involve an change in frequency (pitch and duration). so maybe some sort of meta_data file that has instructions will need to be included within a specific folder of audio. Also the use of the switch for speech audio or just sounds. the blackout rom for instance has some good sounds in IC12 instead of the speech rom sounds if they are switched off. also i wonder how feasible it would be to get the clock signal from the pinball cpu to drive a pulse on the rPi gpio? this could be a way of clocking the rPi to a useful speed and keeping it ticking along. i know the original sound boards had their own clock and i assume they were in some way relative to the main cpu clock, though not phase locked.
  12. the interrupt register clear is fixed now by reading the values held in INTF_ADDR and then performing a read of the INTCAP_ADDR to clear them. i have also added a "debounce" line that is just a blocking delay() which will make people shudder. but this will suffice for the moment as my triggering consists of me tapping a wiring against a breadboard pin. i think this is an ok stage to start looking at how to get wav files playing no the rPi and the state of rapid multiple triggers.
  13. I have a speech board working now so I can start to look at the speech roms. The first is for Blackout, this only used 3 roms on the board for 10 words. two words (CONDITION, RESUME) are split over roms. i was looking at the sinistar manual and it says the audio is first triggered at the sound board, then sent from the speech board back to the sound board to convert from parallel to serial, then back to the speech board for conversion from digital to analogue and "filters the resulting analogue speech", and then finally back to the sound board and the amplifier and speaker circuits. this speech board works with good volume and reasonable clarity, its got a bit of white noise/static associated with all phrases but maybe thats due to the method of how they generate some the syllables, or the filtering process. the samples contained in the rar are numbered as per the previous post for Blackout with the trigger number followed by the phrase, ie: blackout-20-LAUNCH_MISSION.wav these are some notes based upon the sound roms found at ipdb and what appears to be an original "SOUND ROM 2" labeled rom. the file for blackout-22-ORBIT_COMPLETED.wav plays the phrases and then the endless background sound blackout-18.wav. im not sure yet whether that last part of the audio is contained in that routine or if a jump to sound #18 is performed. The sound at blackout-29-RESUME_MISSION.wav plays the phrases and then sound #6. sound at blackout-31-MISSION_COMPLETED.wav plays the phrases and then a sound not present in the remainder of the trigger addresses. also 2 of the non-speech blackout triggers (#4, #9) had a multi tap function that increased the pitch and speed of the sound (ie frequency), but this function is not present when the speech board is utilised. with the speech board either not present or bypassed with micro switch 2 on the sound board, the triggers address sound routines held in the main sound rom as opposed to the speech board. I know this is all very obvious to most but im just putting info here for the sake of archiving notes about the Williams sound boards. another thing is that so far i have found the pinball schematics and service manuals to be far more extensive in their documentation than the video game manuals. Its available here in rar file at approx 3.1MB : http://s000.tinyupload.com/index.php?file_id=32363173171144486604
  14. long time has passed - well school holidays are a thing, and the dev rPi got turned into a kodi player for a bit. :) anyway, heres the testing code as it stands so far. its at the proof-of-concept stage so its not pretty, nor is it optimised, nor proper in any way and neither does it play any audio yet. firstly get the IO stuff playing nicely and to be on par with the behaviours expected by a Williams 4-7 and then progress from there. this test code is mainly to get a reasonably useful program for running wiringPi and seeing how that behaves. there are notes and rems everywhere and various vars and functions have names that make sense at this stage. it will stay this messy for a bit cos time on this is infrequent due to many reasons. Of note is that the INTCAP register is presently not clearing when read as per specs. so maybe i need to add in a straight GPIO pin read/flush, which id rather not do as im trying to keep IO access to a minimum - but this can be looked at later. the code should have all the dependencies obvious via the includes but other stuff needed can be found in the post above where i list the various libraries that were installed at setup. also there are several different methods that the wiringPi gives access to that could be utilised but the direct write/read to register seems appropriate at this stage. /* * first test of wiringPi in c * -uses mcp23008 * -play wav files at trigger * * -dev,build,compile,exe in Geany * * $ gcc -o pinSound-test pinSound-test.c -lwiringPi */ #include <stdio.h> #include <stdlib.h> #include <wiringPi.h> #include <mcp23008.h> #include <wiringPiI2C.h> // controller cards numbered sequentially, // dev card/breadboard is last in current series (20-23 are used) #define TEST_ADDR 0x24 #define INT_PIN 0 // rPi GPIO 0, header pin 11 // mcp23008 addresses // direction: bits 7-0 : GP7-GP0 // intcon compare to defval #define IODIR_ADDR 0x00 // IO direction - 1:input, 0:output #define IPOL_ADDR 0x01 // input polarity - 1:opposite, 0:same #define GPINTEN_ADDR 0x02 // interrupt on change - 1:enable, 0:disable #define DEFVAL_ADDR 0x03 // default compare value - set bits to compare, enabled via GPINTEN & INTCON #define INTCON_ADDR 0x04 // interrupt control - 1: compare to DEFVAL, 0: compare to previous value #define IOCON_ADDR 0x05 // set INT pin active and polarity - #define GPPU_ADDR 0x06 // pull up resistor (100k) - 1:enable, 0: disable #define INTF_ADDR 0x07 // interrupt flag - can update before clearing - 1:caused interrupt, 0: nothing #define INTCAP_ADDR 0x08 // interrupt capture - remains unchanged until read or cleared - 1: high, 0:low #define GPIO_ADDR 0x09 // 1:high, 0:low //int wiringPiI2CSetup(int mcp_addr); //int wiringPiI2CWriteReg8(int fd, int reg, int data); //int wiringPiI2CReadReg8(int fd, int reg); int write_data = 0; int read_data = 0; int device_handle; /*************************************************************** * * UTILITIES * ***************************************************************/ void pin_trig_sound(void) { // don't... printf("Pin trigger test sound.\n"); system("tinyplay AUDIO/mess/test01.s16"); } void write_error(int write_result) { printf("write_result: %d", write_result); // more info } /*************************************************************** * * TEST * ***************************************************************/ void I2C_read_test() { // stuffs read_data = wiringPiI2CReadReg8(device_handle, IODIR_ADDR); printf("read IODIR: %X\n", read_data); read_data = wiringPiI2CReadReg8(device_handle, GPINTEN_ADDR); printf("read GPINTERN: %X\n", read_data); read_data = wiringPiI2CReadReg8(device_handle, DEFVAL_ADDR); printf("read DEFVAL: %X\n", read_data); read_data = wiringPiI2CReadReg8(device_handle, INTCON_ADDR); printf("read INTCON: %X\n", read_data); read_data = wiringPiI2CReadReg8(device_handle, GPPU_ADDR); printf("read GPPU: %X\n", read_data); read_data = wiringPiI2CReadReg8(device_handle, IOCON_ADDR); printf("read IOCON: %X\n", read_data); } void int_pin_test() { // if (digitalRead(INT_PIN)) { // pin high == OFF for sys4-7 printf("int_pin is HIGH, waiting.\n"); } else { printf("int_pin is LOW, trigger.\n"); } // read INT at MCP pin } /*************************************************************** * * INIT * ***************************************************************/ void I2C_init() { printf("I2C_init start...\n"); // uses wiringPi gpio pin numbering scheme wiringPiSetup(); device_handle = wiringPiI2CSetup(TEST_ADDR); if (device_handle == -1) { write_error(device_handle); } else { printf("device_handle: %d\n", device_handle); } } void int_pin_init() { printf("rPi gpio interrupt pin setup...\n"); pinMode(INT_PIN, INPUT); // logic 0 is interrupt active pullUpDnControl(INT_PIN, PUD_UP); } void MCP_init() { printf("MCP_init start...\n"); // direction: bits 7-0 : GP7-GP0 int write_result = 0; // errno == -1 // set INT pin to driver active-low // 7,6=unused, 5=SEQOP, 4=DISSLW, 3=HAEN, 2=ODR, 1=INTPOL, 0=unused write_data = 0x38; // 0x38=0011 1000, 0x3A=0011 1010 write_result = wiringPiI2CWriteReg8(device_handle, IOCON_ADDR, write_data); if (write_result == -1) write_error(write_result); write_data = 0xFF; // set to input: 1111 1111 write_result = wiringPiI2CWriteReg8(device_handle, IODIR_ADDR, write_data); if (write_result == -1) write_error(write_result); write_data = 0x00; // set input polarity: 0000 0000 write_result = wiringPiI2CWriteReg8(device_handle, IPOL_ADDR, write_data); if (write_result == -1) write_error(write_result); write_data = 0xFF; // set interrupt enable 0-7: 1111 1111 write_result = wiringPiI2CWriteReg8(device_handle, GPINTEN_ADDR, write_data); if (write_result == -1) write_error(write_result); //write_data = 0xFF; // set default compare value 0-7: 1111 1111 // compare to logic 1 - opposite cause interrupt write_result = wiringPiI2CWriteReg8(device_handle, DEFVAL_ADDR, write_data); if (write_result == -1) write_error(write_result); //write_data = 0xFF; // set interrupt control to defval 0-7: 1111 1111 write_result = wiringPiI2CWriteReg8(device_handle, INTCON_ADDR, write_data); if (write_result == -1) write_error(write_result); //write_data = 0xFF; // set pull-up on inputs: 1111 1111 write_result = wiringPiI2CWriteReg8(device_handle, GPPU_ADDR, write_data); if (write_result == -1) write_error(write_result); // proper status report } /*************************************************************** * * READ * ***************************************************************/ void I2C_read_intcap() { // reading INTCAP clears the register // any ints generated between first int and read/clear is disregarded read_data = wiringPiI2CReadReg8(device_handle, INTCAP_ADDR); printf("read interrupt: %X\n", read_data); // parse hex to sound file play } void read_int_pin() { // // really if (digitalRead(INT_PIN)) printf("int_pin is 1, WAIT.\n"); else printf("int_pin is 0, ACTIVE.\n"); } /*************************************************************** * * MAIN * ***************************************************************/ int main(void) { I2C_init(); MCP_init(); int_pin_init(); printf("INIT finish, int_pin_test...\n"); int_pin_test(); I2C_read_test(); printf("Finished test, running read loop :: CTRL-C to exit.\n"); for (;;) { // every read clears the int read_int_pin(); I2C_read_intcap(); //printf("wait...\n"); delay(1000); } /* while(1) { // loop eternal // wait for exit } */ return 0; }
  15. would electrically conductive paint over several coats be a possible solution?
  • Create New...