<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6845625574553920830</id><updated>2012-01-23T08:15:26.955-08:00</updated><category term='G4TV'/><category term='recall'/><category term='saved files'/><category term='Lucid Lynx'/><category term='DIY'/><category term='stopped working'/><category term='SIP'/><category term='HLSL'/><category term='5.1'/><category term='ultimate'/><category term='selenium'/><category term='mencoder'/><category term='mario kart wii'/><category term='upgrade'/><category term='crimson echoes'/><category term='CLI wrapper'/><category term='Xquartz'/><category term='PSNR'/><category term='moveset swap'/><category term='vp-20'/><category term='Kubuntu'/><category term='jaunty'/><category term='Aspire One'/><category term='cherry mx blue'/><category term='launchpad'/><category term='btrfs'/><category term='ambient occlusion'/><category term='face-fixing'/><category term='vanilla'/><category term='microswitch'/><category term='gameboy color'/><category term='trackpoint'/><category term='PowerMizer'/><category term='dared'/><category term='wifi'/><category term='lenovo'/><category term='cheaters'/><category term='experiment'/><category term='Metroid: Other M'/><category term='beginner&apos;s guide'/><category term='ZSNES'/><category term='CRT'/><category term='WebM'/><category term='thinkpad'/><category term='emulator'/><category term='build'/><category term='happ'/><category term='pbuilder'/><category term='psy-trellis'/><category term='gameboy advance'/><category term='fix'/><category term='network'/><category term='ubuntu'/><category term='nvidia'/><category term='yasm'/><category term='svn'/><category term='video quality'/><category term='iso'/><category term='GHB'/><category term='bump map'/><category term='das'/><category term='dsp3'/><category term='wine'/><category term='mechanical'/><category term='OS X'/><category term='GUI'/><category term='barkeeper&apos;s friend'/><category term='sf4'/><category term='ssnes'/><category term='HTPC'/><category term='arcade'/><category term='frontend'/><category term='skinning'/><category term='x120e'/><category term='squeeze'/><category term='RippedWire'/><category term='backloaded'/><category term='wall of shame'/><category term='repository'/><category term='unresponsive'/><category term='share'/><category term='freezes'/><category term='hack'/><category term='baseline'/><category term='KDE'/><category term='ssf4'/><category term='gHandBrake'/><category term='ssh'/><category term='oneiric ocelot'/><category term='automated'/><category term='speaker'/><category term='psychovisual'/><category term='deb'/><category term='HandBrake'/><category term='sd card reader'/><category term='filters'/><category term='horn'/><category term='wireless'/><category term='ipod'/><category term='Linux'/><category term='cheat engine'/><category term='netbook'/><category term='trackpad'/><category term='natty narwhal'/><category term='samba'/><category term='steam'/><category term='intrepid ibex'/><category term='mod'/><category term='PPA'/><category term='weaving'/><category term='Google Voice'/><category term='pixel shader'/><category term='nestopia'/><category term='problem'/><category term='free calls'/><category term='blue shell'/><category term='replacement'/><category term='netatalk'/><category term='high profile'/><category term='Gizmo5'/><category term='VP8'/><category term='phoenix gui'/><category term='d250-x'/><category term='mouse pointer integration'/><category term='nightlies'/><category term='how to'/><category term='pad hack'/><category term='binary'/><category term='advanced options'/><category term='model swap'/><category term='binary driver'/><category term='japanese'/><category term='NES'/><category term='Mac'/><category term='keyboard'/><category term='d-pad'/><category term='afp'/><category term='efi'/><category term='backend'/><category term='review'/><category term='X11'/><category term='flames of eternity'/><category term='bsnes'/><category term='broken'/><category term='SNES emulator'/><category term='virtualbox'/><category term='compression driver'/><category term='64-bit'/><category term='slow'/><category term='filthypants'/><category term='Cyanogen Mod'/><category term='SSIM'/><category term='Street Fighter 4'/><category term='audiophile'/><category term='cloud'/><category term='bash'/><category term='compile'/><category term='emulation'/><category term='unlimited items'/><category term='qtHB'/><category term='android'/><category term='ups'/><category term='Gizmo'/><category term='tube'/><category term='Canonical'/><category term='glsl'/><category term='bloom'/><category term='scroll'/><category term='VNC'/><category term='X-forwarding'/><category term='acer'/><category term='libsnes'/><category term='karmic'/><category term='x264'/><category term='region-locked'/><category term='overscan'/><category term='deb binary'/><category term='extract'/><category term='grub'/><category term='360'/><category term='shader'/><category term='normal map'/><category term='maverick meerkat'/><category term='psy-rd'/><category term='fighter stick'/><category term='cheat'/><category term='hardy'/><category term='handbrake dependencies list'/><category term='handbrakeCLI'/><category term='chrono trigger'/><category term='GTK'/><category term='AE'/><category term='32-bit'/><category term='comparison'/><category term='byuu'/><category term='optimized'/><category term='UbuntuOne'/><category term='monitor'/><category term='qt4'/><category term='script'/><category term='windows'/><category term='valve'/><category term='HandBrakeGTK'/><category term='compiz'/><category term='SNES'/><category term='usb gecko'/><category term='stage'/><category term='sensibeat'/><category term='sharing'/><category term='nano'/><category term='programming'/><category term='tutorial'/><category term='epic 4G'/><category term='srm'/><category term='genesis'/><category term='h.264'/><category term='Super Nintendo'/><category term='bacon'/><category term='amp'/><category term='Linux Mint 12'/><category term='alpha'/><category term='bluetooth'/><category term='dsp1b'/><category term='aspireone'/><category term='unlock'/><category term='surround sound'/><category term='subwoofer'/><category term='Dell Mini 9'/><category term='fusion'/><category term='cg'/><title type='text'>Filthy Pants: A Computer Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default?start-index=101&amp;max-results=100'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>115</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-2282227882652727360</id><published>2012-01-07T10:40:00.000-08:00</published><updated>2012-01-07T10:41:12.312-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nano'/><category scheme='http://www.blogger.com/atom/ns#' term='replacement'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><category scheme='http://www.blogger.com/atom/ns#' term='recall'/><title type='text'>Apple iPod Nano 1G Recall</title><content type='html'>Due to a potential for exploding batteries, &lt;a href="http://www.apple.com/support/ipodnano_replacement/"&gt;Apple recently instituted a recall on all 1G iPod Nanos&lt;/a&gt;, of which I had two (one with 2GB capacity and one with 4GB). I sent them off and, after a pretty long turnaround time (nearly two months altogether), I've received my first replacement: a brand new 6th generation touchscreen iPod Nano with 8GB capacity :D&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ROD4QnBRBUo/TwiRi5WGIiI/AAAAAAAABJM/Xu4miaGw5iE/s1600/nano+replacement.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://2.bp.blogspot.com/-ROD4QnBRBUo/TwiRi5WGIiI/AAAAAAAABJM/Xu4miaGw5iE/s200/nano+replacement.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you happen to have one or more of the old models, I recommend you take advantage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-2282227882652727360?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/2282227882652727360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=2282227882652727360' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/2282227882652727360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/2282227882652727360'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2012/01/apple-ipod-nano-1g-recall.html' title='Apple iPod Nano 1G Recall'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ROD4QnBRBUo/TwiRi5WGIiI/AAAAAAAABJM/Xu4miaGw5iE/s72-c/nano+replacement.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-3115787497060208738</id><published>2011-12-23T07:54:00.000-08:00</published><updated>2011-12-23T08:01:05.484-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='region-locked'/><category scheme='http://www.blogger.com/atom/ns#' term='japanese'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>How to Download Region-Locked Japanese Games from Android Market</title><content type='html'>&lt;span style="font-size: x-small;"&gt;The content of this tutorial is pulled from &lt;a href="http://board.byuu.org/viewtopic.php?p=51314#p51314"&gt;this post on byuu's forum&lt;/a&gt;. I am copying it here for redundancy and search engine indexing. The copyright belongs to D--.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;I've finally found a way to pull region and phone model locked Japanese games from the Android market, such as &lt;a href="https://market.android.com/details?id=jp.co.chunsoft.ShirenRainbow&amp;amp;rdid=jp.co.chunsoft.ShirenRainbow&amp;amp;rdot=1"&gt;the new Shiren game by Chunsoft&lt;/a&gt;. I'm posting the instructions here so no other poor fucker ever has to go through figuring this out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Basically speaking, these games are locked by both SIM region and firmware information. Companies like NTT DoCoMo offer a select group of handsets with their service, and these handsets have firmware that has been heavily hacked on the inside to brand it as such. In order to get such a locked game, whether free or for sale, onto your phone, you will need to make Android Market think you are running an NTT branded handset.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To do this, you will need the following:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;A rooted Android phone&lt;/li&gt;&lt;li&gt;RootExplorer&lt;/li&gt;&lt;li&gt;Superuser&lt;/li&gt;&lt;li&gt;Market Access - this app is ad free and can run at boot&lt;/li&gt;&lt;li&gt;A barcode reader that can handle QR codes&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;1.&lt;/span&gt;  Run RootExplorer and navigate to /system. Click the button to remount as r+w.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;span style="color: #cc0000;"&gt;2.&lt;/span&gt;  Long press on build.prop and select Copy. Paste it into the same folder or another folder to make a backup. You DO NOT want to lose this.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;span style="color: #cc0000;"&gt;3.&lt;/span&gt;  Long press on build.prop and select Edit in Text Editor.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;span style="color: #cc0000;"&gt;4.&lt;/span&gt;  Find and modify the following values (jacked from an NTT DoCoMo SHARP SH12C). Be aware they may not be grouped logically, so search the whole file if need bed. If a value doesn't exist, you will need to create it:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="color: #93c47d;"&gt;ro.build.id=S7140&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.build.display.id=01.01.02&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.build.version.incremental=01.01.01&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.build.version.release=2.3.3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.product.model=SH-12C&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.product.brand=DOCOMO&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.product.name=SH12C&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.product.device=SH12C&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.product.board=SH12C&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.product.manufacturer=SHARP&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.product.locale.language=ja&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.product.locale.region=JP&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.mtp.manufacturer=NTT DOCOMO, Inc.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.sh_build.id=S7301&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.sh_build.version.incremental=01.01.02&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.build.product=SH12C&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.build.description=SH12C-user 2.3.3 S7140 01.01.01 release-keys&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;ro.build.fingerprint=DOCOMO/SH12C/SH12C:2.3.3/S7140/01.01.01:user/release-keys&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;With it, I was actually able to purchase and install locked apps. In theory, if you have a tool like TitaniumBackup that converts installed apps to APK files, you could purchase an app, convert it to APK, then use the 15-minute return to get your money back. I have not done this because I don't want this kind of purchase pattern on my credit card, and because I'm willing to give Chunsoft 500 yen because that's a very fair price for Shiren.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;5.&lt;/span&gt;&amp;nbsp; Close Root Explorer.&lt;/div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;6.&lt;/span&gt;&amp;nbsp; Open System-&amp;gt;Applications-&amp;gt;All and scroll down to Market. Click Force Close and Clear Cache.&lt;/div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;7.&lt;/span&gt;&amp;nbsp; Power off your phone. You absolutely must reboot your phone in order to populate the new values we just made in the RAM.&lt;/div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;8.&lt;/span&gt;&amp;nbsp; Run MarketEnabler. Click the third tab and enter this for your SIM code: 44010. All NTT network SIM cards are branded 0xABEA.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;8a.&lt;/span&gt;&amp;nbsp; Go to System-&amp;gt;Accounts &amp;amp; Sync and add a NEW GOOGLE ACCOUNT. One that has never been tied to any phone. Create one if you must.&lt;/div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;9.&lt;/span&gt;&amp;nbsp; Copy the URL of the program in the market and go to kaywa.com. Paste it in and generate a QR code.&lt;/div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;10.&lt;/span&gt;&amp;nbsp; Take a picture of the QR code with your barcode scanner. When prompted, pick to use Market to open the link.&lt;/div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;10a.&lt;/span&gt;&amp;nbsp; Immediately click the menu button and change your account to the new Google account you added to your phone.&lt;/div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;11.&lt;/span&gt;&amp;nbsp; Agree to the Market terms and conditions.&lt;/div&gt;&lt;div&gt;&lt;span style="color: #cc0000;"&gt;12.&lt;/span&gt; &amp;nbsp;Congratulations! You can finally install the fucking game!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;NOTE:&amp;nbsp;I was finally able to isolate a strange bug in that your current Google count does not notify Google that it is present on a new device. Apparently, your phone information is only sent to Google when an account is first tied to your phone. If you wish to purchase apps in the market with the account you've added, you will need to use that account to log in. Make sure your Market app is also set to that account so automated downloading can begin.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-3115787497060208738?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/3115787497060208738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=3115787497060208738' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3115787497060208738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3115787497060208738'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/12/how-to-download-region-locked-japanese.html' title='How to Download Region-Locked Japanese Games from Android Market'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-1863679679302761988</id><published>2011-12-22T09:37:00.000-08:00</published><updated>2011-12-23T06:40:58.539-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mechanical'/><category scheme='http://www.blogger.com/atom/ns#' term='das'/><category scheme='http://www.blogger.com/atom/ns#' term='keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='cherry mx blue'/><category scheme='http://www.blogger.com/atom/ns#' term='ultimate'/><category scheme='http://www.blogger.com/atom/ns#' term='microswitch'/><title type='text'>My New Das Keyboard</title><content type='html'>Newegg briefly ran a huge sale on Das mechanical keyboards, so I decided to shell out the money and pick one up. This post will cover my background with keyboards and switches, and then provide some information about the Das.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #cc0000; font-size: large;"&gt;Background&lt;/span&gt;&lt;/b&gt; (feel free to skip it if you don't care)&lt;br /&gt;&lt;br /&gt;I've been a dedicated touch typist for a number of years, though I have fallen out of practice since leaving professional writing as an occupation and have settled into a modest 85-wpm rut. Even so, the specter of repetitive stress injury (RSI) hangs over me and informs my decisions on which keyboards I will and won't use.&lt;br /&gt;&lt;br /&gt;For years, I was drawn to the scissor-switch keyboards, which have a short travel, light resistance and are more common on laptops, rather than the more common "rubber dome" keyboards, which dominate the desktop keyboard market, due to the reduced fatigue on my fingers and wrists. A few years ago, though, I began using my grandfather's original 1989&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Model_M_keyboard"&gt;IBM Model M keyboard&lt;/a&gt;, which features the delightful "buckling spring" mechanical switch, and was instantly won over. Rather than lug it back and forth from home to work every day, I asked my employer to purchase a &lt;a href="http://pckeyboards.stores.yahoo.net/customizer.html"&gt;Unicomp Customizer&lt;/a&gt;, which retails for approximately $80.&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/1/11/Model_M_patent.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://upload.wikimedia.org/wikipedia/commons/1/11/Model_M_patent.png" width="191" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Diagram of a buckling spring switch.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;The Unicomp is a joy to type on and feels identical to the original Model M I use at home. However, both keyboards suffer from 2-key rollover, which means that certain keys conflict with one another when pressed, such that the keyboard will ignore any further keypresses, sometimes with as few as 2 keys pressed. This is no big deal when typing because typists never need to press more than one key at a time (except for modifiers, like shift, of course). However, when playing computer games, rollover (sometimes known as "ghosting") becomes a serious problem, which is what led me to shop around for a gaming-specific keyboard.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #cc0000; font-size: large;"&gt;The Das Keyboard Model S Ultimate&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After poring over &lt;a href="http://www.overclock.net/t/491752/mechanical-keyboard-guide"&gt;Overclock.net's exhaustive mechanical keyboard analysis and review thread&lt;/a&gt;, it seemed to me that there is a segment of the market that could be considered equivalent. These keyboards all use various permutations of the Cherry MX microswitches and provide N-key rollover (i.e., you can press as many keys as you want and they will never conflict with one another) when connected to the computer via PS/2 (via USB, they are all limited to 6-key rollover, which is a limitation of the generic USB keyboard driver, apparently). Out of the many options, I decided to go with the Das since it was on a hefty sale and I had a spare Newegg gift card to make it even cheaper.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fKyTt6LeZq8/TvSMDMk9a7I/AAAAAAAABIw/cAFwEMfoYZ4/s1600/IMG_20111222_211747.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="150" src="http://3.bp.blogspot.com/-fKyTt6LeZq8/TvSMDMk9a7I/AAAAAAAABIw/cAFwEMfoYZ4/s200/IMG_20111222_211747.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Foreshortening makes the Model M&lt;br /&gt;appear larger, but they are roughly&lt;br /&gt;the same size.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Of the Das models available, I had my choice between blue and brown&amp;nbsp;Cherry&amp;nbsp;switches. According to reviews, the blues are tactile (meaning your fingers feel a haptic click when the switch actuates) and clicky, while the browns are tactile and non-clicky. I have grown accustomed to the clickiness of my buckling springs, so the blues were attractive to me.&amp;nbsp;In practice, the clickiness is nice and familiar and the resistance is surprisingly even less than I'm used to from my buckling springs.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DBdIuPyDdzQ/TvSMDoZYCCI/AAAAAAAABI4/9XUkexwlj7Q/s1600/IMG_20111222_211819.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-DBdIuPyDdzQ/TvSMDoZYCCI/AAAAAAAABI4/9XUkexwlj7Q/s200/IMG_20111222_211819.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;This pic shows the difference in pitch.&lt;br /&gt;While the Model M is rounded, the Das&lt;br /&gt;is straight and flat. I don't really notice&lt;br /&gt;the difference during use, though.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;For anyone who is familiar with arcade buttons, the Model M feels like clicky Happ buttons, while non-tactile Cherry blacks would be more like Sanwa buttons (no haptic feedback for when the button actuates). Tactile Cherry MX switches, like the blues and browns, are somewhere in between, probably more like the Seimitsu clickies.&lt;br /&gt;&lt;br /&gt;Though I am a touch-typer, I would have preferred to get labeled keycaps on my Das, but the model with Cherry blues and keycaps wasn't on sale. In the future, I'll probably pick up a handful of colored/labeled keycaps, just to give myself a few more landmarks. Perhaps the letter 'P' and/or the hyphen key, and maybe a Tux keycap for the 'super'/Windows key...&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9q_b_GlsnFM/TvSMDycvHHI/AAAAAAAABJA/1hAOyEDkNqg/s1600/IMG_20111223_080810.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-9q_b_GlsnFM/TvSMDycvHHI/AAAAAAAABJA/1hAOyEDkNqg/s200/IMG_20111223_080810.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;An area smoothed by high traffic on&lt;br /&gt;my Unicomp after barely 1 year of use.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Other aspects of the keyboard are all top-notch. The USB ports on the side provide handy access for plugging in a mouse or thumb drive, though the placement of the ports can interfere with mousing on cramped keyboard trays, like mine (see the bottom-right corner of my pics). The keyboard housing is solid, well-constructed and easy to clean, though the glossy, piano black finish really attracts and holds fingerprints. On the other hand, this type of finish won't develop smooth spots in areas of high traffic like the stippled/matte finishes would, so there's a trade-off.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #cc0000; font-size: large;"&gt;Final Thoughts&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Overall, I'm very pleased with the Das. For typing, I guess I still prefer the buckling springs, but the Das is most definitely satisfactory and still blows away any scissor-switch or rubber dome I've encountered. I would recommend this keyboard to anyone who is interested in a solid gaming keyboard that can do double-duty as a very competent typing keyboard.&lt;br /&gt;&lt;br /&gt;In a typing comparison, I am able to achieve my same 85 wpm on the Das as with the buckling spring keyboards (as measured by TypeRacer), though the lighter actuation pressure on the Das leads me to bottom out on it more often. However, I think this is something that I could get used to over time and could potentially end up increasing my speed somewhat, once I grow accustomed.&lt;br /&gt;&lt;br /&gt;If you would like to learn more and/or are considering taking the plunge on a mechanical keyboard, the aforementioned Overclock.net thread is full of information for potential buyers. To learn more about keyboards in general, &lt;a href="http://en.wikipedia.org/wiki/Keyboard_technology"&gt;the wikipedia has an excellent article covering the various technologies&lt;/a&gt;. If you have any questions about any of the keyboards mentioned in this post, feel free to leave a comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-1863679679302761988?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/1863679679302761988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=1863679679302761988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/1863679679302761988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/1863679679302761988'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/12/my-new-das-keyboard.html' title='My New Das Keyboard'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-fKyTt6LeZq8/TvSMDMk9a7I/AAAAAAAABIw/cAFwEMfoYZ4/s72-c/IMG_20111222_211747.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-3886983392860274375</id><published>2011-12-20T20:15:00.000-08:00</published><updated>2011-12-25T11:25:43.336-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssnes'/><category scheme='http://www.blogger.com/atom/ns#' term='cg'/><category scheme='http://www.blogger.com/atom/ns#' term='nvidia'/><category scheme='http://www.blogger.com/atom/ns#' term='pixel shader'/><title type='text'>Cg Pixel Shaders for SSNES</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QiSh3D8V1xs/TvKkIk26FZI/AAAAAAAABH8/SMesj667OC8/s1600/5xBR.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;In addition to XML/GLSL pixel shaders, SSNES also supports pixel shaders written in Nvidia's proprietary Cg shader language, which is similar in syntax to Microsoft's HLSL language. While Cg hasn't been a very popular language for shaders, historically, many new shaders have been written for use with PS3 homebrew, where Cg is the only supported shader language. In fact, most of these shaders were downloaded from &lt;a href="https://github.com/twinaphex/snes9x-next/tree/master/ps3/pkg/USRDIR/shaders"&gt;TwinAphex's SNES9x Next source code repository&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As with my previous shader posts, these images were captured at a 3x scale factor, then enlarged using nearest neighbor to 400% for the detail shot. Click the thumbnails to embiggen.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #cc0000; font-size: x-large;"&gt;&lt;b&gt;5xBR+CRT&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-3AYPJ9FJRv4/TvKkIwilYQI/AAAAAAAABIE/CRLBJZhYtEk/s1600/5xBR%252BCRT.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/-3AYPJ9FJRv4/TvKkIwilYQI/AAAAAAAABIE/CRLBJZhYtEk/s200/5xBR%252BCRT.png" width="200" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-xMlsg3qBW3Q/TvKkJXY2uSI/AAAAAAAABIM/yO8ny8TaWvE/s1600/5xBR%252BCRT-big.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-xMlsg3qBW3Q/TvKkJXY2uSI/AAAAAAAABIM/yO8ny8TaWvE/s200/5xBR%252BCRT-big.png" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;This shader combines Hyllian's 5xBR algorithm with the phosphor-derived scanline shader from Caligari with great results. This shader is designed for use with square, non-aspect-corrected pixels, so be sure to use an 8:7 aspect ratio on SNES to avoid any nasty artifacting. It also expects at least a 5x scale factor, which looks like this:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-QiSh3D8V1xs/TvKkIk26FZI/AAAAAAAABH8/SMesj667OC8/s1600/5xBR.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="143" src="http://4.bp.blogspot.com/-QiSh3D8V1xs/TvKkIk26FZI/AAAAAAAABH8/SMesj667OC8/s200/5xBR.png" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;Here are a few more pictures from the GBA version of Final Fantasy 6 and Street Fighter 3: Third Strike on FBA:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-_dnMMu4hIIk/TvFfz1_4-TI/AAAAAAAABHw/OEsY1qMOaD0/s1600/1.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5688433148618668338" src="http://3.bp.blogspot.com/-_dnMMu4hIIk/TvFfz1_4-TI/AAAAAAAABHw/OEsY1qMOaD0/s200/1.png" style="cursor: hand; cursor: pointer; height: 139px; width: 200px;" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-MKxWOdQCH_E/TvFfzMgb0iI/AAAAAAAABHo/nZwOUWBo1lU/s1600/2.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5688433137480880674" src="http://3.bp.blogspot.com/-MKxWOdQCH_E/TvFfzMgb0iI/AAAAAAAABHo/nZwOUWBo1lU/s200/2.png" style="cursor: hand; cursor: pointer; height: 139px; width: 200px;" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-jCmgDtEUrI4/TvFfyy7PxQI/AAAAAAAABHY/bWqLPif0OcQ/s1600/3.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5688433130614015234" src="http://2.bp.blogspot.com/-jCmgDtEUrI4/TvFfyy7PxQI/AAAAAAAABHY/bWqLPif0OcQ/s200/3.png" style="cursor: hand; cursor: pointer; height: 113px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;I find the scanlines make text easier to read than with 5xBR alone, for whatever reason.&lt;br /&gt;Download the xBR pack from Hyllian &lt;a href="http://www.multiupload.com/M2SUIU3J6H"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #cc0000; font-size: x-large;"&gt;&lt;b&gt;Retro&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-uJkFZiFMOJg/TvKkJ-n_KII/AAAAAAAABIU/awyniYdHo7k/s1600/retro.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="180" src="http://2.bp.blogspot.com/-uJkFZiFMOJg/TvKkJ-n_KII/AAAAAAAABIU/awyniYdHo7k/s200/retro.png" width="200" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-ockIpdJftto/TvKkKjRgpDI/AAAAAAAABIk/7IRK6FPscEg/s1600/retro-big.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-ockIpdJftto/TvKkKjRgpDI/AAAAAAAABIk/7IRK6FPscEg/s200/retro-big.png" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;This shader accentuates the individual pixels by adding a cool, beveled look along with some color-tweaking mojo to give them a feeling of depth. Again, it expects non-aspect-corrected images, or else subpixel aliasing effects will make a mess of things.&lt;br /&gt;&lt;br /&gt;Here's another picture at 20x (5x scale factor, enlarged 4x with nearest neighbor; see it full size to get the full effect):&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-aWh1ApMXBrg/TvKkKZ1d0VI/AAAAAAAABIc/IU6xHhQEIJA/s1600/retro5x.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="171" src="http://3.bp.blogspot.com/-aWh1ApMXBrg/TvKkKZ1d0VI/AAAAAAAABIc/IU6xHhQEIJA/s200/retro5x.png" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll add more shaders and more pics in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-3886983392860274375?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/3886983392860274375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=3886983392860274375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3886983392860274375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3886983392860274375'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/12/cg-pixel-shaders-for-ssnes.html' title='Cg Pixel Shaders for SSNES'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-3AYPJ9FJRv4/TvKkIwilYQI/AAAAAAAABIE/CRLBJZhYtEk/s72-c/5xBR%252BCRT.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-7023249702989899175</id><published>2011-12-05T13:33:00.000-08:00</published><updated>2011-12-23T07:54:56.142-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='beginner&apos;s guide'/><category scheme='http://www.blogger.com/atom/ns#' term='Cyanogen Mod'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='epic 4G'/><title type='text'>Beginner's Guide to Cyanogen Mod on Epic 4G (Samsung Galaxy S SPH-D700)</title><content type='html'>Based on Sprint's depressingly slow release of Gingerbread OTA (over the air) updates for the Epic 4G (aka Samsung Galaxy S SPH-D700), it looks like this phone will be considered EOL (end of life) in the very near future, despite being barely a year old (that's like, what... 7 years in cell phone time?). It is, therefore, very unlikely that us Epic owners will ever receive an official update to Android 4.0 Ice Cream Sandwich.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, thanks to the open source nature of Android and some extremely clever community members, we can now use the awesome, fast, feature-filled &lt;a href="http://www.cyanogenmod.com/"&gt;Cyanogen Mod&lt;/a&gt; (CM) on our phones. CM7 has only just recently reached 'supported' status on the Epic 4G, while international versions of the phone have had support for some time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Preparation&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To get started, we need to download some tools:&lt;/div&gt;&lt;div&gt;1. &lt;a href="http://www.sdx-downloads.com/devs/noobnl/Odin3epic.rar"&gt;Odin&lt;/a&gt;, which is a Windows-only (boo) utility for flashing firmwares on the Epic 4G. Mac/Linux users can try &lt;a href="http://www.glassechidna.com.au/products/heimdall/"&gt;Heimdall&lt;/a&gt;, but I won't be covering that in this tutorial.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. &lt;a href="http://www.club.cc.cmu.edu/~mkasick/android/kernel-GB-3a.tar.md5"&gt;Samsung's modified official Gingerbread recovery ROM&lt;/a&gt;. This will prep your phone for all of the shenanigans we'll be getting into. It also includes some nice community-provided goodies, like a fix for the keyboard's habit of dropping double-tapped letters.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. &lt;a href="http://drockstar.devphone.org/EpicTools/cwm-5.0.2.7-epic4g.tar.md5"&gt;ClockworkMod&lt;/a&gt;, a special bootloader that now works with the Epic 4G. Once you get this guy installed, you never have to use your computer for this kinda stuff again. You can just flash in new ROMs (like CM updates) directly from your phone's SD card.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. A Cyanogen Mod image optimized for the Epic 4G. &lt;a href="http://www.mediafire.com/?lk94s1dmilqdcci"&gt;This is the one I used&lt;/a&gt;, but there will probably be better/newer ones available by the time you read this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. &lt;a href="http://www.samsung.com/us/support/downloads"&gt;Samsung's USB Phone Drivers&lt;/a&gt;. Without this driver, Odin will fail to see your phone :(&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6. &lt;a href="http://cmw.22aaf3.com/gapps/gapps-gb-20110828-signed.zip"&gt;G-Apps&lt;/a&gt; and Google Talk updates. Google doesn't let CyanogenMod bundle its applications, but you can download them from the &lt;a href="http://wiki.cyanogenmod.com/"&gt;CyanogenMod wiki&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You'll also need a USB-A-to-microUSB cable that is SHORTER than the one that came with your phone. For some strange reason that I won't go into here, the 6-foot cable that is shipped with the phone will &lt;b&gt;almost always&lt;/b&gt; fail the process, leaving you with a semi-bricked phone. Get one &lt;a href="http://www.amazon.com/BlackBerry-Cable-Micro-1-0m-Black/dp/B001QATRCA/ref=sr_1_4?ie=UTF8&amp;amp;qid=1323122738&amp;amp;sr=8-4"&gt;like this&lt;/a&gt; instead.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ok, once you've collected all of your tools, we can get started.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Installation&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Install your USB Phone Driver and unpack your Odin zip file. Inside the resulting folder, you should have your Odin executable (ends in *.exe), Odin3.ini and a *.pit file (mine is victory_8G_100528.pit).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Plug your USB-A-to-microUSB cable into your computer, but not into your phone. Now, power off your phone, slide open your phone's keyboard and hold down the number 1 key and the power button while plugging in the microUSB cable. It should boot into this screen:&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-sc0vp8s7xfA/Tt5h2FtRIYI/AAAAAAAABHI/i5m-tdAiRAQ/s1600/2.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5683087361661018498" src="http://2.bp.blogspot.com/-sc0vp8s7xfA/Tt5h2FtRIYI/AAAAAAAABHI/i5m-tdAiRAQ/s200/2.png" style="cursor: pointer; height: 175px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;3. Now, open Odin. It should look something like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-yjG6dKkSMzo/Tt5h18wSvbI/AAAAAAAABG8/yWiXj3zUpyU/s1600/3.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5683087359257787826" src="http://2.bp.blogspot.com/-yjG6dKkSMzo/Tt5h18wSvbI/AAAAAAAABG8/yWiXj3zUpyU/s200/3.png" style="cursor: pointer; height: 143px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Make sure, under 'Option' on the left, the box next to 'Re-Partition' is NOT checked. Then, on the right, click the button labeled PDA and navigate to your Samsung recovery ROM (#2 in the tools above). Choose it and, back in the main window, click the big button labeled 'Start.'&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some messages should run through the window on the bottom left of the Odin window and, if everything went well, it should end up like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-EsGpqAGaZ6o/Tt5hw1xw_-I/AAAAAAAABGw/wisXEz6bJD0/s1600/4.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5683087271485571042" src="http://4.bp.blogspot.com/-EsGpqAGaZ6o/Tt5hw1xw_-I/AAAAAAAABGw/wisXEz6bJD0/s200/4.png" style="cursor: pointer; height: 143px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;and your phone should reset itself and boot into the Samsung ROM.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. Now, power off your phone again, unplug it from your computer and perform step #2 again to get it back into the recovery state.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. Back in Odin, click the PDA button again, but this time, navigate to the ClockworkMod ROM (#3 from the tools above). Choose it and, back in the main window, click the 'Start' button again. The message window in the bottom-left of the menu should cycle some more messages and, if everything went well, it should say &lt;osm&gt; All threads completed. (succeed 1 / failed 0) and your phone should reset itself again.&lt;/osm&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At this point, we're finished with Odin (forever), so go ahead and close it out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6. From now on, you can flash anything you want directly from your SD card, which is awesome. So, put your phone into USB Mass Storage mode (I had to unplug my USB cable and then reconnect it, then it prompted me as usual) and drag your CyanogenMod ROM (#4 from the tools above) to the root (top level directory) of your SD card and rename it to 'update.zip' (very important).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, on your phone, tap the button labeled "Disconnect storage from PC" to unmount it from your computer and power-off your phone. Once it's completely turned off, power it back on, but when you do, press and hold the power button, the camera button (i.e., the button below the power button) and the 'Volume Down' button on the other side of your phone to enter the ClockworkMod bootloader. It should look something like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-cbcDUBDZ5m8/Tt5hwfBxL6I/AAAAAAAABGk/XvqiZyYXQ-M/s1600/5.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5683087265378676642" src="http://3.bp.blogspot.com/-cbcDUBDZ5m8/Tt5hwfBxL6I/AAAAAAAABGk/XvqiZyYXQ-M/s200/5.png" style="cursor: pointer; height: 130px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Using the volume up/down button to navigate, select 'Apply sdcard:update.zip.' It will ask for confirmation and warn you that it cannot be undone. Confirm your selection and it will begin installation, which should look like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-nvpLoLAQsYk/Tt5hv6L3MqI/AAAAAAAABGY/iNJBXsx0Ybs/s1600/6.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5683087255488901794" src="http://3.bp.blogspot.com/-nvpLoLAQsYk/Tt5hv6L3MqI/AAAAAAAABGY/iNJBXsx0Ybs/s200/6.png" style="cursor: pointer; height: 106px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;When it's all finished, it will put you back in the bootloader, where you can choose 'Reboot system now':&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-Iq1H8E2qsw0/Tt5hvuSzgiI/AAAAAAAABGI/BUIST2tkSp0/s1600/7.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5683087252296794658" src="http://2.bp.blogspot.com/-Iq1H8E2qsw0/Tt5hvuSzgiI/AAAAAAAABGI/BUIST2tkSp0/s200/7.png" style="cursor: pointer; height: 112px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;If everything went well, you should see the CyanogenMod7 boot screen, like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-csyZhNSqq-A/Tt5hvWndahI/AAAAAAAABGA/Fz02iMH2rSA/s1600/8.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5683087245940976146" src="http://3.bp.blogspot.com/-csyZhNSqq-A/Tt5hvWndahI/AAAAAAAABGA/Fz02iMH2rSA/s200/8.png" style="cursor: pointer; height: 102px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Congratulations! Take a deep breath and give yourself a pat on the back. We just have a few more things to add and then we'll be done! You can proceed to step #7.&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;If you just keep seeing the CyanogenMod7 boot screen over and over (like I did), then you've encountered the "&lt;a href="http://wiki.cyanogenmod.com/wiki/Troubleshooting#Bootloop_problem"&gt;bootloop&lt;/a&gt;" error, which is no big deal. Just boot back into your ClockworkMod bootloader, choose 'Mounts and Storage' from the main menu, and then 'mount USB storage' (you may have to unplug/replug the USB cable from your computer if it doesn't recognize it straightaway). Once it mounts on your computer, you can try to redownload your CyanogenMod image, rename it to update.zip and replace it on the root of your SD card. When it's done copying, select 'Unmount,' tap the 'back' button to go back to the bootloader, select 'wipe data/factory reset' and then flash it again to CM.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;7. Once you successfully reach the CM desktop, activate USB Mass Storage mode via the pulldown main menu. Once your SD card mounts on your computer, create a new folder in the root directory (you can call it whatever you want, but I'm going to call it 'updates'). Note: you can also delete your CM image at this point, if you want to free up the space. Put your G-Apps and Google Talk update files into your new directory and boot back into your ClockworkMod bootloader.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you're in the bootloader, choose 'Apply update from zip file on SD card,' then 'choose zip from SD card,' then navigate to your newly created directory ('updates' for me). Choose the G-Apps update first, followed by the Google Talk update (if installed in the wrong order, the Google Talk app included in the G-Apps update will overwrite the preferred standalone Google Talk update). When it finishes, choose 'Reboot' from the bootloader and you should be all set!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Whenever new updates for CyanogenMod are released, simply rename them to 'update.zip' and place them on the root of your SD card, then run the update from ClockworkMod's bootloader.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-7023249702989899175?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/7023249702989899175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=7023249702989899175' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/7023249702989899175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/7023249702989899175'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/12/beginners-guide-to-cyanogen-mod-on-epic.html' title='Beginner&apos;s Guide to Cyanogen Mod on Epic 4G (Samsung Galaxy S SPH-D700)'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-sc0vp8s7xfA/Tt5h2FtRIYI/AAAAAAAABHI/i5m-tdAiRAQ/s72-c/2.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-3697810362722448205</id><published>2011-11-30T09:08:00.000-08:00</published><updated>2011-11-30T09:45:00.671-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subwoofer'/><category scheme='http://www.blogger.com/atom/ns#' term='upgrade'/><category scheme='http://www.blogger.com/atom/ns#' term='audiophile'/><title type='text'>Upgrading My Powered Subwoofer for Hi-Fi</title><content type='html'>I had been supplementing the low end on my ol' hi-fi with a crappy 30-watt powered subwoofer that came with some boxed surround sound set I purchased a number of years ago. It uses an 1/8" jack for input and drives a 4.5" (I think) woofer in a 4th order bandpass enclosure, like this:&lt;div&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/c/c6/Bandpass_enclosure.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/c/c6/Bandpass_enclosure.gif" border="0" alt="" style="cursor: pointer; width: 194px; height: 181px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;However, the sound was pretty lackluster and failed to really produce anything much below 50 Hz, so I decided to kick it up a notch with some spare equipment I had laying around.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The stock woofer was highly inefficient when trying to play low frequencies, and was prone to "chuffing" (the sound air makes when it is quickly pushed out of the port hole) at higher volumes. The subwoofer's amplifier, however, is quiet (no humming, even with the volume cranked) and I like the simplicity of the 1/8" input (fewer wires jumbled up behind my setup), so I decided to bypass the crappy stock speaker and use the amp to drive a more capable bass speaker.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had a spare Electro Voice EVM-15L driver with matching enclosure that I used for playing bass guitar, so I cut a 1/4" patch cable in half to get at the bare signal/ground connections without damaging the existing enclosure (in case I decide to use it for bass guitar again at some point) and disassembled my little subwoofer enclosure.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The subwoofer amplifier stage is mounted on a plate that came off easily after removing 8 little screws. A single wire connected the amplifier to the crappy stock speaker, so I cut that and pushed it to the outside of the enclosure to power my EV 15".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At this point, I could have removed the amplifier plate entirely from the old enclosure and woofer, but I didn't want to have a bunch of bare circuit boards laying around, so I routed the aforementioned cut-wire out through one of the screw holes and then screwed the plate back into place on the enclosure.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, when I connected the now-liberated amplifier to my EV 15", I experienced a lot of clipping, even at low volumes. I suspected that this might be a problem with the impedance of the driver not matching up with that of the stock driver, so I wired a spare 8-ohm resister in series with my EV, which fixed things right up. Now, it sounds great and has much more volume than I could ever want/need (the EV's SPL at lower frequencies is, unsurprisingly, far greater than the stock driver's).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The bass is smooth, punchy and you can feel it in your guts, unlike the piddly, flatulent sounds of the stock configuration. I've heard a lot of audiophiles say that "pro" audio gear is inappropriate for hi-fi use, but my experience demonstrates otherwise. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-3697810362722448205?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/3697810362722448205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=3697810362722448205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3697810362722448205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3697810362722448205'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/11/upgrading-my-powered-subwoofer-for-hi.html' title='Upgrading My Powered Subwoofer for Hi-Fi'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-2166053373372990684</id><published>2011-11-28T16:49:00.000-08:00</published><updated>2011-12-30T08:00:40.234-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux Mint 12'/><category scheme='http://www.blogger.com/atom/ns#' term='x120e'/><category scheme='http://www.blogger.com/atom/ns#' term='lenovo'/><title type='text'>Installing Linux Mint 12 on Lenovo x120e</title><content type='html'>Ubuntu has really been pissing me off lately with the whole GNOME 3 / Unity desktop hokey pokey so I decided to test the waters with some other options. After trying and rejecting some alternate desktop packages within the Ubuntu ecosystem, I decided to try the newly released, Ubuntu-derived Linux Mint 12.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Since my computer (Lenovo ThinkPad x120e) doesn't have an optical drive, I downloaded the Linux Mint 12 CD (64-bit) release image and used Ubuntu's "Create a USB startup disk" utility to write it to my flash drive. However, when I tried to boot from it, it kept failing at the bootloader with an error that I can't quite remember (I'll try to reproduce the problem, for search indexing's sake).&lt;br /&gt;&lt;br /&gt;I installed the unetbootin package, though, and it created a working drive on the first try. Once I booted into the Mint live system, installation proceeded smoothly and identically to a normal Ubuntu install.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;First Impressions&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Upon rebooting into my shiny new installation, the restricted driver manager popped up and acknowledged my Broadcom wireless card and Radeon graphics. The wireless drivers never kicked in, though, and the graphics displayed text wrong in the panels and menus (some letters and words were a scrambled, garbled mess).&lt;br /&gt;&lt;br /&gt;The lack of wireless *and* a proper graphics driver was a definite deal-breaker for me, so that's where my first experience ended. I hope to give it another shot soon, so I'll update this post if I have any better luck.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;UPDATE (12/05/11)&lt;/b&gt;: I switched over to Linux Mint Debian, which is a rolling-release version based on Debian Testing. Again, installation was successful and fast. Debian doesn't have some of Ubuntu's noob-friendly utilities, such as the 'Additional Drivers' (&lt;span class="Apple-style-span"&gt;jockey&lt;/span&gt;) utility, so you'll have to manually install the &lt;span class="Apple-style-span"&gt;fglrx-driver&lt;/span&gt; package and then configure your &lt;span class="Apple-style-span"&gt;/etc/X11/xorg.conf&lt;/span&gt; file to get accelerated graphics.&amp;nbsp;There is an automated tool, aticonfig, that you can use to configure your xorg.conf. The following command will install the fglrx driver and the helper libraries to get accelerated video decoding, then invoke the aticonfig command to automatically configure your xorg to use the new driver (Thanks Erik!):&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-size: 13px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;sudo apt-get install libva1 libva-x11-1 libva-tpi1 libva-glx1 libva-dev xvba-va-driver fglrx-atieventsd fglrx-control fglrx-driver fglrx-glx fglrx-glx-ia32 fglrx-modules-dkms&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Thankfully, Mint Debian had none of the aforementioned weird rendering issues with the proprietary driver, and Compiz worked just fine (I installed the fusion-icon package so I could turn it on and off more easily).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE (12/30/11):&lt;/b&gt;&amp;nbsp;Erik notes:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;I went back to the open source drivers....&lt;br /&gt;They seem to work much better for watching flash movies. For Youtube I use the FVR Flashvideoreplacer addon. The other websites are better with the open source drivers then with fglrx.&lt;/blockquote&gt;&lt;div&gt;So, if you watch a lot of Flash video (youtube, Hulu, etc.), you might be better off sticking with the default, open source drivers, buy YMMV, so be sure to try both.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have not yet been able to get my Broadcom wireless working, but I'll try to update this post if/when I get it figured out. If you are fortunate enough to have chosen the other wireless chipset, you should be fine out-of-the-box.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-2166053373372990684?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/2166053373372990684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=2166053373372990684' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/2166053373372990684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/2166053373372990684'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/11/installing-linux-mint-12-on-lenovo.html' title='Installing Linux Mint 12 on Lenovo x120e'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-3338474864631502678</id><published>2011-11-19T18:05:00.000-08:00</published><updated>2011-11-22T09:52:13.322-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssnes'/><category scheme='http://www.blogger.com/atom/ns#' term='SNES emulator'/><title type='text'>Advanced SSNES Configuration Options</title><content type='html'>&lt;div&gt;This guide picks up from where &lt;a href="http://filthypants.blogspot.com/2011/11/getting-started-with-ssnes.html"&gt;the basic guide&lt;/a&gt; left off, so if you haven't read it yet, you should.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the main window, you can choose whether to save a &lt;font color=#ff0000&gt;&lt;b&gt;BSV movie,&lt;/b&gt;&lt;/font&gt; which is basically a small file that logs all of your keypresses when you play. You can later take this file and replay it back like a sort of movie. This can be used to share your gameplay with others without the necessity of passing around gigantic files.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below that, we have &lt;font color=#ff0000&gt;&lt;b&gt;FFmpeg movie output,&lt;/b&gt;&lt;/font&gt; which allows you to dump actual video files using state-of-the-art, lossless RGB x264 with FLAC audio. The files can be quite large, but are appropriate for high-quality recording for things like speed runs. Currently, only *.mkv files are supported, so if you want to use this feature, make sure your file name ends in mkv. This feature can be used in conjunction with BSV playback to simplify recording speed runs, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font size=+2&gt;General&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At the top of the main window, you'll see a menu labeled &lt;font color=#ff0000&gt;&lt;b&gt;Settings&lt;/b&gt;&lt;/font&gt;. From there, click on &lt;font color=#ff0000&gt;&lt;b&gt;General&lt;/b&gt;&lt;/font&gt;, and it should open a window that looks like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-J4q5W3Yxs9Y/TshhKnqLhlI/AAAAAAAABEI/3PI6zQ-2iDc/s1600/7.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-J4q5W3Yxs9Y/TshhKnqLhlI/AAAAAAAABEI/3PI6zQ-2iDc/s200/7.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676894165372995154" style="cursor: pointer; width: 200px; height: 138px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;The first entry, &lt;font color=#ff0000&gt;&lt;b&gt;Enable rewind&lt;/b&gt;&lt;/font&gt;, is what toggles on the ability to use real-time rewind, similar to what you find in the popular indie game Braid.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next few options are for special use cases and can generally be ignored (the defaults are usually fine).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next option I want to point out is &lt;font color=#ff0000&gt;&lt;b&gt;Records filtered output&lt;/b&gt;&lt;/font&gt;, which will make the aforementioned mkv video dumps capture the image *after* filters/shaders are applied, so your video will look as fancy as what you see on your screen. Below that, you have fields to load XML cheat databases, such as those used in bsnes, and below that you have some entries to specify paths for various additional files, such as save data and screenshots, that SSNES creates. If left blank, these will default to the folder the ROM is loaded from.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font size=+2&gt;Video&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-juQQQmedqwI/Tshh2YutTJI/AAAAAAAABE8/zjVBqLlaxw0/s1600/8.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-juQQQmedqwI/Tshh2YutTJI/AAAAAAAABE8/zjVBqLlaxw0/s200/8.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676894917279698066" style="cursor: pointer; width: 200px; height: 144px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;From here, you can choose your desired video driver. For most people, OpenGL (the default), will be fine and I will assume that's the one you'll use for the remainder of this tutorial. However, if OpenGL doesn't work for you, you can choose the slow and crappy (but reliable) SDL driver, or the D3D driver (not available in Linux, of course).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Windowed X and Y scale&lt;/b&gt;&lt;/font&gt; let you set custom sizes for the emulator window, while &lt;font color=#ff0000&gt;&lt;b&gt;Fullscreen X and Y resolutions&lt;/b&gt;&lt;/font&gt; let you set custom resolutions in fullscreen (leaving it at 0 will attempt to scale the window as large as possible).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Checking &lt;font color=#ff0000&gt;&lt;b&gt;VSync&lt;/b&gt;&lt;/font&gt; will cap your framerate to your monitor's refresh rate (a good thing, or else the emulator will run as fast as it can...).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Start in fullscreen&lt;/b&gt;&lt;/font&gt; is self-explanatory, and you probably want to leave &lt;font color=#ff0000&gt;&lt;b&gt;Force 16-bit color&lt;/b&gt;&lt;/font&gt; turned off.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Disable composition (Win Vista/7)&lt;/b&gt;&lt;/font&gt; will automatically turn off Aero transparency, which can conflict with VSync in windowed mode (makes video stuttery), but doesn't affect fullscreen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Bilinear filtering&lt;/b&gt;&lt;/font&gt; will add a slight blur to the image to take the edge off of the hard pixel edges (also known as &lt;font color=#ff0000&gt;&lt;b&gt;smooth video&lt;/b&gt;&lt;/font&gt; in some emulators). This option has very little impact on performance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Lock aspect ratio&lt;/b&gt;&lt;/font&gt; will ensure that the image is always a given aspect ratio (default is 8:7, assuming square pixels). You can also enter a custom aspect ratio (in decimal format, such as 1.333333 for 4:3 assuming non-square pixels) in the window next to the &lt;font color=#ff0000&gt;&lt;b&gt;Aspect ratio&lt;/b&gt;&lt;/font&gt; entry farther down.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Crop overscan&lt;/b&gt;&lt;/font&gt; cuts off a few pixels around the edges of the image that were customarily left blank by developers and sometimes contain garbage pixels.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below that, we have &lt;font color=#ff0000&gt;&lt;b&gt;Shader/filter settings&lt;/b&gt;&lt;/font&gt;, which opens the advanced shader and filter settings window, and at the bottom we have &lt;font color=#ff0000&gt;&lt;b&gt;Font settings&lt;/b&gt;&lt;/font&gt; which opens the advanced preferences for the onscreen text display.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font size=+2&gt;Shader and Filter Settings&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is where SSNES gets its bling:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-OtWxqSc1gE8/Tshh2DCBNaI/AAAAAAAABE0/JjFKiizlP_Y/s1600/9.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-OtWxqSc1gE8/Tshh2DCBNaI/AAAAAAAABE0/JjFKiizlP_Y/s200/9.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676894911455114658" style="cursor: pointer; width: 200px; height: 90px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;The first entry, &lt;font color=#ff0000&gt;&lt;b&gt;Cg pixel shader&lt;/b&gt;&lt;/font&gt;, allows you to load pixel shaders in Nvidia's Cg format. Below that, you can load bSNES XML shaders (deprecated in bsnes with v083, but SSNES still supports them). The Cg shader format works with both OpenGL and D3D drivers, which is nice, but the selection is more limited than with the more common bSNES XML shaders.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;font color=#ff0000&gt;&lt;b&gt;XML shader directory&lt;/b&gt;&lt;/font&gt; option allows you to select a folder that contains XML shaders that will be loaded in sequence when you press the assigned hotkey.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Checking the box by &lt;font color=#ff0000&gt;&lt;b&gt;Render-to-texture (2-pass rendering)&lt;/b&gt;&lt;/font&gt; allows you to "stack" an additional XML pixel shader for additional effects. If you enable this, the &lt;font color=#ff0000&gt;&lt;b&gt;FBO X and Y Scale&lt;/b&gt;&lt;/font&gt; fields allow you to specify a scale factor for the first-pass pixel shader. This often doesn't make a huge difference, but it can help with certain shaders that are intended to be calculated at a specific scale, such as HQ2x. &lt;font color=#ff0000&gt;&lt;b&gt;Bilinear filtering (2. pass)&lt;/b&gt;&lt;/font&gt; applies the same slight blurring as before, but this setting ensures that you have fine control over how much blurring occurs and when. Finally, the &lt;font color=#ff0000&gt;&lt;b&gt;Shader (2. pass)&lt;/b&gt;&lt;/font&gt; field is where you select the desired shader for the second pass.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The last field, &lt;font color=#ff0000&gt;&lt;b&gt;bSNES video filter&lt;/b&gt;&lt;/font&gt;, allows you to apply CPU-powered filter libraries from bsnes (like XML shaders, they were deprecated in bsnes as of v083, but SSNES still supports them), such as blargg's kickass NTSC filter.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can download a number of Cg shaders from &lt;a href="https://github.com/Themaister/Emulator-Shader-Pack/tree/master/Cg"&gt;Themaister's Github repo&lt;/a&gt;, while XML shaders can be downloaded from &lt;a href="https://gitorious.org/bsnes/xml-shaders/trees/master/shaders"&gt;Screwtape's XML shader repo&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://filthypants.blogspot.com/2011/05/more-emulator-pixel-shaders-crt-updated.html"&gt;This page&lt;/a&gt; has preview pics for most of the XML shaders and a link to &lt;a href="http://themaister.net/xmlview/index.html"&gt;Themaister's WebGL shader testing applet&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can download bsnes video filters for Windows &lt;a href="http://www.mediafire.com/?356uu02o7oxw0u1"&gt;here (32-bit)&lt;/a&gt; and &lt;a href="http://www.mediafire.com/?62p83g46s95v44r"&gt;here (64-bit)&lt;/a&gt; and for Linux &lt;a href="http://www.mediafire.com/download.php?bqnp2etqkq3fkz1"&gt;here (32-bit)&lt;/a&gt; and &lt;a href="http://www.mediafire.com/download.php?01747etfqs8tt6g"&gt;here(64-bit)&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font size=+2&gt;Font Settings&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-klWf4uThy-0/Tshh1_rgGmI/AAAAAAAABEs/FsFHqkVt5fo/s1600/10.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-klWf4uThy-0/Tshh1_rgGmI/AAAAAAAABEs/FsFHqkVt5fo/s200/10.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676894910555363938" style="cursor: pointer; width: 200px; height: 68px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;With the &lt;font color=#ff0000&gt;&lt;b&gt;On-screen message font&lt;/b&gt;&lt;/font&gt; entry, you can load a custom Truetype Font for SSNES to display onscreen, while &lt;font color=#ff0000&gt;&lt;b&gt;On-screen font size&lt;/b&gt;&lt;/font&gt; specifies the font size in points.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Enable on-screen messages&lt;/b&gt;&lt;/font&gt; is pretty self-explanatory. Uncheck to disable onscreen messages from SSNES.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;On-screen message pos&lt;/b&gt;&lt;/font&gt; lets you specify custom X and Y axis positions for onscreen text, and &lt;font color=#ff0000&gt;&lt;b&gt;Message color (RGB hex)&lt;/b&gt;&lt;/font&gt; determines the the color of the text in hex format. You can use an &lt;a href="http://www.colorpicker.com"&gt;online color picker like this one&lt;/a&gt; to get your desired color in the proper format.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font size=+2&gt;Audio&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-qPCDXDlSHXo/Tshh1v2B_vI/AAAAAAAABEc/6fU5xoPoCPA/s1600/11.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-qPCDXDlSHXo/Tshh1v2B_vI/AAAAAAAABEc/6fU5xoPoCPA/s200/11.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676894906304560882" style="cursor: pointer; width: 200px; height: 102px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first option is self-explanatory. Uncheck it to completely disable audio.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Audio driver&lt;/b&gt;&lt;/font&gt; is also pretty straightforward. DirectSound is usually the most compatible in Windows, but XAudio2 has lower latency and is often less buggy. In Linux, ALSA is what I use, but many speak highly of OSS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With the &lt;font color=#ff0000&gt;&lt;b&gt;External audio driver&lt;/b&gt;&lt;/font&gt; option, you can choose a custom driver that conforms to the SSNES plugin API, but the only one available at the time of this writing is Themaister's experimental WASAPI driver. Below that, you can specify an &lt;font color=#ff0000&gt;&lt;b&gt;Audio DSP plugin,&lt;/b&gt;&lt;/font&gt; which can potentially provide reverb and echo effects, etc. &lt;a href="https://github.com/Themaister/SNES-DSP-plugins"&gt;Mudlord has written a few of these&lt;/a&gt;, which even come with a fancy Qt GUI.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Audio sample rate&lt;/b&gt;&lt;/font&gt; should be set to match your computer's sound card output rate, which is usually the default 48 kHz.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Audio input rate&lt;/b&gt;&lt;/font&gt; can be confusing at first but is awesome once you get it set up (like SSNES itself :P). Basically, as the emulator chugs away, it creates video frames at a rate of 60 per second and audio at an ideal rate of 32,040 samples per second. However, modern LCD monitors rarely have a true 60 Hz refresh rate, so, when displayed with VSync enabled on such a display, the audio and video will get faintly out of sync and cause either a video frame to drop (manifested as a stutter in the video) or a crackle in the audio. The default value of 31,980 is a closer match to modern display refresh rates than the ideal rate, but you can nudge it higher--if your video still drops frames occasionally--or even lower if your audio continues to crackle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Audio rate step&lt;/b&gt;&lt;/font&gt; specifies the granularity at which the audio rate increases or decreases when you press the corresponding hotkeys.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dunno what &lt;font color=#ff0000&gt;&lt;b&gt;Audio device&lt;/b&gt;&lt;/font&gt; does.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Audio sync&lt;/b&gt;&lt;/font&gt; is similar to VSync in that it keeps the framerate in synchronization with the audio. Keep it checked for best results.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Audio latency (ms)&lt;/b&gt;&lt;/font&gt; is pretty self-explanatory. The default value is usually fine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font size=+2&gt;Input Settings&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-DCqO_CgntWk/Tshh1qP6eyI/AAAAAAAABEU/JE108jwQ0go/s1600/12.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-DCqO_CgntWk/Tshh1qP6eyI/AAAAAAAABEU/JE108jwQ0go/s200/12.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676894904802507554" style="cursor: pointer; width: 164px; height: 200px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;The &lt;font color=#ff0000&gt;&lt;b&gt;Input settings&lt;/b&gt;&lt;/font&gt; window is where you can assign buttons and/or keys.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The slider at the top, labeled &lt;font color=#ff0000&gt;&lt;b&gt;Input axis threshold&lt;/b&gt;&lt;/font&gt;, determines at which point an analog control will register as a digital button-press.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below that, you can choose whether or not to use Player 1 button/key assignments during netplay regardless of whether you're hosting the game or connecting to someone else.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The pulldown menu below that lists the categories of keys you can assign, including all of the available controller slots from Player 1 to Player 5 and the miscellaneous SSNES functions, like rewind. You can bind any of these functions by double-clicking on its entry and then pressing the appropriate key when prompted.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Last, the &lt;font color=#ff0000&gt;&lt;b&gt;Detect analog&lt;/b&gt;&lt;/font&gt; checkbox determines whether analog inputs are even polled.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font size=+2&gt;Netplay&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Netplay is one of SSNES' crown jewels and can be enabled via the main SSNES-Phoenix window. We'll cover its configuration first and then go over some of the quirks you should be aware of.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you check the box to enable netplay, you must specify whether you will be hosting (server) or joining (client) the game. If joining, you must also enter the host's IP address in the field below. Make sure your firewall is open on port 55435 (default; you can change it if you like) and that the port is forwarded in your router, if applicable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=#ff0000&gt;&lt;b&gt;Delay frames&lt;/b&gt;&lt;/font&gt; denotes the maximum number of frames SSNES will need to emulate at once to maintain synchonization due to actual network latency. You can figure out an appropriate ballpark for this number by pinging the other player and dividing the time (in milliseconds) by 16 (roughly the number of milliseconds in a frame from a game running at 60 fps). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Similar to the GGPO platform, SSNES creates a constant stream of savestates which, along with button presses, are exchanged and compared between the server and client machines. If the savestates start to diverge, the game rolls back in time to a point where they both agree and then emulates the missing frames all at once to get back to the appropriate spot. This gives the illusion of completely lagless inputs, which is invaluable for twitchy, fine controls, such as parrying in Street Fighter III: Third Strike.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The downside to this method is that sound is almost always crackly and it can sometimes create odd time-rollback isues (hard to explain, but you'll know them when you see them ;P). It also produces occasonal spikes in CPU utilization as the emulator needs to emulate a series of frames all at once to catch up after a rollback.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If the gameplay is a bit choppy, try increasing the number of delay frames a bit. If you try to connect to a server and it immediately says &lt;font color=#ff0000&gt;&lt;b&gt;client disconnected&lt;/b&gt;&lt;/font&gt;, open your log and make sure your ROMs match exactly (it will complain about a hash mismatch otherwise). If it gives you a weird time-out error, just close the window and try to connect again and it should work itself out (sometimes excessive spikes in network latency can cause the states to diverge catastrophically, resulting in this error).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-3338474864631502678?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/3338474864631502678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=3338474864631502678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3338474864631502678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3338474864631502678'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/11/advanced-ssnes-configuration-options.html' title='Advanced SSNES Configuration Options'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-J4q5W3Yxs9Y/TshhKnqLhlI/AAAAAAAABEI/3PI6zQ-2iDc/s72-c/7.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-3564067930432664810</id><published>2011-11-19T15:13:00.000-08:00</published><updated>2011-12-04T17:23:46.510-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='beginner&apos;s guide'/><category scheme='http://www.blogger.com/atom/ns#' term='ssnes'/><category scheme='http://www.blogger.com/atom/ns#' term='SNES emulator'/><title type='text'>Getting Started with SSNES</title><content type='html'>&lt;div&gt;SSNES is a multi-platform multi-emulator with support for some really cool, unique features, including extensive shader and filter support, real-time rewind, lossless video dumping, advanced "lagless" netplay, and more. Unlike many other emulators, SSNES is under rapid and active development and receives new features on a regular basis. However, all of these esoteric options and capabilities can be daunting to new users, so this guide will cover the basics. The instructions are primarily geared toward Windows users, but the configuration information is essentially the same on any platform.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, first off: SSNES is all about modularity, so we need to download a couple of initial modules, namely the SSNES executable and its helper libraries. To get started, go to the &lt;a href="http://themaister.net/ssnes.html"&gt;SSNES homepage&lt;/a&gt; and download the SSNES &lt;b&gt;&lt;font color=#ff0000&gt;full&lt;/font&gt;&lt;/b&gt; package that suits your system (the 'x86' build will work on all machines, while the x64 build will only work in 64-bit versions of Windows; get the x86 version if you don't know which is appropriate for you). The &lt;b&gt;&lt;font color=#ff0000&gt;slim&lt;/font&gt; &lt;/b&gt;package contains the absolute minimum required for bare, no-frills emulation, while the &lt;font color=#ff0000&gt;&lt;b&gt;full&lt;/b&gt;&lt;/font&gt; package is prepared to utilize SSNES' many advanced features.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once your download finishes, extract the zip file, navigate to the extracted SSNES folder and look for &lt;b&gt;&lt;font color=#ff0000&gt;ssnes-phoenix.exe&lt;/font&gt;&lt;/b&gt;. This is the graphical user interface (GUI) module that will help us get SSNES set up and configured. Double-click it and you should see a window that looks like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-dzQA-pZQNLU/TshADg_aOFI/AAAAAAAABDw/0LHKE-txyZw/s1600/1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-dzQA-pZQNLU/TshADg_aOFI/AAAAAAAABDw/0LHKE-txyZw/s200/1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676857759440189522" style="cursor: pointer; width: 200px; height: 106px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Along the upper edge of the window, open the &lt;font color=#ff0000&gt;&lt;b&gt;SSNES&lt;/font&gt;&lt;/b&gt; menu and select &lt;b&gt;&lt;font color=#ff0000&gt;Update SSNES&lt;/font&gt;&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-T5pGen2svgI/TshADWSP_OI/AAAAAAAABDo/GtGNH3J_fxE/s1600/2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-T5pGen2svgI/TshADWSP_OI/AAAAAAAABDo/GtGNH3J_fxE/s200/2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676857756566420706" style="cursor: pointer; width: 200px; height: 106px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt; It should open a window that looks like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-LkJI6qLeabA/TshADJIxqwI/AAAAAAAABDY/d43BnxL_br4/s1600/3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-LkJI6qLeabA/TshADJIxqwI/AAAAAAAABDY/d43BnxL_br4/s200/3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676857753037024002" style="cursor: pointer; width: 200px; height: 153px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;You can use this tool to automatically download updates for SSNES, its helper libraries and any/all of the various emulation cores. First off, you'll need to select which flavor of SSNES you're using--x86 or x64 (aka x86_64)--by clicking on the appropriate bubble next to &lt;b&gt;&lt;font color=#ff0000&gt;CPU&lt;/font&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-lrytOZgr6Ww/TshAC1jaeXI/AAAAAAAABDQ/IngMTb0ISHM/s1600/4.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-lrytOZgr6Ww/TshAC1jaeXI/AAAAAAAABDQ/IngMTb0ISHM/s200/4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676857747780041074" style="cursor: pointer; width: 200px; height: 153px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Then, click on the button labeled &lt;b&gt;&lt;font color=#ff0000&gt;Check version&lt;/font&gt;&lt;/b&gt;. This will search for updates to SSNES and/or its helper libraries and populate the list of available emulation cores:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-oMXp06cZ7c8/TshACvm2kRI/AAAAAAAABDA/j4pDC8WQU0o/s1600/5.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-oMXp06cZ7c8/TshACvm2kRI/AAAAAAAABDA/j4pDC8WQU0o/s200/5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676857746183852306" style="cursor: pointer; width: 200px; height: 153px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;After that, click on the bubble labeled &lt;font color=#ff0000&gt;&lt;b&gt;Redist&lt;/b&gt; &lt;/font&gt;and then the button that says &lt;b&gt;&lt;font color=#ff0000&gt;Download SSNES&lt;/font&gt;&lt;/b&gt;. This will fetch any updated SSNES executables, as well as fresh copies of all of the helper libraries (you can update SSNES without the helper libraries by using the &lt;font color=#ff0000&gt;&lt;b&gt;Full&lt;/b&gt; &lt;/font&gt;button instead of &lt;b&gt;&lt;font color=#ff0000&gt;Redist&lt;/font&gt;&lt;/b&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At this point, you can also automatically download any of the cores in the list by double-clicking on its entry. After the download finishes, it will ask if you want to use the core. Whether you do or not is okay, as we'll be specifying our desired core in just a few seconds anyway.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you're done downloading cores (you can come back to this menu and download more cores at any time), close the &lt;b&gt;&lt;font color=#ff0000&gt;Updater&lt;/font&gt; &lt;/b&gt;window and return to the main window, where we'll need to configure some options.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Starting from the top, the &lt;b&gt;&lt;font color=#ff0000&gt;Normal ROM path&lt;/font&gt;&lt;/b&gt; is where you select the ROM you want to play. It will not hide inappropriate files, so make sure you pick the right one for the system you wish to emulate ;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next, we need to tell SSNES where to store and load its settings, via the &lt;b&gt;&lt;font color=#ff0000&gt;SSNES config file &lt;/font&gt;&lt;/b&gt;path. Click &lt;b&gt;&lt;font color=#ff0000&gt;Open&lt;/font&gt;&lt;/b&gt;, and then navigate to your SSNES folder and choose the file named &lt;b&gt;&lt;font color=#ff0000&gt;ssnes.cfg&lt;/font&gt;&lt;/b&gt;. Likewise, for &lt;b&gt;&lt;font color=#ff0000&gt;SSNES path&lt;/font&gt;&lt;/b&gt;, click &lt;b&gt;&lt;font color=#ff0000&gt;Open&lt;/font&gt;&lt;/b&gt;, navigate to the same folder and select &lt;b&gt;&lt;font color=#ff0000&gt;ssnes.exe&lt;/font&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-jTSjIv3MS8g/TshAquveCKI/AAAAAAAABD8/gZFSzdE87_4/s1600/6.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-jTSjIv3MS8g/TshAquveCKI/AAAAAAAABD8/gZFSzdE87_4/s200/6.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676858433146325154" style="cursor: pointer; width: 200px; height: 122px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Finally, the &lt;b&gt;&lt;font color=#ff0000&gt;Emulator core path&lt;/font&gt;&lt;/b&gt; lets us select which emulation core we wish to use. So, click &lt;b&gt;&lt;font color=#ff0000&gt;Open&lt;/font&gt;&lt;/b&gt;, navigate to the SSNES folder and look for your desired core that you downloaded from the &lt;b&gt;&lt;font color=#ff0000&gt;Updater&lt;/font&gt;&lt;/b&gt;, such as gambatte-0.5wip1-x86_64.dll in my case. SSNES can be paired with any emulator core that conforms to the &lt;font color=#ff0000&gt;&lt;b&gt;libsnes&lt;/b&gt; &lt;/font&gt;API specification, including but not limited to the original libsnes derived from byuu's bsnes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At this point, simple emulation should be functional, so go ahead and try it by clicking on the big button labeled &lt;b&gt;&lt;font color=#ff0000&gt;Start SSNES&lt;/font&gt;&lt;/b&gt;. If it works, congratulations! You're ready to play. Check out the &lt;a href="http://filthypants.blogspot.com/2011/11/advanced-ssnes-configuration-options.html"&gt;advanced configuration options&lt;/a&gt; to learn about filters/shaders, netplay, rewind support and more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If it doesn't work, click on the &lt;font color=#ff0000&gt;&lt;b&gt;File&lt;/b&gt; &lt;/font&gt;menu at the top of the window and select &lt;b&gt;&lt;font color=#ff0000&gt;Show log&lt;/font&gt;&lt;/b&gt;. This will give you some information on why it failed. If you seek help at the SSNES forums or in the SSNES IRC channel, be sure to have this information handy, as it will help others solve your problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;If you would like to explore some of SSNES' more advanced features, &lt;a href="http://filthypants.blogspot.com/2011/11/advanced-ssnes-configuration-options.html"&gt;check out this guide.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;font size=+2&gt;&lt;font color=#ff0000&gt;For Linux Users&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you're using a Debian-based distro, such as Ubuntu or Mint, you can use my PPA repo, where I package a number of emulators, including SSNES and all flavors of libsnes. To install SSNES, open Synaptic Package Manager and add &lt;a href="https://launchpad.net/~hunter-kaller/+archive/ppa/+packages"&gt;&lt;b&gt;&lt;font color=#ff0000&gt;ppa:hunter-kaller/ppa&lt;/font&gt;&lt;/b&gt;&lt;/a&gt; to your software sources. You can then install any of the packages through your normal installation procedure of choice.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Otherwise, configuration is just like in Windows, except your &lt;b&gt;&lt;font color=#ff0000&gt;ssnes.cfg&lt;/font&gt;&lt;/b&gt; file is initially installed to /etc/ssnes.cfg (but can then be copied to and overridden by any ssnes.cfg file located in ~/.config/ssnes/) and the emulation cores install to /usr/lib/.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-3564067930432664810?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/3564067930432664810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=3564067930432664810' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3564067930432664810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3564067930432664810'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/11/getting-started-with-ssnes.html' title='Getting Started with SSNES'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-dzQA-pZQNLU/TshADg_aOFI/AAAAAAAABDw/0LHKE-txyZw/s72-c/1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-172699847057508403</id><published>2011-10-05T12:58:00.000-07:00</published><updated>2011-10-06T06:33:38.449-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ambient occlusion'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>Using sloth86's Ambient Occlusion Tools in SF4</title><content type='html'>In the course of making skins for SF4, you might have toggled off an unwanted model, such as Chun Li's spiked bracelets, only to find an unsightly darkening, similar to a shadow, where the object used to be. This darkening is part of what's known as an "ambient occlusion (AO) map," which is used by the game to fake some self-shadowing by the models and thus reduce the amount of shadows your computer needs to draw dynamically to look realistic. However, once the offending model is gone, the AO isn't really appropriate anymore, so we need to do something about it.&lt;br /&gt;&lt;br /&gt;For this tutorial, you'll need to download some of sloth86's tools: &lt;a href="http://www.mediafire.com/?9h6gf40mslx5nbq"&gt;AOExtractor&lt;/a&gt;, &lt;a href="http://www.mediafire.com/?53v92w430d6jwd8"&gt;AOInject&lt;/a&gt;&amp;nbsp;and &lt;a href="http://www.mediafire.com/?6b4w4tt22e14j3y"&gt;EMG Swapper&lt;/a&gt;, as well as &lt;a href="http://sf4viewer.sourceforge.net/"&gt;piecemontee's Asset Explorer (aka, SF4Viewer)&lt;/a&gt;. You'll also need a paint program that can view/edit EPS files, such as Photoshop.&lt;br /&gt;&lt;br /&gt;Once you have your tools, open your desired costume file (*.obj.emo) in the Asset Explorer. I'm going to be using Chun Li's default costume (CNL_01.obj.emo):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-odvlwTbepiE/ToyvbANo6RI/AAAAAAAABB4/2F07Gw1_a38/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="206" src="http://3.bp.blogspot.com/-odvlwTbepiE/ToyvbANo6RI/AAAAAAAABB4/2F07Gw1_a38/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As you can see in the picture above, I've already toggled off her 'Ring' model, which has left the visible AO darkening on her 'Skin_arm' model, which I intend to fix.&lt;br /&gt;&lt;br /&gt;So, next we'll want to select that darkened model, right-click and choose 'raw dump' to get the raw EMG model. Name it something informative with the .emg file extension and click 'save.'&lt;br /&gt;&lt;br /&gt;While we're here, take note of which EMG model we're extracting, counting from the top. For me, it's the 10th one. We'll need this information later, so write it down or something.&lt;br /&gt;&lt;br /&gt;Next, open the AOExtract tool. You should see a window like this pop up:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-xYxJH330mfU/ToywQrjEPlI/AAAAAAAABB8/aeqpMx0mHr0/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="95" src="http://3.bp.blogspot.com/-xYxJH330mfU/ToywQrjEPlI/AAAAAAAABB8/aeqpMx0mHr0/s200/2.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the first field, put in whatever you just saved your dumped model as. In my case, 'skin_arm.emg.'&amp;nbsp;The other options can be left at the default values, unless you just feel like changing them. (Subdividing triangles will make your EPS file look a little nicer, but it takes longer and is unnecessary)&lt;br /&gt;&lt;br /&gt;Click 'Extract' and you should end up with a new file, in my case 'new.eps.'&lt;br /&gt;&lt;br /&gt;Open your new EPS file in Photoshop and you should see something like this:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-kGlNKllBwho/To2t8lRtjEI/AAAAAAAABCU/BrlNil23OTc/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-kGlNKllBwho/To2t8lRtjEI/AAAAAAAABCU/BrlNil23OTc/s200/1.png" width="193" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Those triangles you see correspond to the triangles used to make the model (just like the UV map, if you're familiar with those). As you can see, some of them are particularly dark, while others are lighter, just like we saw in the Asset Explorer window.&lt;br /&gt;&lt;br /&gt;So, using the dropper tool, pick a medium color (we don't want a dark shadow, but we don't want it all bright like a highlight, either). If you're familiar with using hex color values, EFEFEF is a pretty good, generic match.&lt;br /&gt;&lt;br /&gt;Once you have your color, you can either use the paint bucket tool to change each triangle by hand, or you can just paint over the whole thing, like I did.&lt;br /&gt;&lt;br /&gt;Once you're all finished, we need to 'Save As...' and choose the bitmap (BMP) format, with OS/2 compatibility, 24-bit and no compression.&lt;br /&gt;&lt;br /&gt;Next, open the AOInject tool. You should see a window like this:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--0ZQ-5n1_Pc/ToyzzHgk0rI/AAAAAAAABCE/-LG0Mdv0EfA/s1600/6.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="95" src="http://2.bp.blogspot.com/--0ZQ-5n1_Pc/ToyzzHgk0rI/AAAAAAAABCE/-LG0Mdv0EfA/s200/6.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the first&amp;nbsp;field, enter the name of your dumped EMG model, in my case, skin_arm.emg. In the second&amp;nbsp;field&amp;nbsp; enter the name of our modified, blank AO map, in .bmp format. The third&amp;nbsp;field&amp;nbsp;can keep its default value.&lt;br /&gt;&lt;br /&gt;Click 'Go' and you should be left with a new EMG model that we can view in the Asset Explorer:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-LdsgH0tsI_k/Toy0ViO0r3I/AAAAAAAABCI/qDsoV42Xcaw/s1600/7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="154" src="http://2.bp.blogspot.com/-LdsgH0tsI_k/Toy0ViO0r3I/AAAAAAAABCI/qDsoV42Xcaw/s200/7.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As the pic shows, it's all one uniform gray color, instead of having light and dark areas.&lt;br /&gt;&lt;br /&gt;Great!&lt;br /&gt;&lt;br /&gt;However, now we need to actually get this unshadowed model back into our character model. For this, we turn to the EMG Swapper tool.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Open it up and you should see a window like this:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-tuP_3CH7Dws/Toy07_Q0LwI/AAAAAAAABCM/hDlqFe3xCjY/s1600/8.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="109" src="http://3.bp.blogspot.com/-tuP_3CH7Dws/Toy07_Q0LwI/AAAAAAAABCM/hDlqFe3xCjY/s200/8.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the first&amp;nbsp;field, enter the name of the character model you're working with, in my case, CNL_01.obj.emo. In the second&amp;nbsp;field, enter the number of the model we're replacing (remember the thing we wrote down earlier??), in my case it's number 10. In the third&amp;nbsp;field, enter the name of your modified model (the one we injected the new AO map into), in my case 'blank.emg.' The last&amp;nbsp;field&amp;nbsp;can be left with the default value, unless you want to name it something else.&lt;br /&gt;&lt;br /&gt;Click 'Go' and you should be left with a new EMO file, which we can view in the Asset Explorer:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-HVQCT2hJsZY/Toy18xTOeeI/AAAAAAAABCQ/IJRZLNyV9RU/s1600/9.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="199" src="http://4.bp.blogspot.com/-HVQCT2hJsZY/Toy18xTOeeI/AAAAAAAABCQ/IJRZLNyV9RU/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Our model fits right in and doesn't have any messy shadows for nonexistent objects anymore. Mission accomplished!&lt;br /&gt;&lt;br /&gt;Unfortunately, you can see that her hands still have darkening, which creates a seam next to our modified object, but using your newly found AO mapping expertise, I'm sure you can fix it on your own. ;-)&lt;br /&gt;&lt;br /&gt;That's it. Good luck, share your work and ALWAYS MAKE BACKUPS!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-172699847057508403?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/172699847057508403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=172699847057508403' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/172699847057508403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/172699847057508403'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/10/using-sloth86s-ambient-occlusion-tools.html' title='Using sloth86&apos;s Ambient Occlusion Tools in SF4'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-odvlwTbepiE/ToyvbANo6RI/AAAAAAAABB4/2F07Gw1_a38/s72-c/1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-5375463760900314331</id><published>2011-09-26T08:33:00.000-07:00</published><updated>2011-10-21T12:03:16.125-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssnes'/><category scheme='http://www.blogger.com/atom/ns#' term='gameboy color'/><category scheme='http://www.blogger.com/atom/ns#' term='gameboy advance'/><category scheme='http://www.blogger.com/atom/ns#' term='libsnes'/><category scheme='http://www.blogger.com/atom/ns#' term='genesis'/><category scheme='http://www.blogger.com/atom/ns#' term='pixel shader'/><title type='text'>Pixel Shaders in Genesis, GBA, GBC Emulation</title><content type='html'>If you've looked at any of the &lt;a href="http://filthypants.blogspot.com/2011/05/more-emulator-pixel-shaders-crt-updated.html"&gt;amazing pixel shaders available for bsnes&lt;/a&gt;, such as the collaborative CRT shader from cgwg and DOLLS or Themaister's dot-n-bloom, you may have wanted to use them with other systems, such as Sega Genesis or Gameboy Advance. Well, now you can! &lt;b&gt;Update (10/03/2011)&lt;/b&gt;: now it works with &lt;b&gt;Final Burn Alpha&lt;/b&gt;, as well. &lt;b&gt;Update &lt;/b&gt;(10/5/2011): I'm adding download links for Windows binaries of the various libraries, when possible.&lt;br /&gt;&lt;br /&gt;Themaister wrote some "hacky" wrappers around Genesis Plus GX, Visualboy Advance and Gambatte that route their APIs to match up with that of libsnes. That means any frontend for libsnes, such as Themaister's own SSNES, can now serve as a frontend for these excellent emulators. Thus, any features of the frontend, such as SSNES' real-time rewind and FFMPEG-powered video dumping capabilities, get baked in automatically. This also extends SSNES' badass GGPO-style netplay to all of these systems (where applicable, of course).&lt;br /&gt;&lt;br /&gt;If you're using Ubuntu or another Debian-based distro, you can get precompiled binaries from&lt;a href="https://launchpad.net/~hunter-kaller/+archive/ppa/+packages"&gt; my PPA repo&lt;/a&gt;. Other *nixes can compile them from source. The only dependencies are git (not even totally necessary if you manually download the source via http), a compiler that supports C++98 or higher (gcc-3.4 and up, IIRC) and zlib (in Debian-based distros, it's the zlib1g-dev package).&lt;br /&gt;&lt;br /&gt;So, open a terminal and type:&lt;br /&gt;&lt;br /&gt;For Genesis Plus GX:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git clone &lt;a href="https://github.com/twinaphex/genesis-next"&gt;https://github.com/twinaphex/genesis-next&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd megadrive-next/src/libsnes&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;make&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/download.php?fjv46swm4oc7rql"&gt;Download Windows libsnes-genesisplusgx binaries&lt;/a&gt;&lt;br /&gt;(you may need to rename zlib.dll to libz-1.dll for it to work)&lt;br /&gt;&lt;br /&gt;For Visualboy Advance (vba):&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git clone &lt;a class="postlink" href="git://github.com/Themaister/gba-next.git"&gt;git://github.com/Themaister/gba-next.git&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd trunk/platform/libsnes&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;make&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For Gambatte:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git clone &lt;a class="postlink" href="git://github.com/Themaister/gambatte-libsnes.git"&gt;git://github.com/Themaister/gambatte-libsnes.git&lt;/a&gt; --branch libsnes&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd gambatte-libsnes/libgambatte/libsnes&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;make&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For Final Burn Alpha (fba):&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git clone &lt;a href="git://github.com/twinaphex/fba-next-slim.git"&gt;git://github.com/twinaphex/fba-next-slim.git&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd fba-next-slim/src/burner/libsnes&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;make&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?b5z7c6g0tn54jdr"&gt;Download Windows libsnes-fba binaries&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The resulting libraries will all be called libsnes.so. In my packages, the libraries are named according to the emulator (libsnes-*.so) so you can have them all peacefully coexist.&lt;br /&gt;&lt;br /&gt;One thing to be aware of: SSNES-Phoenix's file browser will filter out non-SNES extensions, so you'll have to manually type the filenames unless/until Themaister does anything about it.&lt;br /&gt;&lt;br /&gt;Screenshots (dot-n-bloom shader is used for the GBC and GBA screenshots, CRT is used for Genesis and FBA):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-lpmoz6pHMAU/ToH33nWIsvI/AAAAAAAABBg/DGzGbJtGqwo/s1600/gbc.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-lpmoz6pHMAU/ToH33nWIsvI/AAAAAAAABBg/DGzGbJtGqwo/s320/gbc.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-oH0oueI5jiM/ToH34LIVrvI/AAAAAAAABBk/0kXO77Bax3E/s1600/genplusgx.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-oH0oueI5jiM/ToH34LIVrvI/AAAAAAAABBk/0kXO77Bax3E/s320/genplusgx.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-VXFGmlkcXI8/ToH34VPvrYI/AAAAAAAABBo/GRh9WtzKmao/s1600/vba.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-VXFGmlkcXI8/ToH34VPvrYI/AAAAAAAABBo/GRh9WtzKmao/s320/vba.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8glnY323r9k/TotRus-eB7I/AAAAAAAABB0/fp-bMjJ8g2U/s1600/fba.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-8glnY323r9k/TotRus-eB7I/AAAAAAAABB0/fp-bMjJ8g2U/s320/fba.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-5375463760900314331?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/5375463760900314331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=5375463760900314331' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/5375463760900314331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/5375463760900314331'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/09/pixel-shaders-in-genesis-gba-gbc.html' title='Pixel Shaders in Genesis, GBA, GBC Emulation'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-lpmoz6pHMAU/ToH33nWIsvI/AAAAAAAABBg/DGzGbJtGqwo/s72-c/gbc.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-258183934239909648</id><published>2011-09-19T12:42:00.000-07:00</published><updated>2011-09-19T12:43:12.816-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stage'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>SSF4AE - doshu's ULSM Tutorial</title><content type='html'>&lt;span class="Apple-style-span" style="background-color: #fcfcff; color: #141414; font-family: Helvetica, Arial, sans-serif; font-size: 15px; line-height: 20px;"&gt;Here's a more or less basic tutorial about how I built my Ultra Light Stage mod. The aspects that I won't cover are basic Gimp/Photoshop manipulations, building your own BGM selection and how to convert a TRN stage to any other stage. If need be, those aspects can all be learned quickly either by reading the SSFIV/AE wikis, by searching the net, or simply by thinking on your own and doing try/errors.&lt;br style="margin-top: 0px;" /&gt;Also, the first part of the tutorial is way more detailed (both in text and pictures) than the last ones, since I wrote it a while back to explain how the Training stage edit works on the polycount forums.&lt;br /&gt;&lt;br /&gt;Since I build my mod, a lot of progress has been made in the field of custom Training stage's templates, so instead of blindly followind this tutorial entirely, you should probably just take the parts you need and try to build even better stages than I did (not so hard IMO :p).&lt;br /&gt;&lt;br /&gt;Finally, I have to insist that I'm (or was) a total n00b in modding, and that this tutorial might include some really weird and/or not efficient methods for expert modders. I'm repeating myself here, but better safe than sorry^^. Anyway, if you have a better way of doing things, share it! This tutorial will then hopefully be updated&amp;nbsp;&lt;img alt=";)" class="smilie" src="http://shoryuken.com/forum/styles/default/xenforo/smilies/wink.png" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 1px; margin-right: 1px; margin-top: 0px; vertical-align: text-bottom;" title="Wink    ;)" /&gt;.&lt;br /&gt;&lt;br /&gt;Ok, let's start with an overview of the needed tools (find those in the wiki and/or with google) :&lt;/span&gt;&lt;br /&gt;&lt;ul style="margin-bottom: 1em; margin-left: 2em; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;SF4 Assets Explorer&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;The Gimp + dds mod&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;SFIVAM&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;hexadecimal editor HxD&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Ryu's Classic Training Stage mod by hunterk&lt;/li&gt;&lt;/ul&gt;Quick overview of the whole process :&lt;br /&gt;&lt;ul style="margin-bottom: 1em; margin-left: 2em; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;extract Ryu's Classic Training Stage's dds and observe how it's made&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;build your own dds from whatever art you find that seems fine (but do not forget to&amp;nbsp;&lt;b&gt;get the author's authorization&lt;/b&gt;&amp;nbsp;if you want to share your work!)&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;do the hex magic&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;inject the dds : the stage is done!&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;build the 3 preview pics'dds : big, medium and small size&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;build the 2 kind of presentation text : Stage Select and pre-versus screen&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;inject the whole thing into the appropriate files&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;mute that annoying announcer !&lt;/li&gt;&lt;/ul&gt;&lt;ol style="margin-bottom: 1em; margin-left: 2em; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: decimal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span style="font-family: 'Century Schoolbook L';"&gt;&lt;span style="font-size: small;"&gt;Building your own stage&lt;/span&gt;&lt;/span&gt;&lt;ol style="margin-bottom: 0px; margin-left: 2em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: decimal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span style="font-family: 'Century Schoolbook L';"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Basic explanations&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Ok, so here's a bit of explanation on how it works. As you'll see, it really needs only basic picture editing skill, and not anything fancy.&lt;br /&gt;&lt;br /&gt;First, let's look at the "cube" limitations : the edges (this stage was done by hunterk).&lt;br /&gt;&lt;a class="externalLink" href="http://tof.canardpc.com/view/6b3c1770-1877-43a5-90bd-1f31314102a7.jpg" rel="nofollow" style="border-bottom-left-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; color: #1d6297; margin-bottom: 0px; margin-left: -3px; margin-right: -3px; margin-top: 0px; padding-bottom: 0px; padding-left: 3px; padding-right: 3px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://tof.canardpc.com/view/6b3c1770-1877-43a5-90bd-1f31314102a7.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see, all the vertical sides of the cube are filled with the same part of the texture, making it "loop" when it reaches the end. The same with the floor/ceiling. In practice, it doesn't show that much, except when performing some Ultra's like Ryu's Metsu Shoryuken.&lt;br /&gt;But what is important here, is that because of that loop, the more the left and right sides of the texture looks alike, the less it will be apparent in the stage. In this case, it's almost "invisible".&lt;br /&gt;Secondly, here's the kind of file the stage's texture is made of:&lt;br /&gt;&lt;a class="externalLink" href="http://tof.canardpc.com/view/f43aa703-66a8-41b5-b6d7-151b9f7b9cff.jpg" rel="nofollow" style="border-bottom-left-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; color: #1d6297; margin-bottom: 0px; margin-left: -3px; margin-right: -3px; margin-top: 0px; padding-bottom: 0px; padding-left: 3px; padding-right: 3px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://tof.canardpc.com/view/f43aa703-66a8-41b5-b6d7-151b9f7b9cff.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Basically, the "floor" part is upside, then comes a thin black line, and the the main background. What is important here for "good" results, is that the floor looks as much as possible like one, as it does from all the above examples (and in the WIP preview screenshot). If the original jpg image's "floor" isn't "straight", or is filled with different objects and such, the result might be awkward (or not, it depends).&lt;br /&gt;&lt;br /&gt;For example, let's first show the results from the 2 pictures above:&lt;br /&gt;&lt;a class="externalLink" href="http://tof.canardpc.com/view/a98d5262-b3ab-490a-a7b7-be43c6a00e04.jpg" rel="nofollow" style="border-bottom-left-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; color: #1d6297; margin-bottom: 0px; margin-left: -3px; margin-right: -3px; margin-top: 0px; padding-bottom: 0px; padding-left: 3px; padding-right: 3px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://tof.canardpc.com/view/a98d5262-b3ab-490a-a7b7-be43c6a00e04.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All in all, except the crappy resolution problem, those stages look "good" : the floor is “floory”, and the edges of the texture look alike, so it should be pretty "invisible" while playing.&lt;br /&gt;&lt;br /&gt;Let's finish the basic explanations with a "difficult" file to work from (at least for my skills)&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://tof.canardpc.com/view/ccff7d26-27ae-4c61-a7e5-8a93a221e39b.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's it for the basic explanations.&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: decimal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;i&gt;Choosing some art and building a dds from it&lt;/i&gt;&lt;br /&gt;Basically, you'll want to work from a picture as high def as possible, even if the dds will only be 1280*800. Also, the scene should ideally be pretty empty in the “front”, thus allowing you to easily build the floor of your stage. It is possible to work from more difficult material, but I'll leave it to you to find how, explaining it here would be long and tedious.&lt;br /&gt;&lt;br /&gt;For my part, I worked mostly on feeling. Just look at the picture, copy whatever part you want to make the floor of without thinking too much about proportions, copy and paste it as a new image, then resize that new image at 1280*237. That's pretty much it for the floor.&lt;br /&gt;Return to the original picture, select the other part of it (Ctrl-I should do the trick if your previous selection was still active), copy paste as new image, then resize to 1280*553. That's it for the wall.&lt;br /&gt;Create a new black backgrounded 1280*800 image, copy paste the floor into it, position it up (using the arrows make it a breeze to do, no pixel precision needed). Do the same for the wall, except you position it down. There should be around 10 pixels left black in between.&lt;br /&gt;Flip the image horizontally (Image → Transform), then save as a .dds (just name the file whatever .dds when saving). Don't bother about the compression, it's not needed.&lt;br /&gt;Before injecting the newly created dds file, you need to make it the exact same size as the original one. To do that, just open both the original and the new dds file into your hex editor, and do the following :&lt;br /&gt;- on the original file : Ctrl-A ; End ; Ctrl-E ; choose 2EE080 ; Ctrl-C&lt;br /&gt;- on the new file : Ctrl-A ; End ; Ctrl-V ; Ctrl-S&lt;br /&gt;&lt;br /&gt;That should do the trick. Basically, you're copying what bytes are missing in the new file from the original one. All the files I created were always 2EE070 sections long, that's how you get the 2EE080 number. Should your file be a different size than that, you will have the adapt this number to that size so that both files are the same size at the end. This method doesn't work with new files bigger than the original though... (see how I'm a n00b in hex editing? Pretty n00bish I must admit, but it works! I have an idea why it does work, but I'll gladly hear some real explanation^^).&lt;br /&gt;&lt;br /&gt;A last word about applying filters on the dds befrore injecting it. The ingame look of the stage you built won't be exactly the same as the dds' look, so you might want to try and apply some filters. Here are the ones I used so far:&lt;br /&gt;- unsharpen: used mostly for high definition material, like most of the stage of the ULSM. I used it twice on each dds.&lt;br /&gt;- cartoon: used in combination with "Van Gogh" to make low definition material look ok-ish ingame&lt;br /&gt;Don't hesitate to try other filters too!&lt;br /&gt;&lt;br /&gt;O&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;k, you're good to inject to file into the .emz and test out your newly build stage!&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: decimal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span style="font-family: 'Century Schoolbook L';"&gt;&lt;span style="font-size: small;"&gt;Editing the Stage Select screen&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span style="font-size: x-small;"&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://tof.canardpc.com/view/1eb383f2-5ddb-4ff6-8c0d-3fe3e32aef9d.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;This part is really easy, but quite time consuming. I'll first specify the particularities of each kind of file needed for the Stage Select screen (dds resolution : actual picture resolution (ratio) / type of compression needed):&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;- big preview picture: 1024*512 / 710*377 (1.88) / BC2/DXT3; the BLD stage needs a 1024*1024 resolution file (adapt the actual picture size accordingly)&lt;br /&gt;small preview picture: 128*128 / 116*89 (1.30) / BC1/DXT1&lt;br /&gt;&lt;br /&gt;Then the pre-versus screen:&lt;br /&gt;- medium preview picture: 512*256 / 336*214 (1.57) / BC1/DXT1; BLD, KOR, AFX need a 256*256 image, adapt the actual picture size accordingly&lt;br /&gt;&lt;br /&gt;And for the text in both screen (up left for the Stage Select screen, up right for the pre-versus'):&lt;br /&gt;- 256*128 or 512*128 / Comic Sans MS Bold 34 (Place) and Arial Bold 36 (Stage name) / BC2/DXT3&lt;br /&gt;&lt;br /&gt;To avoid you the pain of figuring out which stage's text needs which resolution, here's the list of the stages needing a 256*128 dds: AFR, RVR, AFX, VIE, JPN, VCN.&lt;br /&gt;&lt;br /&gt;Another time consuming task is figuring which files you need to edit, so here's the list:&lt;/li&gt;&lt;/ol&gt;&lt;ul style="margin-bottom: 1em; margin-left: 2em; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;b&gt;\&lt;/b&gt;ressource\ui\stage_select\&lt;b&gt;stage_select.emz&lt;/b&gt;: for every big/small preview picture and Stage Select screen's text. Finding the small ones is easy, since the entry name corresponds to the stage name. The big picture/text is much more difficult to find, so here's a list to help you out (pic/pic/txt/txt; I guess you have to inject the new pic and text twice, in both entries, I haven't tried to do it at only one place...):&lt;ul style="margin-bottom: 0px; margin-left: 2em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;ul style="margin-bottom: 0px; margin-left: 2em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;ul style="margin-bottom: 0px; margin-left: 2em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;BLD: I30 / I3E / I8A / I98&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;IND: I33 / I41 / I8D / I9B&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;KOR: I36 / I44 / I90 / I9E&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;AFX: I39 / I47 / I93 / IA1&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;LBX: I3C / I4A / I96 / IA4&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;USA: I3F / I4D / I99 / IA7&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;CHN: I42 / I50 / I9C / IAA&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;RUS: I45 / I53 / I9F / IAD&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;BRA: I48 / I56 / IA2 / IB0&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;AFR: I4B / I59 / IA5 / IB3&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;VIE: I4E / I5C / IA8 / IB6&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;JPN: I51 / I5F / IAB / IB9&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;EUR: I54 / I62 / IAE / IBC&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;SCO: I57 / I65 / IB1 / IBF&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;JPX: I5A / I68 / IB4 / IC2&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;LAB: I5D / I6B / IB7 / IC5&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;RVR: I60 / I6E / IBA / IC8&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;VCN: I63 / I71 / IBD / ICB&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;CNX: I66 / I74 / IC0 / ICE&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;BRX: I69 / I77 / IC3 / ID1&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;VNX: I6C / I7A / IC6 / ID4&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;TRN: I6F / I7D / IC9 / ID7&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span style="font-size: small;"&gt;\ressource\ui\versus&lt;span style="font-family: 'Times New Roman';"&gt;\versus\&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;b&gt;img#.emb.emz&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;, where # is between 0 and 3: for everything pre-versus screen related. The entries&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&amp;nbsp;are self explanatory, with JPN_name for the text part, and stage_JPN for the medium preview picture. Just take a look to find out which stage is where (the text and the picture entries can be in different files). Also, img3.emb.emz contains Boxer's name, so if you're using a JPN character's name mod, be sure to swap the original (Balrog) with is counterpart (M. Bison, to be found in some other file).&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: 'Times New Roman';"&gt;And finally, though I won't go through the hassle of explaining Gi&lt;/span&gt;mp's image editing manipulations (a small hint about it though, be sure to use the game's original files as models for the shapes, especially for the small preview image; that way the result will fit perfectly into the game's screen), I'll throw a word about the halo thing around the text.&lt;br /&gt;At first, I followed&amp;nbsp;&lt;a class="externalLink" href="https://docs.google.com/Doc?docid=0AUTzWzNoPi_JZGdwNG5kYnJfOGNuMnhxM2dq&amp;amp;hl=fr&amp;amp;pli=1" rel="nofollow" style="border-bottom-left-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; color: #1d6297; margin-bottom: 0px; margin-left: -3px; margin-right: -3px; margin-top: 0px; padding-bottom: 0px; padding-left: 3px; padding-right: 3px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;this tutorial.&lt;/a&gt;&amp;nbsp;The result was good, but I came around a faster and better looking method after a while: follow all the steps until before applying the first Gaussian filter, then do a select all (CTRL-A), and apply directly a 10 point Gaussian filter. That way, you only have to apply one filter with one setting, removing the need to change the settings from 5 to 10 points every time. Finally, just follow the end steps of the linked tutorial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Ok, now you're set, all that's left is to inject all of your files one by one into the game's files. A long and boring process if you're doing every stage at once, but the result is really worth it!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;One last word about this part of the process: don't pay attention if the SF4 assets explorer preview looks messed up, it doesn't affect the in game result.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span style="font-size: x-small;"&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://tof.canardpc.com/view/45861557-f489-42f5-9227-948445a8dfa3.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol style="margin-bottom: 1em; margin-left: 2em; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: decimal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span style="font-family: 'Century Schoolbook L';"&gt;&lt;span style="font-size: small;"&gt;Mute the announcer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This is quite easy:&lt;/li&gt;&lt;/ol&gt;&lt;ul style="margin-bottom: 1em; margin-left: 2em; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;open \ressource\ui\sound\se\&lt;b&gt;VERSUS_SE.csb&lt;/b&gt;&amp;nbsp;with SSFIVAM&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;extract everything in a temporary folder ("unpack" command)&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;hexedit the files containing the sounds you want to delete by selecting all and replacing the data with zeros (listen to the files in AM beforehand, to found out the name of the sounds you want to delete)&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;then inject all the files inside the original file ("replace content with..." command)&lt;br /&gt;&lt;br /&gt;There may be a better way, but that one worked great for me^^.&lt;/li&gt;&lt;/ul&gt;And that's it for the ULSM tutorial!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-258183934239909648?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/258183934239909648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=258183934239909648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/258183934239909648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/258183934239909648'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/09/ssf4ae-doshus-ulsm-tutorial.html' title='SSF4AE - doshu&apos;s ULSM Tutorial'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-6269207701002907297</id><published>2011-09-19T05:36:00.001-07:00</published><updated>2011-09-19T12:43:00.671-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sensibeat'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='model swap'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>SSF4AE - Swapping Static Objects with sloth86's Tools</title><content type='html'>&lt;span class="Apple-style-span" style="background-color: #fcfcff; color: #141414; font-family: Helvetica, Arial, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;span style="margin-top: 0px; text-decoration: underline;"&gt;&lt;b&gt;Swapping static objects with sloth86's tools.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;copyright sensibeat&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;sloth86's tools&lt;/span&gt;:&amp;nbsp;&lt;a class="externalLink" href="http://aemods.pbworks.com/w/page/42053948/aetools#Sloth86sModelSwapTools" rel="nofollow" style="border-bottom-left-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; color: #1d6297; margin-bottom: 0px; margin-left: -3px; margin-right: -3px; margin-top: 0px; padding-bottom: 0px; padding-left: 3px; padding-right: 3px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;http://aemods.pbworks.com/w/page/42053948/aetools#Sloth86sModelSwapTools&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="margin-bottom: 1em; margin-left: 2em; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;DDSREFEDIT32.exe&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;EMG2SMD.exe&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;EMGSWAP.exe&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;OBJ2EMG.exe (latest version:&amp;nbsp;&lt;a class="externalLink" href="http://www.mediafire.com/?p1vvruy4ycy3ejt" rel="nofollow" style="border-bottom-left-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; color: #1d6297; margin-bottom: 0px; margin-left: -3px; margin-right: -3px; margin-top: 0px; padding-bottom: 0px; padding-left: 3px; padding-right: 3px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;http://www.mediafire.com/?p1vvruy4ycy3ejt&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;span style="text-decoration: underline;"&gt;piecemonteeSF4explorerV0.37b.exe&lt;/span&gt;:&amp;nbsp;&lt;a class="externalLink" href="http://sf4viewer.sourceforge.net/" rel="nofollow" style="border-bottom-left-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; color: #1d6297; margin-bottom: 0px; margin-left: -3px; margin-right: -3px; margin-top: 0px; padding-bottom: 0px; padding-left: 3px; padding-right: 3px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;http://sf4viewer.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;With this method you can only swap static objects assigned to 1 bone.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First chose a .obj you want to swap:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7702/01.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;br /&gt;Chose a character and extract the full model as a .obj with sf4explorer:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7700/02.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;br /&gt;You'll have to edit the model in your 3D editor to fit the character:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7707/03.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7706/04.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;i&gt;¤ More infos about that part here:&lt;/i&gt;&amp;nbsp;&lt;a class="externalLink" href="http://filthypants.blogspot.com/2009/08/beginners-guide-to-sf4-model-editing.html" rel="nofollow" style="border-bottom-left-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; color: #1d6297; margin-bottom: 0px; margin-left: -3px; margin-right: -3px; margin-top: 0px; padding-bottom: 0px; padding-left: 3px; padding-right: 3px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;http://filthypants.blogspot.com/2009/08/beginners-guide-to-sf4-model-editing.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;¤ To open the .obj in 3ds max you may need to open it and save it in misfit model 3d first.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Now you have your model in place save it and open EMG2SMD.exe:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7695/05.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;I want to swap my cap with zangief's hairs (15th #EMG -as viewed in sf4explorer-)&lt;br /&gt;&lt;br /&gt;Open the smd in notepad and look for the number of the bone you want to link your object to:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7698/06.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;in that case I want to link to the "head bone": #6.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;¤ More infos on smd here:&lt;/i&gt;&amp;nbsp;&lt;a class="externalLink" href="http://developer.valvesoftware.com/wiki/Studiomdl_Data" rel="nofollow" style="border-bottom-left-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; color: #1d6297; margin-bottom: 0px; margin-left: -3px; margin-right: -3px; margin-top: 0px; padding-bottom: 0px; padding-left: 3px; padding-right: 3px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;http://developer.valvesoftware.com/wiki/Studiomdl_Data&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now you can use OBJ2EMG.exe:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7697/07.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;i&gt;¤ To use a .obj from 3ds max in OBJ2EMG you may need to open it and save it in misfit model 3d first.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Then use EMGSWAP.exe:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7694/08.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;br /&gt;We aren't done yet, it needs some textures (diffusion+normal map dds):&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7696/09.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;i&gt;¤ See other tutorials to add dds to your col.emb and nml.emb...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Then use DDSREFEDIT32.exe (I renamed former new.emo to ZGF_01.obj.emo before this step):&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7701/10.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;br /&gt;That looks OK in sf4explorer:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7704/11.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;br /&gt;Let's test in game:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7705/12.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;edit:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;I thought the bone ID# was in hexadecimal in the smb... it's in decimal sorry for the confusion, I erased that part.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;You actually need to write it in hexadecimal when you do it manually, we'll see that in another tutorial...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;edit 2: I knew I forgot something...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I didn't linked any material features in the .emm to my "mcap"&lt;br /&gt;&lt;br /&gt;2 ways to do it:&lt;br /&gt;1) the lazy way: edit the obj.emo in hexadecimal and change "mcap" by a material that could do the trick like "shoes" or "pants"&lt;br /&gt;&lt;br /&gt;2) using NanjouJ's matedit tool, replacing an unused material (in that case "hair") by "mcap" and the features you want to use on it.&lt;br /&gt;&lt;a class="externalLink" href="http://aemods.pbworks.com/w/page/42053948/aetools#NanjouJsMaterialsTool" rel="nofollow" style="border-bottom-left-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; color: #1d6297; margin-bottom: 0px; margin-left: -3px; margin-right: -3px; margin-top: 0px; padding-bottom: 0px; padding-left: 3px; padding-right: 3px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;http://aemods.pbworks.com/w/page/42053948/aetools#NanjouJsMaterialsTool&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's the final result with material features added (no more weird reflections):&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://seemypic.net/images/normal/7709/13.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; max-width: 100%;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-6269207701002907297?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/6269207701002907297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=6269207701002907297' title='43 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6269207701002907297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6269207701002907297'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/09/ssf4ae-swapping-static-objects-with.html' title='SSF4AE - Swapping Static Objects with sloth86&apos;s Tools'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>43</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-1230662118501909283</id><published>2011-09-16T11:48:00.000-07:00</published><updated>2011-09-16T11:48:15.622-07:00</updated><title type='text'>Reinstalling GRUB2</title><content type='html'>This has come up a million times (every time I reinstall Windows, in fact), and every time I have to search around online and try to remember how to do it. I figured this most recent time that I would just go ahead and write a blog post about it and be done with it, so here it is.&lt;br /&gt;&lt;br /&gt;According to &lt;a href="https://help.ubuntu.com/community/RecoveringUbuntuAfterInstallingWindows"&gt;this handy page from the Ubuntu community documentation&lt;/a&gt;, there are a couple of ways to skin this particular cat. The one that worked best for me was to take an Alternate CD that I already had on-hand, boot into it, and choose 'Repair an Existing Installation' (or something like that) at the first splash screen (the one where you can check the CD integrity, run memtest, etc.).&lt;br /&gt;&lt;br /&gt;Once it gets started, run through the options choosing the default keyboard layout, time zone, etc. When it asks you to choose a root, accompanied by a list of all of the HDD partitions, it appears you may choose any of them (I chose /dev/sda5 on this particular machine, which has Win7 in a primary partition and Ubuntu spread across 3 logical partitions). Then, once it kicks you to a command prompt, type:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sudo grub-install /dev/sda&lt;/span&gt;&lt;br /&gt;That's it.&lt;br /&gt;&lt;br /&gt;Other easy options that I didn't try include booting into a LiveCD session, then installing and running the boot-repair package (it didn't even show up in the apt-cache when I searched for it, so YMMV). In the program, choose the "First Repair" option and then reboot without the CD in the drive. A GRUB splash should show up proposing both Ubuntu and Windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-1230662118501909283?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/1230662118501909283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=1230662118501909283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/1230662118501909283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/1230662118501909283'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/09/reinstalling-grub2.html' title='Reinstalling GRUB2'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-6113485606339224232</id><published>2011-09-15T13:12:00.000-07:00</published><updated>2011-09-26T05:42:19.934-07:00</updated><title type='text'>Windows 8 Dev Preview on Lenovo X61 Tablet</title><content type='html'>I downloaded Microsoft's Windows 8 Developer Preview the other day and decided to try it out on my Lenovo X61 tablet PC. &lt;b&gt;&lt;u&gt;NOTE&lt;/u&gt;&lt;/b&gt;: This is an older X61, running the Centrino Pro chipset (an older Core2 series chipset). For newer models, you might need to run Windows Update after installing to enable pen/touch input (thanks to reader taytor head for the info).&lt;br /&gt;&lt;br /&gt;The trackpoint/eraserhead/navigation nipple/whatever works fine from the get-go, but the middle-button mousewheel emulation does not. It's easily fixed, though, by &lt;a href="http://support.lenovo.com/en_US/downloads/detail.page?LegacyDocID=MIGR-67941"&gt;downloading and installing the driver from Lenovo&lt;/a&gt;. After this easy fix, though, I started running into some problems.&lt;br /&gt;&lt;br /&gt;First off, my Centrino Pro chipset (Intel Mobile GM965 Express) graphics driver wasn't recognized by default, and every time I tried to install it manually, it failed with an error claiming that the chipset wasn't valid for the driver.&lt;br /&gt;&lt;br /&gt;Knowing this to be false, I went and downloaded another copy of the driver from &lt;a href="http://download.cnet.com/Video-Intel-GM965-Express-Chipset-Family-Type-Driver-Version-A01/3000-2108_4-199635.html"&gt;CNET (looks to be a Dell driver, based on some files contained within the driver package)&lt;/a&gt;. This driver's installation utility failed with an error about an unsupported operating system, which I dealt with by right-clicking on it and going to the 'Compatibility' tab and choosing Windows Vista (no Service Packs) as the compatibility target. After that, the installer ran just fine. Now I have Aero and transparency and everything.&lt;br /&gt;&lt;br /&gt;Out of the box, the system recognizes my stylus and allows for pen input and screen calibration. However, I wanted a few features that are only available from the official Wacom driver, so I downloaded it and tried to install it. The installation went fine, but upon reboot, the system no longer recognized my stylus at all. When I went to the control panels and clicked on the Wacom driver panel, it choked and failed with an error about how there were no compatible interfaces found on the system.... Luckily, after uninstalling the driver from my Programs list and uninstalling the drivers from the device manager, all is well again, though I'm stuck with the generic, MS driver.&lt;br /&gt;&lt;br /&gt;Other than those hiccups, everything seems to be working well. The system is overtly similar to Windows 7, only with sharp corners and a little less transparency everywhere. Window borders are more opaque now, and they no longer have the Vista-style reflection/glare effects.&lt;br /&gt;&lt;br /&gt;The 'ribbon' menu style has been adopted throughout the system and, while I don't really like it, I suspect it will grow on me, much like it did when introduced to Office 2007.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;Before my video driver was installed, the Metro UI was horribly slow and took several seconds to transition to and from the traditional desktop view. However, with the driver installed, everything is snappy and attractive.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-IR5UxNySOCw/TnjHSRp-IsI/AAAAAAAABBY/ZqTsxYeTZaw/s1600/metro1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-IR5UxNySOCw/TnjHSRp-IsI/AAAAAAAABBY/ZqTsxYeTZaw/s320/metro1.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;At this point, the Metro UI is sort of useless and is just a glorified launcher, but MS intends to have the launcher squares configurable and with live updates (i.e., your buddies list will update with who is online, the weather application will show live weather, etc.). However, applications will have to be written especially for the Metro UI using a new API, and MS intends to charge developers 30% of revenue for Metro apps, just like Apple does with their App Store.&lt;br /&gt;&lt;br /&gt;If you have any questions about Windows 8 in general or its use on this computer, specifically, drop me a comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-6113485606339224232?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/6113485606339224232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=6113485606339224232' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6113485606339224232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6113485606339224232'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/09/windows-8-dev-preview-on-lenovo-x61.html' title='Windows 8 Dev Preview on Lenovo X61 Tablet'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-IR5UxNySOCw/TnjHSRp-IsI/AAAAAAAABBY/ZqTsxYeTZaw/s72-c/metro1.png' height='72' width='72'/><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-7476450616400940204</id><published>2011-09-13T16:10:00.000-07:00</published><updated>2011-09-13T16:12:44.630-07:00</updated><title type='text'>CCSM Locale Not Supported Error</title><content type='html'>My HTPC's compizconfig-settings-manager (ccsm) started failing to launch whenever I clicked on the link, so I tried to run it from the terminal to see what was up. When I did, I saw that it was coughing up this error:&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #ebf1f5; color: #222222; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; direction: ltr; font-family: monospace !important; font-size: 1em; font-style: normal; overflow-x: auto; overflow-y: auto; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 703px;"&gt;&lt;code style="display: inline-block; font-family: monospace !important; font-size: 1em; padding-bottom: 0.75em; padding-left: 0.75em; padding-right: 0.75em; padding-top: 0.75em; white-space: pre;"&gt;(ccsm:8581): Gtk-WARNING **: Locale not supported by C library.&lt;br /&gt;        Using the fallback 'C' locale.&lt;br /&gt;Info: No sexy-python package found, don't worry it's optional.&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "/usr/bin/ccsm", line 38, in &lt;module&gt;&lt;br /&gt;    import ccm&lt;br /&gt;  File "/usr/lib/python2.5/site-packages/ccm/__init__.py", line 1, in &lt;module&gt;&lt;br /&gt;    from ccm.Conflicts import *&lt;br /&gt;  File "/usr/lib/python2.5/site-packages/ccm/Conflicts.py", line 26, in &lt;module&gt;&lt;br /&gt;    from ccm.Constants import *&lt;br /&gt;  File "/usr/lib/python2.5/site-packages/ccm/Constants.py", line 72, in &lt;module&gt;&lt;br /&gt;    locale.setlocale(locale.LC_ALL, "")&lt;br /&gt;  File "/usr/lib/python2.5/locale.py", line 476, in setlocale&lt;br /&gt;    return _setlocale(category, locale)&lt;br /&gt;locale.Error: unsupported locale setting&lt;/module&gt;&lt;/module&gt;&lt;/module&gt;&lt;/module&gt;&lt;/code&gt;&lt;/pre&gt;Turns out the fix is pretty simple. Just open up a terminal and type:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;LC_All=en_US.utf8&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Lang=en_US.utf8&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ccsm&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;one after another.&lt;br /&gt;&lt;br /&gt;Unfortunately, this fix doesn't seem to stick, so you have to do it every time you want to launch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-7476450616400940204?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/7476450616400940204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=7476450616400940204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/7476450616400940204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/7476450616400940204'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/09/ccsm-locale-not-supported-error.html' title='CCSM Locale Not Supported Error'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-5584938720499928957</id><published>2011-08-25T18:51:00.000-07:00</published><updated>2011-09-19T10:20:15.722-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='model swap'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>Intermediate Guide to SF4 EMG (Model) Swapping</title><content type='html'>Sloth86 has cracked model manipulation in SF4 wide open. It's now possible to swap models from character to character and costume to costume in a fairly consistent manner, thanks to sloth86's research. Additionally, he was nice enough to write simple, straightforward graphical tools that extend this ability to almost anyone. Just to be clear, though: &lt;i&gt;this procedure often produces strange results, especially with respect to animations. Sometimes these results can be fixed through model editing, sometimes not.&lt;/i&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this tutorial, we're going to use sloth86's methods to take an EMG model from one character and replace it with an EMG model from another character.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First things first, lets get all of the tools we'll need. This is a pretty advanced procedure, so we're going to need piecemontee's SF4Viewer (aka, Asset Explorer), Kensou's Tool(s) and Sloth's tools, specifically, EMGSwap and DDSREFEDIT. Once you have those tools downloaded and organized, we're ready to get started.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, identify which model you want to move and where you want to put it. I'm planning to take Guy's head (donor model) and place it on Ryu's body (recipient model).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you've got it all planned out, open both models (for me, GUY_01.obj.emo and RYU_01.obj.emo) in the Asset Explorer and find the desired objects--in my case Guy's 8th EMG (counting each model, starting from the top in the Asset Explorer's display)--and I'm going to replace Ryu's 12th EMG. The recipient's numbers are important, so write it/them down.&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-vydh7S-QhUk/Tlb9NBdhleI/AAAAAAAABBE/LZ8M9QmLKZM/s1600/1.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644977583127893474" src="http://2.bp.blogspot.com/-vydh7S-QhUk/Tlb9NBdhleI/AAAAAAAABBE/LZ8M9QmLKZM/s200/1.jpg" style="cursor: pointer; height: 143px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Now, select the donor object, right-click and choose 'Raw dump,' name it something informative (I chose face.emg) and click 'save.'&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-scT1BY7t1Bs/Tlb9JR7_PnI/AAAAAAAABA8/5wa2zUtCSnE/s1600/3.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644977518831156850" src="http://1.bp.blogspot.com/-scT1BY7t1Bs/Tlb9JR7_PnI/AAAAAAAABA8/5wa2zUtCSnE/s200/3.jpg" style="cursor: pointer; height: 143px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Next, armed with our model files and numbers, place both the donor *.emg file and recipient *.obj.emo file into the same directory as EMGSwap and double-click on EMGSwap to run it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This window should pop up:&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-Mm1vPWW_5d0/Tlb9JVg4-qI/AAAAAAAABA0/EzK628ZIemQ/s1600/2.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644977519791241890" src="http://2.bp.blogspot.com/-Mm1vPWW_5d0/Tlb9JVg4-qI/AAAAAAAABA0/EzK628ZIemQ/s200/2.jpg" style="cursor: pointer; height: 110px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;In the field labeled "Input EMO file," type the name of the recipient model, in my case RYU_01.obj.emo. Then, in the field labeled "EMG # to swap out," type the number of the recipient model you wish to replace, in my case 12 (for Ryu's 12th EMG model, the face). Next, in the field labeled "EMG file to swap in," type in the name of our raw-dumped donor model, in my case face.emg. Finally, in the field labeled "Output EMO file," we'll just leave the default 'new.emo' for now (we'll rename it to replace the old model later, but in the meantime, we don't want to mess anything up before we're sure it's cool).&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-sd5OfdnBmG4/Tlb9JDqOsRI/AAAAAAAABAs/KYzV1sfFrG0/s1600/6.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644977514998575378" src="http://3.bp.blogspot.com/-sd5OfdnBmG4/Tlb9JDqOsRI/AAAAAAAABAs/KYzV1sfFrG0/s200/6.jpg" style="cursor: pointer; height: 110px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Click 'Go' and cross your fingers. If all goes well, you should see a window like this pop up:&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-SzqbQ-sQcu4/Tlb9JMxZXTI/AAAAAAAABAk/Zkfmnp7hkJU/s1600/4.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644977517444554034" src="http://2.bp.blogspot.com/-SzqbQ-sQcu4/Tlb9JMxZXTI/AAAAAAAABAk/Zkfmnp7hkJU/s200/4.jpg" style="cursor: pointer; height: 143px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Looks good so far.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, lets check out our Frankenstein's monster by opening the 'new.emo' file in the Asset Explorer:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-fmN76TaLYE0/Tlb9I4ncrwI/AAAAAAAABAc/9Fu5oRv5wvg/s1600/5.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644977512034119426" src="http://4.bp.blogspot.com/-fmN76TaLYE0/Tlb9I4ncrwI/AAAAAAAABAc/9Fu5oRv5wvg/s200/5.jpg" style="cursor: pointer; height: 143px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Yeesh, looks pretty freaky. Since Guy's head was sized and positioned significantly differently from Ryu's, we're going to have to change some things up to make it look normal again.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, still in the Asset Explorer, lets select our newly imported model, right-click and choose 'Extract...' from the menu. Name it something informative--like face.obj--and click 'save.'&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-5Ubm_KkhZg0/Tlb8mmdaeWI/AAAAAAAABAU/sq0ntBjJ1ZA/s1600/7.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644976923044641122" src="http://1.bp.blogspot.com/-5Ubm_KkhZg0/Tlb8mmdaeWI/AAAAAAAABAU/sq0ntBjJ1ZA/s200/7.jpg" style="cursor: pointer; height: 168px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;At this point, you might be asking yourself, "if I'm extracting and converting into an obj anyway, why didn't I just export from Guy's model and import straight into Ryu's model in the Asset Explorer, skipping all this EMGSwap bullshit?" Well, smarty-pants, most files in AE (including the *.obj.emo files we're messing with right now) include an index that includes the location and size of each and every file contained within. The Asset Explorer uses this index to determine what can and can't be extracted/injected safely.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, sloth86's EMGSwap tool rewrites this index for us, so the Asset Explorer can safely extract/inject our borrowed models once EMGSwap has done its thing. Perhaps someday that same functionality will be integrated directly into the Asset Explorer (it's open source, after all), but that day is not today.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, so we've gotten our model swapped in, but it looks like crap and &lt;a href="http://filthypants.blogspot.com/2009/08/beginners-guide-to-sf4-model-editing.html"&gt;we'll need to use model editing to fix it&lt;/a&gt;. I'm not going to spend a lot of time on this part, since you should already know about model editing enough to fix things yourself. For me, Guy's head was the wrong size, so I needed to enlarge it and move it around a bit. I really should edit Ryu's neck to meet the head, too, but you get the idea...&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-BZ4dTYE3NbQ/Tlb8mVOp8NI/AAAAAAAABAM/SUQGeQYa164/s1600/8.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644976918419337426" src="http://3.bp.blogspot.com/-BZ4dTYE3NbQ/Tlb8mVOp8NI/AAAAAAAABAM/SUQGeQYa164/s200/8.jpg" style="cursor: pointer; height: 180px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-CPdv7VrLFxE/Tlb8mEDJ28I/AAAAAAAABAE/UCbrbbvzwak/s1600/9.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644976913807694786" src="http://2.bp.blogspot.com/-CPdv7VrLFxE/Tlb8mEDJ28I/AAAAAAAABAE/UCbrbbvzwak/s200/9.jpg" style="cursor: pointer; height: 184px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Alright, with my edits in place, the model looks okay, but you'll notice that the skin looks all white and pasty. That's because it's looking to Ryu's first DDS texture, which corresponds to--you guessed it--his duffel bag. This is actually convenient for my purposes, since I can just replace the duffel texture with my donor texture. Thus, I won't need to edit a bunch of DDS references using sloth86's DDSREFEDIT tool, but you probably will (hence, why I included it in the tools you'd need to download).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm only going to use it a little, but I'll try to tell you more about it when the time comes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the meantime, we need to create some new texture and normal map containers to go with our new model. To do it, we'll use Kensou's sf4tool, &lt;a href="http://filthypants.blogspot.com/2011/07/how-to-create-high-resolution-textures.html"&gt;just like in this earlier tutorial I made&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Open your donor's *.col.emb and *.nml.emb files in the Asset Explorer, find the textures that correspond to your donated model, right-click and choose to 'Extract...' them. Name them something informative (I used 'Guy.dds' and 'Guynmap.dds') and click 'save.'&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next, open your recipient's *.col.emb and *.nml.emb files in the Asset Explorer an extract *ALL* of his or her DDS textures. Be sure to name them something informative so you can remember which order they're stored (1.dds, 2.dds, etc. and 1nmap.dds, 2nmap.dds, etc. work well).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, as per the aforementioned tutorial, create new *.col.emb and *.nml.emb files with your donated textures in the first position. (I actually replaced my recipient's first textures, so the order for mine was Guy.dds, 2.dds, etc. and Guynmap.dds, 2nmap.dds, etc.) EDIT: I used the first position, but apparently the *last* position is more likely to work...?&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-uTQ1_b5lbq4/Tlb8mLu_MsI/AAAAAAAAA_8/pxB0_AzTWtI/s1600/10.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644976915870593730" src="http://4.bp.blogspot.com/-uTQ1_b5lbq4/Tlb8mLu_MsI/AAAAAAAAA_8/pxB0_AzTWtI/s200/10.jpg" style="cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;At this point, you would run the DDSREFEDIT tool and input the number '0' into the 'new texture map' field and '1' into the 'new normal map' fields (assuming your recipient only had a single texture to begin with; this isn't the case with shoto original costumes, though, so count the textures if you need to, according to the instructions in the program; I had to use '5' for the normal map number), your modified *.obj.emo file in the 'Input EMO file' field, and the number of your recipient's replaced model in the EMG # field (in my case, it was '12'). You would then check the box for '+1 to every other normal map references' (this last bit was unnecessary for me because I replaced the duffel bag normal map with the donated normal map).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was my result:&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-atG4W4S4aWQ/Tlb8lrnXAOI/AAAAAAAAA_0/VHakQd5qrL4/s1600/11.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5644976907248664802" src="http://2.bp.blogspot.com/-atG4W4S4aWQ/Tlb8lrnXAOI/AAAAAAAAA_0/VHakQd5qrL4/s200/11.jpg" style="cursor: pointer; height: 189px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Anyway, if this last part seems confusing, don't worry about it. I'll be making another tutorial that goes over the texture reassignment tool using a more typical example in the future. In the meantime, try your best, share your work and ALWAYS MAKE BACKUPS.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-5584938720499928957?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/5584938720499928957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=5584938720499928957' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/5584938720499928957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/5584938720499928957'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/08/intermediate-guide-to-sf4-emg-model.html' title='Intermediate Guide to SF4 EMG (Model) Swapping'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-vydh7S-QhUk/Tlb9NBdhleI/AAAAAAAABBE/LZ8M9QmLKZM/s72-c/1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-8570742379578142735</id><published>2011-08-12T09:38:00.000-07:00</published><updated>2011-08-15T05:52:43.360-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oneiric ocelot'/><category scheme='http://www.blogger.com/atom/ns#' term='thinkpad'/><category scheme='http://www.blogger.com/atom/ns#' term='x120e'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='lenovo'/><title type='text'>Test Driving Oneiric Ocelot on ThinkPad X120e</title><content type='html'>It's that time again. With another Ubuntu release looming on the horizon, I decided to upgrade my netbook to the latest daily build (8/12/11) of Ubuntu 11.10 Oneiric Ocelot, which is still in alpha stage.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Installation&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;&lt;br /&gt;&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Installation was unchanged from 11.04, so much so, in fact, that it even says "Welcome to Natty Narwhal" :P&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As with Natty, installation was quick and easy, with the option to download updates in the background as you go. As before, personalization questions were presented *after* installation had already begun, which saves even more time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;First Impressions&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The login screen has changed a bit, and now looks really snazzy, with a stylish dot motif in the background. There's an option to select a Guest Account, along with the option to use the new 2D/non-accelerated Unity desktop, which I believe is powered by the Enlightenment libraries. This 2D desktop supports true transparency, which is nice.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Drivers&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The jockey-powered "Additional Drivers" utility automatically found the binary driver for my wireless, which is the nonstandard Broadcom chipset option, so all I had to do is tell it to activate it. &lt;b&gt;CORRECTION&lt;/b&gt;: My wireless driver was enabled, but  not working. On returning to jockey, the driver was listed as not installed and if I tried to enable it, it would give me the error:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;SystemError: E:Unable to correct problems, you have held broken packages.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;This suggests that my packages were installed, but somehow got messed up. To fix it, I had to find out which packages for my chipset were installed, by typing:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;dpkg -l | grep roadcom&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;(notice, I searched for 'roadcom,' which will catch packages with both 'broadcom' and 'Broadcom' in the title and/or description. This is important, as the bcmwl-kernel-source package will not show up if you search for 'broadcom' alone.) Then remove them entirely by typing&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;sudo apt-get purge [package names from the previous command]&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Reboot, then try the 'Additional Drivers' utility again. It should successfully enable the driver, then you can reboot again and everything should be working properly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you got the standard chipset, it should use the open source driver by default. The default video driver is the Gallium-3D-driven open source driver, but I chose to install the proprietary fglrx driver from AMD via the driver utility.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Audio seems fine and my HDMI audio hardware and output were both recognized from the start. The headphone jack also properly mutes the internal speakers when headphones are plugged in, which is an improvement over my experience with Natty.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Waking from suspend seems fine, too, though hibernation still seems to be a no-go. :(&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Applications&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The default email client is now Thunderbird, which works well with Firefox, the default browser, and the default music client is now banshee (this may not have been a new change; I can't really remember...).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The built-in search tool for Unity is much improved, with little icons down at the bottom of the window for choosing whether to search everything, just files and folders, just applications, or just search your music collection.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Everything seems to be fine so far, a solid improvement over Natty on these machines. I'll post back if I run into any problems. If you have any questions or experience any problems, post a comment!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-8570742379578142735?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/8570742379578142735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=8570742379578142735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/8570742379578142735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/8570742379578142735'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/08/test-driving-oneiric-ocelot-on-thinkpad.html' title='Test Driving Oneiric Ocelot on ThinkPad X120e'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-4853925199840515222</id><published>2011-07-31T17:05:00.000-07:00</published><updated>2011-08-27T07:23:31.544-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speaker'/><category scheme='http://www.blogger.com/atom/ns#' term='horn'/><category scheme='http://www.blogger.com/atom/ns#' term='DIY'/><category scheme='http://www.blogger.com/atom/ns#' term='backloaded'/><title type='text'>My DIY Backloaded Horn</title><content type='html'>&lt;div&gt;Over the past 6 months or so, I've been researching and ultimately building a pair of backloaded horns. At the time of this writing, I've only actually finished one of them, but I decided to go ahead and make a post about it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My Phase Technology Teatro 7.5s sound great, but they're pretty weak on the low-end. I've been supplementing with a shitty powered subwoofer scavenged from a boxed 5.1 surround system, but it just doesn't cut it, unfortunately, so I decided to build some speakers that would cover it a little better.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since getting my upper-mid horns and hearing their clarity and definition, I wanted to go with another horn for the bass, if possible. I've seen a lot of really &lt;a href="http://www.goodsoundclub.com/Site_Images/EbayBassHorn1.jpg"&gt;crazy&lt;/a&gt;, &lt;a href="http://community.klipsch.com/forums/storage/3/1422676/Goto%20horn%2030%20Hz%201%20-%20119967916.jpg"&gt;gigantic&lt;/a&gt; basshorns on the internet and wanted to avoid the size that would be required to reach below 100 Hz with a compression driver--not to mention the batshit crazy prices that large-scale compression drivers go for on eBay and Audiogon--so I decided to look into backloaded horns.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ideally, a horn should be as long as the wavelength of the lowest frequency you wish to reproduce, with a mouth of approximately that same diameter, thus bass horns have to be gigantic to reach low frequencies. You can cheat a little, though, by placing the horn against the floor and/or wall of your room, which lets you cut the wavelength requirement by half for each surface, as it uses the walls/floor as if they were a part of the horn. Furthermore, backloaded horns are typically folded horns, which lets them squeeze a lot of length into a relatively small package. Finally, by starting with a large cone driver, your required horn length is reduced further still.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I used &lt;a href="http://www.mcmelectronics.com/product/55-2950&amp;amp;t=1"&gt;this 8" driver&lt;/a&gt; for the horns, based on their high sensitivity, though &lt;a href="http://www.mcmelectronics.com/product/55-1295&amp;amp;t=1"&gt;these would also be an excellent alternative&lt;/a&gt;. If you don't plan to supplement the horns with a tweeter like I intend to do, you might also consider using a full-range driver, &lt;a href="http://www.parts-express.com/pe/showdetl.cfm?Partnumber=295-346"&gt;like this one&lt;/a&gt;, though it is obviously more expensive. &lt;a href="http://www.mcmelectronics.com/product/55-2421&amp;amp;t=1"&gt;This driver&lt;/a&gt; is another good option if you want to play at high volumes, due to its high power handling and *huge* cone excursion.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I came up with my own design for the horn itself, based loosely on some designs I found around online. However, most of the designs I found have the mouth of the horn opening into the wall, which I was afraid would deaden the sound, based on how directive my upper mid horns are. So, I tweaked those designs a bit and ended up with something I could construct out of a single sheet of 4'x8' of wood (MDF [medium-density fiberboard] is the best for speakers, but it's heavy, expensive and rough on your tools; particleboard is a good compromise, IMO, insofar as it is very cheap, but with many of the same characteristics as the more expensive MDF; plywood works, too, but it's ugly).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I used 1/2" particleboard, though TBH, 3/4" would probably have been a better choice, both for rigidity and sound isolation. The sides are 2'x4', the back is 1'x4' and everything else is 1'x2' (i.e., the front, the top/bottom and the interior partitions; the last piece is cut in half and glued together at a right angle). I'm not going to go into much detail about the actual construction, since I'm a shitty carpenter and I'm sure you can find better instructions on box-making online than I could ever provide. Anyway...&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-3BiXC7J_sNE/Tlj863diSMI/AAAAAAAABBM/BZT6A_Jyqfo/s1600/shell%2Bsmall.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-3BiXC7J_sNE/Tlj863diSMI/AAAAAAAABBM/BZT6A_Jyqfo/s200/shell%2Bsmall.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5645540221159360706" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Glue the pieces together using wood glue, and don't be afraid to really gob it on. You want it to seep into all of those little nooks and crannies in the wood and form a good seal. You can see the excess squeezing out from under the board in this pic:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-2E4dL_M1C28/TjYafQmdMaI/AAAAAAAAA_M/BviHimaOxyU/s1600/2011-07-29%2B16.07.03.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-2E4dL_M1C28/TjYafQmdMaI/AAAAAAAAA_M/BviHimaOxyU/s200/2011-07-29%2B16.07.03.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5635721108035285410" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;To be sure that the junctions are all airtight and won't be leaking air into each adjacent chambers, you can follow behind with silicone caulk or "liquid nails" formulated for wood, which is what I used:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-IC573C6qkKc/TjYafRftPkI/AAAAAAAAA_U/sUpU1d7kdoA/s1600/2011-07-29%2B16.09.32.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-IC573C6qkKc/TjYafRftPkI/AAAAAAAAA_U/sUpU1d7kdoA/s200/2011-07-29%2B16.09.32.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5635721108275412546" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;If you look closely, you can also see the right-angle brackets I used to reinforce the box structure.&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-v4dpQNjSZ2A/TjYafMuKJxI/AAAAAAAAA_E/4ytUtldBNRg/s1600/2011-07-28%2B19.49.45.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-v4dpQNjSZ2A/TjYafMuKJxI/AAAAAAAAA_E/4ytUtldBNRg/s200/2011-07-28%2B19.49.45.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5635721106993850130" style="cursor: pointer; width: 200px; height: 144px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;After all of the interior structure is glued solidly into place, you can glue the other side panel to seal the cabinet shut. I used the liquid nails instead of wood glue to seal it, with a bunch of cinder blocks, books, records, etc. piled on top to get a good connection while the goo dries:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-gvGUF-sLf8s/TjYafrhkA8I/AAAAAAAAA_c/eLml5H0sStM/s1600/2011-07-30%2B09.09.50.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-gvGUF-sLf8s/TjYafrhkA8I/AAAAAAAAA_c/eLml5H0sStM/s200/2011-07-30%2B09.09.50.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5635721115262518210" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;One thing to remember before sealing the cabinet: go ahead and thread some speaker wire through because it'll be much easier now than if you wait. If you do forget (like I did, actually), you can tie the wire around something (I used my dog's Kong toy), drop it into the speaker hole and then flip the whole thing around until it pops out the mouth of the horn. This is harder than it sounds, though, because these horns are gigantic and heavy as shit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another bit of advice, do your painting *after* your gluing  (unlike me), so you don't have to worry about excess glue spilling over onto your fancy paint job.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Most of the projects I've seen online make a big deal about filling any cavities with sand or kitty litter so they don't turn into resonance chambers, but I don't really notice any problems and I did not do it. Of course, YMMV.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, here's the finished product:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-Uko1q7xPt-k/TjYafmBcW-I/AAAAAAAAA_k/DRnkhR0irVw/s1600/2011-07-31%2B20.39.14.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-Uko1q7xPt-k/TjYafmBcW-I/AAAAAAAAA_k/DRnkhR0irVw/s200/2011-07-31%2B20.39.14.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5635721113785621474" style="cursor: pointer; width: 150px; height: 200px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;You can see my small upper mid horn perched on top. You can also see the speaker wire dangling out of the mouth of the horn, since I haven't purchased proper binding posts yet (maybe never...).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As far as the sound, the bass response is considerably more potent than I expected. The driver works as a direct radiator (so better quality drivers will make a noticeable difference in sound quality), while the low frequencies bounce around inside and bellow out of the horn's mouth. The horn produces some of the clearest, most defined bass I've ever encountered, though it is definitely lacking above 1 kHz. That in mind, I intend to pair it with either &lt;a href="http://www.parts-express.com/pe/showdetl.cfm?partnumber=277-112&amp;amp;source=googleps"&gt;this tweeter&lt;/a&gt; or &lt;a href="http://www.parts-express.com/pe/showdetl.cfm?PartNumber=277-110"&gt;this one&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One last picture of the finished horn, this time from the side:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-J0b7a9syfY0/TjYkw2FYfbI/AAAAAAAAA_s/P7xsqTmWFaY/s1600/2011-07-31%2B20.39.44.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-J0b7a9syfY0/TjYkw2FYfbI/AAAAAAAAA_s/P7xsqTmWFaY/s200/2011-07-31%2B20.39.44.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5635732405271166386" style="cursor: pointer; width: 150px; height: 200px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;The depth is really what makes these guys huge. Special thanks to my wife, who is gracious and long-suffering :-P&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-4853925199840515222?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/4853925199840515222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=4853925199840515222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/4853925199840515222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/4853925199840515222'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/07/my-diy-backloaded-horn.html' title='My DIY Backloaded Horn'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-3BiXC7J_sNE/Tlj863diSMI/AAAAAAAABBM/BZT6A_Jyqfo/s72-c/shell%2Bsmall.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-8997867339749521196</id><published>2011-07-28T15:12:00.000-07:00</published><updated>2011-07-28T15:44:50.398-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>How to Create High-Resolution Textures in SSF4AE - PC</title><content type='html'>&lt;div&gt;This tutorial covers how to create *.col.emb files from scratch using Kensou's Tools. These files can contain any number or variety of DDS textures of any size/resolution or compression type (DXT*). The most common usage for this is to create textures that are higher resolution than the default textures, but it can be used for other purposes, as well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sensibeat's tutorial for making high-resolution textures is much more informative, but requires a level of comfort working with hexadecimal code and calculations. This method is considerably easier but you should still try to understand sensibeat's instructions since the same techniques are helpful in other aspects of modding.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, lets get started. All you need are &lt;a href="http://sf4viewer.sourceforge.net/"&gt;piecemontee's Asset Explorer&lt;/a&gt; and &lt;a href="http://www.mediafire.com/?wogi4znx2nn"&gt;Kensou's sf4tool&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 1.&lt;/big&gt;&lt;/b&gt; Open a *.col.emb file in the Asset Explorer and extract the DDS textures. Name them something simple that reflects the order they're supposed to come in (I like to use 1.dds, 2.dds, etc.).&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-katsqszAzC4/TjHibJIk1dI/AAAAAAAAA-8/apIjlVbxX5A/s1600/1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-katsqszAzC4/TjHibJIk1dI/AAAAAAAAA-8/apIjlVbxX5A/s200/1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5634533564753434066" style="cursor: pointer; width: 200px; height: 169px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 2.&lt;/big&gt;&lt;/b&gt; Open the DDS textures in a paint/editing program, such as Photoshop or GIMP, and scale them to the desired resolution. In this case, I'm scaling a bunch of 512x512 textures up to 1024x1024.&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-olFT_FORpLA/TjHia8m3KNI/AAAAAAAAA-0/ihERf1E9GGw/s1600/2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-olFT_FORpLA/TjHia8m3KNI/AAAAAAAAA-0/ihERf1E9GGw/s200/2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5634533561390803154" style="cursor: pointer; width: 200px; height: 146px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 3.&lt;/big&gt;&lt;/b&gt; Save the textures as new DDS files with any compression you like. This is your opportunity to change, for example, DXT1 textures into DXT5 to allow for semi-tranparency.&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-KhewvjxekfE/TjHian7HapI/AAAAAAAAA-s/LMrrqZzHs0I/s1600/3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-KhewvjxekfE/TjHian7HapI/AAAAAAAAA-s/LMrrqZzHs0I/s200/3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5634533555838610066" style="cursor: pointer; width: 200px; height: 134px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 4.&lt;/big&gt;&lt;/b&gt; Now, open the directory for Kensou's sf4tool.exe (NOT sf4toolnew.exe). If you don't have a directory named 'emb' in there, create it now, and then put your enlarged DDS textures into it. Next, run sf4tool.exe by double-clicking it.&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-nIRJq3SQXxU/TjHiaVxR7hI/AAAAAAAAA-k/NXgxqXsmF10/s1600/4.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-nIRJq3SQXxU/TjHiaVxR7hI/AAAAAAAAA-k/NXgxqXsmF10/s200/4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5634533550965517842" style="cursor: pointer; width: 200px; height: 156px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 5.&lt;/big&gt;&lt;/b&gt; In the big file-directory pane on the upper-right of the window, double-click on your emb directory and click on the left-hand button underneath the big pane. The smaller pane to the left should populate with your files. Put them in the proper order by changing the filenames in the smaller pane (you can just click in there and type) and then click on the right-hand button to bundle them all together.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 6.&lt;/big&gt;&lt;/b&gt; Back in your 'emb' directory, you should have a new file called 'newpack.emz.' Rename it to match the col file you're trying to create, in my case GKI_01_01.col.emb.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All set! The *.col.emb file you're left with is formatted a little strangely and contains some garbage hex in the index and at the end of the file, but AE doesn't seem to care, so neither do I. :P&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can now use the Asset Explorer to extract/inject textures from your new file using the new textures as a base for mods.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-8997867339749521196?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/8997867339749521196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=8997867339749521196' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/8997867339749521196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/8997867339749521196'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/07/how-to-create-high-resolution-textures.html' title='How to Create High-Resolution Textures in SSF4AE - PC'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-katsqszAzC4/TjHibJIk1dI/AAAAAAAAA-8/apIjlVbxX5A/s72-c/1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-3097310829100813089</id><published>2011-07-07T21:18:00.000-07:00</published><updated>2011-09-19T12:43:40.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sensibeat'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>Sensibeat's cmn File Size Editing Tutorial (Also Applicable to Other emz Bundles)</title><content type='html'>&lt;b&gt;cmn.emz file size editing tutorial&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So now we want to copy some file in our cmn.emz.&lt;br /&gt;&lt;br /&gt;We need the Length of the file.&lt;br /&gt;Calculate it or easier, just open the file in the hexadecimal editor, the last offset number is our Length.&lt;br /&gt;&lt;br /&gt;I want to "inject" an edited HWK.fce.ema&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i54.tinypic.com/sc9gmx.jpg" /&gt;&lt;br /&gt;Last offset is 7BA97 so our Length will be 97 BA 07 00&lt;br /&gt;&lt;br /&gt;Note that it's smaller than ZGF.fce.ema but it works the same with bigger files.&lt;br /&gt;&lt;br /&gt;Now let's find the ZGF.fce.ema location (search works well too but let's use our new knowledge)&lt;br /&gt;TB = 9C5C28+38 = 9C5C60&lt;br /&gt;The true beginning of the #EMA is at offset 9C5C60&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i56.tinypic.com/ip89at.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;I select the full file&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i55.tinypic.com/20f9hqw.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;I overwrite it with the HWK.fce.ema file&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i52.tinypic.com/vrd9nn.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;I insert blanks (00) to make the next #EMA begin at the start of a line (like it was)&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i54.tinypic.com/i51w84.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now I know there are 3 files after the one I inserted (Thx to piecemontee's AE) that were moved by my changes.&lt;br /&gt;I need to check the TBs of the #EMA #BAC #BCM + the TBs of the files at the end:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i54.tinypic.com/t98qqg.jpg" /&gt;&lt;br /&gt;#EMA TB: A41700&lt;br /&gt;A41700 - 40 (CL) = &lt;span style="text-decoration: underline;"&gt;A416C0 (RL)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i52.tinypic.com/24y7kw9.jpg" /&gt;&lt;br /&gt;#BAC TB: A5B6A0&lt;br /&gt;A5B6A0 - 48 (CL) = &lt;span style="text-decoration: underline;"&gt;A5B658 (RL)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i51.tinypic.com/10pvh4m.jpg" /&gt;&lt;br /&gt;#BCM TB: A826B0&lt;br /&gt;A826B0 - 50 (CL) = &lt;span style="text-decoration: underline;"&gt;A82660 (RL)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i54.tinypic.com/r9pzpe.jpg" /&gt;&lt;br /&gt;ZGF.skl.emo TB: A843E0&lt;br /&gt;ZGF.skl.emm TB: A843EC&lt;br /&gt;ZGF.obj.ema TB: A843F8&lt;br /&gt;ZGF.fce.ema TB: A84404&lt;br /&gt;ZGF.cam.ema TB: A84410&lt;br /&gt;ZGF.bac TB: A8441C&lt;br /&gt;ZGF.bcm TB: A84424&lt;br /&gt;&lt;br /&gt;We need to enter the Length of the new fce.ema (other lengths didn't change), and new RLs and TBs backwards:&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i56.tinypic.com/ilbnn7.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Et voilà.&lt;br /&gt;&lt;img alt="[IMG]" class="bbCodeImage LbImage" src="http://i54.tinypic.com/v741sh.jpg" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-3097310829100813089?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/3097310829100813089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=3097310829100813089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3097310829100813089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3097310829100813089'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/07/sensibeats-cmn-file-size-editing.html' title='Sensibeat&apos;s cmn File Size Editing Tutorial (Also Applicable to Other emz Bundles)'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i54.tinypic.com/sc9gmx_th.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-2448556828634857613</id><published>2011-07-07T21:07:00.000-07:00</published><updated>2011-07-28T08:01:49.921-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sensibeat'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>Sensibeat's Model Swapping Tutorial (Updated)</title><content type='html'>&lt;div&gt;&lt;b&gt;&lt;i&gt;Updated Version:&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(20, 20, 20); font-family: Helvetica, Arial, sans-serif; font-size: 15px; line-height: 20px; "&gt;&lt;span style="margin-top: 0px; text-decoration: underline; "&gt;&lt;b&gt;Swapping objects&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (SSF4AE)&lt;/b&gt;&lt;br /&gt;&lt;ul style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 2em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; list-style-position: outside; list-style-image: initial; "&gt;&lt;span style="text-decoration: underline; "&gt;piecemonteeSF4explorerV0.37b:&lt;/span&gt; &lt;a href="http://sourceforge.net/projects/sf4viewer/files/0.37%20%28Console%20files%20format%20support%20-%20SuperSF4%29/piecemonteeSF4explorerV0.37b.exe/download" target="_blank" class="externalLink" rel="nofollow" style="color: rgb(29, 98, 151); text-decoration: none; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; margin-top: 0px; margin-right: -3px; margin-bottom: 0px; margin-left: -3px; "&gt;http://sourceforge.net/projects/sf4viewer/files/0.37 (Console files format support - SuperSF4)/piecemonteeSF4explorerV0.37b.exe/download&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; list-style-position: outside; list-style-image: initial; "&gt;&lt;span style="text-decoration: underline; "&gt;hexadecimal editor HxD (free):&lt;/span&gt; &lt;a href="http://mh-nexus.de/en/downloads.php?product=HxD" target="_blank" class="externalLink" rel="nofollow" style="color: rgb(29, 98, 151); text-decoration: none; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; margin-top: 0px; margin-right: -3px; margin-bottom: 0px; margin-left: -3px; "&gt;http://mh-nexus.de/en/downloads.php?product=HxD&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;I'll swap cammy's first costume hat with the 2nd one.&lt;br /&gt;&lt;br /&gt;In sf4explorer I open CMY_02.obj.emo and I "raw dump" (not "extract") the #EMG (cap_lether) (cap_line)&lt;br /&gt;(I name it CMY_02.cap.emg)&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7292/a.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;I open CMY_01.obj.emo and CMY_02.cap.emg in HxD&lt;br /&gt;&lt;br /&gt;In CMY_01.obj.emo I search for the #EMG (F3) containing the "cap"&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7293/b.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;i&gt;(note the offset: &lt;b&gt;670C0&lt;/b&gt;)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I go to the next #EMG (F3)&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7294/c.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;I place the cursor just before that #EMG and I use the "select block" fonction (CTRL+E) using the start offset I noted (&lt;b&gt;670C0&lt;/b&gt;):&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7295/d.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;OK:&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7296/e.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;i&gt;(Note the Length: &lt;b&gt;63F0&lt;/b&gt;)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The #EMG selected in CMY_01.obj.emo, I now "Select All" (CTRL+A) CMY_02.cap.emg and I copy it (CTRL+C).&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7297/f.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;i&gt;(Note the Length: &lt;b&gt;50C0&lt;/b&gt;)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I paste it (CTRL+V) over the #EMG selected in CMY_01.obj.emo&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7298/g.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;OK:&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7299/h.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeQuote" style="margin-top: 1em; margin-right: 140px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(165, 202, 228); border-right-color: rgb(165, 202, 228); border-bottom-color: rgb(165, 202, 228); border-left-color: rgb(165, 202, 228); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; "&gt;&lt;aside&gt;&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; font-style: italic; font-size: 9pt; background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(215, 237, 252); border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;&lt;i&gt;Don't forget to rename the object in the #EMG according to the skin it's swapped onto, here I searched and renamed "cap_lether" and "cap_line" into "cap" (both times) so they'll use the same material in the obj.emm file.&lt;/i&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7337/0.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; " /&gt;&lt;img src="http://seemypic.net/images/normal/7344/002.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; " /&gt;&lt;/blockquote&gt;&lt;/aside&gt;&lt;/div&gt;&lt;b&gt;Let's do some math in hexadecimal:&lt;/b&gt;&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode" style="margin-top: 1em; margin-right: 140px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(217, 217, 217); border-right-color: rgb(217, 217, 217); border-bottom-color: rgb(217, 217, 217); border-left-color: rgb(217, 217, 217); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; "&gt;&lt;div class="type" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; font-size: 11px; font-family: 'Trebuchet MS', Helvetica, Arial, sans-serif; color: rgb(111, 111, 111); background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(217, 217, 217); border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(148, 148, 148); border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;Code:&lt;/div&gt;&lt;pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; font-family: Consolas, 'Courier New', Courier, monospace; line-height: 1.24; word-wrap: normal; font-size: 10pt; background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(237, 242, 246); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; overflow-x: auto; overflow-y: auto; min-height: 30px; max-height: 500px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;63F0 (Length of former #EMG) - 50C0 (Length of new #EMG) = 1330&lt;/pre&gt;&lt;/div&gt;&lt;b&gt;1)&lt;/b&gt; I need to substract &lt;b&gt;1330&lt;/b&gt; in the index at the start of the file for every offset of the #EMGs for every object coming after the "cap", as the new object is smaller than the old one.&lt;br /&gt;&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeQuote" style="margin-top: 1em; margin-right: 140px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(165, 202, 228); border-right-color: rgb(165, 202, 228); border-bottom-color: rgb(165, 202, 228); border-left-color: rgb(165, 202, 228); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; "&gt;&lt;aside&gt;&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; font-style: italic; font-size: 9pt; background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(215, 237, 252); border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;&lt;i&gt;If the new object is bigger than the old, you need to substract the length of the new by the old and &lt;span style="text-decoration: underline; "&gt;add&lt;/span&gt; the result to the index.&lt;/i&gt;&lt;/blockquote&gt;&lt;/aside&gt;&lt;/div&gt;By opening CMY_01.obj.emo in sf4explorer, I can count that the cap is the 10th #EMG so I have to substract 1330 from the 11th #EMG to the last one (22th #EMG).&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7301/j.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;The index of the #EMGs starts at offset 28&lt;br /&gt;From there each block of 8 digits is the offset of one #EMGs minus 30 written backwards 2 digits at a time ("little endian"):&lt;br /&gt;&lt;i&gt;01 23 45 69 in little endian will be 69 45 23 01 in big endian&lt;/i&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7300/i.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;So I'll have to edit the 12 index entries from offset 50 (#EMG 11) to 7F (#EMG 22)&lt;br /&gt;I substract 1330 to the offsets (calculating in hexadecimal and reading offsets in "big endian"):&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode" style="margin-top: 1em; margin-right: 140px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(217, 217, 217); border-right-color: rgb(217, 217, 217); border-bottom-color: rgb(217, 217, 217); border-left-color: rgb(217, 217, 217); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; "&gt;&lt;div class="type" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; font-size: 11px; font-family: 'Trebuchet MS', Helvetica, Arial, sans-serif; color: rgb(111, 111, 111); background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(217, 217, 217); border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(148, 148, 148); border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;Code:&lt;/div&gt;&lt;pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; font-family: Consolas, 'Courier New', Courier, monospace; line-height: 1.24; word-wrap: normal; font-size: 10pt; background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(237, 242, 246); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; overflow-x: auto; overflow-y: auto; min-height: 30px; max-height: 500px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;00 06 D4 80 - 1330 = 00 06 C1 50  00 06 E4 50 - 1330 = 00 06 D1 20  ...  00 0A F1 60 - 1330 = 00 0A DE 30  &lt;/pre&gt;&lt;/div&gt;And I rewrite them backwards ("little endian")&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7302/k.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2)&lt;/b&gt; I need to substract 1330 to 2 more offsets related to the 2nd part of the obj.emo file:&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7303/l.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode" style="margin-top: 1em; margin-right: 140px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(217, 217, 217); border-right-color: rgb(217, 217, 217); border-bottom-color: rgb(217, 217, 217); border-left-color: rgb(217, 217, 217); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; "&gt;&lt;div class="type" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; font-size: 11px; font-family: 'Trebuchet MS', Helvetica, Arial, sans-serif; color: rgb(111, 111, 111); background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(217, 217, 217); border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(148, 148, 148); border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;Code:&lt;/div&gt;&lt;pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; font-family: Consolas, 'Courier New', Courier, monospace; line-height: 1.24; word-wrap: normal; font-size: 10pt; background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(237, 242, 246); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; overflow-x: auto; overflow-y: auto; min-height: 30px; max-height: 500px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;00 0C A7 00 - 1330 = 00 0C 93 D0  00 0C A5 90 - 1330 = 00 0C 92 60  &lt;/pre&gt;&lt;/div&gt;&lt;img src="http://seemypic.net/images/normal/7304/m.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;Let's go to the 2nd offset (minus 20 written backwards, so 00 0C 92 60 + 20 = &lt;b&gt;00 0&lt;/b&gt;&lt;b&gt;C 92 80&lt;/b&gt;), using the goto fonction (CTRL+G):&lt;img src="http://seemypic.net/images/normal/7306/n.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;Here's another index I need to substract 1330 to:&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7307/o.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;From offset C9280 to C92D7, just before the first readable datas (hand_env):&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode" style="margin-top: 1em; margin-right: 140px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(217, 217, 217); border-right-color: rgb(217, 217, 217); border-bottom-color: rgb(217, 217, 217); border-left-color: rgb(217, 217, 217); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; "&gt;&lt;div class="type" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; font-size: 11px; font-family: 'Trebuchet MS', Helvetica, Arial, sans-serif; color: rgb(111, 111, 111); background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(217, 217, 217); border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(148, 148, 148); border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;Code:&lt;/div&gt;&lt;pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; font-family: Consolas, 'Courier New', Courier, monospace; line-height: 1.24; word-wrap: normal; font-size: 10pt; background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(237, 242, 246); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; overflow-x: auto; overflow-y: auto; min-height: 30px; max-height: 500px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;00 0C A5 E8 - 1330 = 00 0C 92 B8  ...  00 0C A6 D1 - 1330 = 00 0C 93 A1  &lt;/pre&gt;&lt;/div&gt;&lt;img src="http://seemypic.net/images/normal/7308/p.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;Save and that's it for the 1st part:&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7309/q.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;Next I'll show how to add dds to the col.emb and nml.emb files and how to link objects in the obj.emo file to the right dds.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(20, 20, 20); font-family: Helvetica, Arial, sans-serif; font-size: 15px; line-height: 20px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(20, 20, 20); font-family: Helvetica, Arial, sans-serif; font-size: 15px; line-height: 20px; "&gt;&lt;span style="margin-top: 0px; text-decoration: underline; "&gt;&lt;b&gt;1) Adding dds to the col.emb (and nml.emb) files&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In sf4explorer, I extract the dds for the cap from CMY_02_01.col.emb&lt;br /&gt;That I name CMY_02_01.dds:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7325/1.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;I open CMY_01.col.emb and CMY_02_01.dds in HXD&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7323/2.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;In CMY_01.col.emb, I add a line of "00" at the end of the index, here:&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7330/3.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;I change this "04" at offset 0C (former number of dds):&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7321/8.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;Into "05" (new number of dds):&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7322/9.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;And I edit the index because I moved all the offsets by 10 with my line of "00":&lt;br /&gt;&lt;i&gt;&lt;img src="http://seemypic.net/images/normal/7335/09.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I add another line of "00" at the end of the file, here:&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7326/4.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;i&gt;(Note the starting offset of the new dds will be: &lt;b&gt;155850&lt;/b&gt;)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I "select All" (CTRL+A) CMY_02_01.dds and copy it&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7324/5.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;i&gt;(Note the Length: &lt;b&gt;555F0&lt;/b&gt;)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I paste it at the end of the file (after the line of "00"):&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7328/6.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;Then I go back to the start of the file to enter the starting offset of the new dds minus 40 writen in "little endian"&lt;br /&gt;(40 = offset where I'll write the new index entry)&lt;br /&gt;00 15 58 50 - 40 = &lt;span style="color: rgb(51, 102, 255); "&gt;00 15 58 10 &lt;span style="color: rgb(0, 0, 0); "&gt;("big endian")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;That gives in "little endian":&lt;/span&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7331/10.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeQuote" style="margin-top: 1em; margin-right: 140px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(165, 202, 228); border-right-color: rgb(165, 202, 228); border-bottom-color: rgb(165, 202, 228); border-left-color: rgb(165, 202, 228); border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; "&gt;&lt;aside&gt;&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; font-style: italic; font-size: 9pt; background-image: url(http://shoryuken.com/forum/styles/srk/xenforo/gradients/category-23px-light.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(215, 237, 252); border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; background-position: 50% 0%; background-repeat: repeat no-repeat; "&gt;&lt;i&gt;If I had added 2 dds the next one would be indexed at offset 48 with its starting offset minus 48 written backwards&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;If there's only one dds and you add one it will be indexed at offset 28 with its starting offset minus 28 written backwards&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;etc...&lt;/i&gt;&lt;/blockquote&gt;&lt;/aside&gt;&lt;/div&gt;Now I add the new dds length written in "little endian" (&lt;span style="color: rgb(51, 102, 255); "&gt;00 05 55 F0&lt;/span&gt;):&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7327/11.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;Save and do the exact same thing with the normal map dds in CMY_01.nml.emb, adding the normal map dds that contains the cap from CMY_02.nml.emb&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline; "&gt;&lt;b&gt;2) Linking objects in the obj.emo file to the right dds&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;dds are ordered from 0 and the normal map dds follow the texture dds, so if you add 1 texture dds, every normal map dds will change number.&lt;br /&gt;I have now 5 texture dds from #0 to #4&lt;br /&gt;and 5 normal map dds from #5 to #9&lt;br /&gt;&lt;br /&gt;I open CMY_01.obj.emo in HxD and do a search on "#EMG" (F3)&lt;br /&gt;Each #EMG has those kind of data outlined here:&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7332/01.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;They contain the links to the dds:&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7342/000.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;The numbers in red are links to the texture dds&lt;br /&gt;The numbers in green are links to the normal map dds&lt;br /&gt;&lt;br /&gt;I have to change all the links to the normal map dds for the 22 #EMG according to the new order of the dds&lt;br /&gt;(I just have to add 1 to every normal map link as we added 1 texture dds)&lt;br /&gt;&lt;i&gt;&lt;img src="http://seemypic.net/images/normal/7336/00.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;And edit the "cap" #EMG to link it to my 2 new dds #4 and #9:&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/7343/001.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;br /&gt;&lt;br /&gt;Save and it's over.&lt;br /&gt;&lt;i&gt;&lt;img src="http://seemypic.net/images/normal/7334/x.jpg" class="bbCodeImage LbImage" alt="[IMG]" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; max-width: 100%; " /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-weight: bold; font-style: italic; "&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;i style="font-weight: bold; "&gt;Original Version:&lt;/i&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Let's put Ryu's hairs on Akuma's (a.k.a. Gouki).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;preparation:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;From GKI_02.obj.emo I dump and rename (included in swap obj.rar):&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;GKI_01.bsr&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GKI_01.nml.emb&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GKI_01.shd.emo&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;They'll be used in kensou's sf4tool to repack the file.&lt;br /&gt;&lt;br /&gt;From RYU_03.cos.emz I dump the hair emg file that I rename as RYU_03.hair.emg (included in swap obj.rar):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Open GKI_02.obj.emo and RYU_03.hair.emg in HxD:&lt;br /&gt;The hair being the last emg of GKI file, we can get the information on it's beginning and ending from these:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6041/01-emglimit.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt;&lt;br /&gt;&lt;div class="type"&gt;Code:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;offset 24 = offset of the list of offsets of names following the last emg:&lt;br /&gt;00 0B A2 70 + 20 = 00 0B A2 90 so the emg finishes at [COLOR="red"]00 0B A2 8F [/COLOR](1 before)&lt;br /&gt;offset 58 = 1st offset of last emg (hair):  00 0A 68 D0 + 30 = [COLOR="red"]00 0A 69 00[/COLOR]&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;Let's use the "Select block" option in HxD:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6044/02-selectblock.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;Now select all of the RYU file and copy/paste it over GKY's selection:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6043/03-prompt.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;OK:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6045/04-pasted.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;Notice the 2 offsets that will need to be rewritten at the beginning of the file:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt;&lt;br /&gt;&lt;div class="type"&gt;Code:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;00 0C 01 70  -20 = 00 0C 01 50  -&amp;gt; backwards: [COLOR="red"]50 01 0C 00[/COLOR] @ offset 24&lt;br /&gt;00 0C 02 20 -&amp;gt; backwards: [COLOR="red"]20 02 0C 00[/COLOR] @ offset 10&lt;/pre&gt;&lt;/div&gt;&lt;div class="bbCodeBlock bbCodeQuote"&gt;&lt;aside&gt;&lt;blockquote&gt;While we are here let's rewrite those references:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6048/05-ref1.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt;&lt;div class="type"&gt;Code:&lt;/div&gt;&lt;pre&gt;e_dtooth 00 0C 01 A4 - 20 = 00 0C 01 84 -&amp;gt; backwards: [COLOR="red"]84 01 0C 00[/COLOR]&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;hair_TG  00 0C 01 F9 - 20 = 00 0C 01 D9 -&amp;gt; backwards: [COLOR="red"]D9 01 0C 00[/COLOR]&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/aside&gt;&lt;/div&gt;Then the 2 offsets at the beginning of the file:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6054/06-ref2.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;So it's good for the emo's references.&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeQuote"&gt;&lt;aside&gt; &lt;blockquote&gt;Note that hair is the last emg, in case of an emg in the middle of others, you would have to rewrite the beginning references (between offset 28 and 5B) of all the following emgs as their starting offset would have moved.&lt;/blockquote&gt;&lt;/aside&gt;&lt;/div&gt;Now let's take a look at the emg's references:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6056/07-ref3.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;span style="color: red"&gt;43&lt;/span&gt; -&amp;gt; former emg is 42&lt;br /&gt;&lt;span style="color: red"&gt;01&lt;/span&gt; -&amp;gt; number of the 2nd texture dds&lt;br /&gt;&lt;span style="color: red"&gt;05&lt;/span&gt; -&amp;gt; number of the 2nd normal map dds&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Save and Rename the file as GKI_01.obj.emo&lt;br /&gt;&lt;br /&gt;Put it in a new folder with:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;GKI_01.bsr&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GKI_01.nml.emb&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GKI_01.shd.emo&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;and only those 4 files.&lt;br /&gt;&lt;br /&gt;Open kensou's sf4tool and go look for your file path in the upper right, then click the left button under the big window:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6051/08-kensou1.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;Notice the files obj.emo and shd.emo are swapped.&lt;br /&gt;Rewrite them in the right order (obj before shd) and click the right button:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6053/09-kensou2.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;Done.&lt;br /&gt;&lt;br /&gt;Rename the newpack.emz into GKI_01.cos.emz and test it ingame with the GKI_01_01.col.emz provided (2nd costume 1st color file edited to be played as 1st costume):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6057/10-gkiryu.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;You've got Akuma with Ryu's hairs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;For swapping smaller objects:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Basically you just have to copy/paste your emg and fill the rest of the former emg with 00's. Then there're just the emg number and the dds references to change. So the swap can be done on the .cos.emz directly.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-2448556828634857613?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/2448556828634857613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=2448556828634857613' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/2448556828634857613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/2448556828634857613'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/07/sensibeats-model-swapping-tutorial.html' title='Sensibeat&apos;s Model Swapping Tutorial (Updated)'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-4036837549700754985</id><published>2011-07-07T21:00:00.000-07:00</published><updated>2011-07-07T21:04:26.546-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sensibeat'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>Sensibeat's .emg File Structure Tutorial</title><content type='html'>From RYU_03.cos.emz I dump the face emg file that I rename as RYU_03.face.emg (included in swap obj.rar):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6018/01-rawdump.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;Notice that the emg is composed of 4 objects sharing 1 name.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;.emg file references&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Let's take a look at RYU_03.face.emg in HxD:&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 04 to 07:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6019/02-off04.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;00 01 01 43&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;number of this emg, former is 00 01 01 42, next is 00 01 01 44&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 10 to 13:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6020/03-off10.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;00 00 02 C7&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;appears on every emg, may be the marker to the starting point of every later offset references&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 14 to 15:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6028/04-off14.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;00 01&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;number of object's name(s)&lt;br /&gt;&lt;br /&gt;offset 1C:&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;00 50&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;no idea what those datas are&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 20 to 21:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6023/05-off20.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;06 66&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;number of vertex (666 in hex = 1638 in dec)&lt;br /&gt;&lt;br /&gt;offset 2E:&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;00 40&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;appears on every emg, no idea what those data are&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 24 to 25:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6025/06-off24.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;00 00 39 64 (+ 10 = 39 74)&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;relative offset (couting from offset 10) of another part of the emg&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 2A to 2B:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6027/07-off2a.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;00 04&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;number of objects&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 2C to 2D:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6029/08-off2c.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;00 70 (+ 10 = 80)&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;relative offset (counting from offset 10) of the list of relative offsets of the objects&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 30 to 5F:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;no idea what those datas are&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 60 to 63:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6030/09-off60.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;00 00 00 54 + 10 = 64&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;relative offset (counting from offset 10) of the 1st object's name dds references (only one here, more references here in case of more objects)&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 64 to 7B:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6031/10-off64.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="bbCodeBlock bbCodeCode"&gt; &lt;br /&gt; &lt;div class="type"&gt;Code:&lt;/div&gt; &lt;br /&gt; &lt;pre&gt;02 00 00 00 00 [COLOR=&amp;quot;red&amp;quot;]02[/COLOR] 80 3F 22 00 80 3F 00 00 00 00 00 [COLOR=&amp;quot;red&amp;quot;]07[/COLOR] 80 3F 22 00 80 3F&lt;/pre&gt; &lt;br /&gt;&lt;/div&gt;dds reference&lt;br /&gt;the 1st number in red points to the texture dds&lt;br /&gt;the 2nd number in red points to the normal map dds&lt;br /&gt;&lt;br /&gt;dds are ordered from 0 (first texture dds) and the normal map dds numbers follow the texture ones&lt;br /&gt;Ryu has 5 texture dds numbered from #0 to #4 and 5 normal map dds numbered from #5 to #9&lt;br /&gt;#2 is the 3rd texture dds&lt;br /&gt;#7 is the 3rd normal map dds&lt;br /&gt; &lt;br /&gt;offset 80 to 8F:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6032/11-off80.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;list of relative offsets (counting from 10) of the objects&lt;br /&gt;&lt;br /&gt; &lt;pre&gt;00 00 00 80 + 10 = 90     1st object&lt;br /&gt;00 00 20 50 + 10 = 20 60  2nd object&lt;br /&gt;00 00 29 D0 + 10 = 29 E0  3rd object&lt;br /&gt;00 00 38 80 + 10 = 38 90  4th object&lt;/pre&gt; &lt;br /&gt;&lt;span style="text-decoration: underline"&gt;offset 3974:&lt;/span&gt; (given at offset 24)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://seemypic.net/images/normal/6033/11-off3974.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;offset of the beginning of the second part of the emg, that I have yet to understand...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-4036837549700754985?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/4036837549700754985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=4036837549700754985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/4036837549700754985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/4036837549700754985'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/07/sensibeats-emg-file-structure-tutorial.html' title='Sensibeat&apos;s .emg File Structure Tutorial'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-2976069110788253017</id><published>2011-07-07T20:54:00.000-07:00</published><updated>2011-07-07T21:18:40.440-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sensibeat'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>Sensibeat's cmn.emz File Structure Tutorial</title><content type='html'>&lt;b&gt;cmn.emz file structure&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I extracted ZGF.cmn.emz in piecemontee's SF4 AE and opened it in my hexadecimal editor:&lt;br /&gt;&lt;img src="http://i56.tinypic.com/33kg0wi.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;I highlighted the references for each data, in bright colors the Relative Location and in faded color, the Length.&lt;br /&gt;So the 16 characters in red are references for #EMO, the 16 in orange are references for #EMM ... etc&lt;br /&gt;&lt;br /&gt;You have to know that those values are read backwards (2 characters at a time)&lt;br /&gt;&lt;br /&gt;In the case of #EMO, let's look at it's Relative Location (in bright red), we read: 60 00 00 00&lt;br /&gt;It means the Relative Location is 00 00 00 60 (60)&lt;br /&gt;&lt;br /&gt;The Rule is: &lt;b&gt;&lt;span style="color: red"&gt;Relative Location (RL) = offset of True Beginning (TB) - offset of Current Reference Location (CL)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We have RL: 60 and CL: 20&lt;br /&gt;TB = RL+CL = 60+20 = 80 (easy one but for later calculations remember we're in hexadecimal)&lt;br /&gt;&lt;br /&gt;The True Beginning of #EMO is at offset: 80&lt;br /&gt;&lt;img src="http://i54.tinypic.com/iliwoy.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;Let's try with #EMM:&lt;br /&gt;We read: E8 8D 02 00&lt;br /&gt;Meaning our RL is: 00 02 8D E8 (28DE8)&lt;br /&gt;We have CL: 28&lt;br /&gt;TB = 28DE8+28 = 28E10&lt;br /&gt;&lt;br /&gt;The True Beginning of #EMM is at offset: 28E10&lt;br /&gt;&lt;img src="http://i54.tinypic.com/2egbe9x.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now let's take a look at our #EMO's Length (in faded red, 1st screen), we read: 88 8D 02 00&lt;br /&gt;It means the length of the file is 00 02 8D 88 (28D88)&lt;br /&gt;&lt;br /&gt;The Rule is: &lt;b&gt;&lt;span style="color: red"&gt;Length (L) = offset of True Ending (TE) - offset of True Beginning (TB)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We have L: 28D88 and TB: 80&lt;br /&gt;TE = L+TB = 28D88+80 = 28E08&lt;br /&gt;&lt;br /&gt;The True Ending of #EMO is at offest: 28E08&lt;br /&gt;&lt;img src="http://i56.tinypic.com/2e3wmsx.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;The last references are the True Beginnings of the files names at the end of the cmn.emz file:&lt;br /&gt;&lt;img src="http://i51.tinypic.com/zvzcli.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;For ZGF.skl.emo we can read: 90 D0 A8 00&lt;br /&gt;Meaning its True Beginning is at offset A8D090&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-2976069110788253017?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/2976069110788253017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=2976069110788253017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/2976069110788253017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/2976069110788253017'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/07/sensibeats-cmnemz-file-structure.html' title='Sensibeat&apos;s cmn.emz File Structure Tutorial'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i56.tinypic.com/33kg0wi_th.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-8644372628679780252</id><published>2011-07-07T20:36:00.000-07:00</published><updated>2011-07-07T20:50:13.906-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><title type='text'>Sensibeat's Col-based Transparency Tutorial</title><content type='html'>So, as many people are asking, and because it may be difficult to find every  informations in the SF4 modding thread (31 pages already), I translated a tutorial I made some time ago on a french forum.&lt;br /&gt;&lt;br /&gt;I used Sakura as an example.&lt;br /&gt;&lt;br /&gt;To make transparency only using col.emz file, 2 steps are required:&lt;br /&gt;- editing the col.emz file with a hexadecimal editor&lt;br /&gt;- editing the Alpha layer of the dds where the texture is&lt;br /&gt;&lt;br /&gt;1) &lt;span style="text-decoration: underline"&gt;edit the col.emz file&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First I use piecemontee's SF4Explorer to identify the objects names and find them easier in the hex-editor&lt;br /&gt;&lt;br /&gt;link: &lt;a href="http://www.mediafire.com/?sharekey=6bbe46263037cdb2b94117dade8fc295e04e75f6e8ebb871" target="_blank" class="externalLink" rel="nofollow"&gt;Free File Hosting Made Simple - MediaFire&lt;/a&gt; (you can get a newer version but this one is enough for names)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;Reminder:&lt;/b&gt;&lt;/big&gt; to see objects names in SF4Explorer we are going to look at the cos.emz file, but it's the col.emz file we are going to edit (both are linked).&lt;br /&gt;This step isn't required, but it's such easier when you know the true names of things, instead of having to look for them one by one, doing blind tests... &lt;br /&gt; &lt;/aside&gt; &lt;br /&gt;Ok... there the skirt was obviously &amp;quot;Skirt&amp;quot;, but &amp;quot;Hatimaki&amp;quot; for her hairband was quite harder to figure...&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i29.tinypic.com/2wcgwt4.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;Now you know the name of the thing you want to edit, open the col.emz of your mod (not the original col.emz, the unarchived one -dat, emb, name it... I rename mine .emz just after I unarchive them to .emb with quickbms-) under a hex-editor and do a search on that name:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i28.tinypic.com/xm49ig.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;Now scroll down a bit to the line &amp;quot;&lt;b&gt;BrushA&lt;/b&gt;&amp;quot;:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i32.tinypic.com/2qippjn.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;See those 40 characters outligned? You'll have to edit them:&lt;br /&gt;&lt;br /&gt;For &lt;b&gt;full transparency&lt;/b&gt; (removing objects, holes, ripped clothes) change them by those 40:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i25.tinypic.com/33w8t8h.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;(I'll test on Sakura's skirt)&lt;br /&gt;&lt;br /&gt;For &lt;b&gt;semi transparency&lt;/b&gt; (Rose's pants) change them by those 40:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i26.tinypic.com/2nbu7ok.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;(I'll test on Sakura's hairband)&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeQuote"&gt; &lt;br /&gt; &lt;aside&gt; &lt;br /&gt;  &lt;br /&gt;  &lt;blockquote&gt;&lt;span style="text-decoration: underline"&gt;Note&lt;/span&gt;: if the object you want to edit doesn't have BrushA or B or C or D... you'll have to find something else to replace (that don't affect the mod too much...)&lt;br /&gt;(you may ask in the &lt;a href="http://forums.shoryuken.com/showthread.php?t=198136" target="_blank" class="externalLink" rel="nofollow"&gt;SF4 modding thread&lt;/a&gt;, tests have already been done on some)&lt;/blockquote&gt; &lt;br /&gt; &lt;/aside&gt; &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ok, now that first step is done, save your col.emz and let's edit that texture.&lt;br /&gt;&lt;br /&gt;2) &lt;span style="text-decoration: underline"&gt;edit the .dds file&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Firstly what is an Alpha layer?&lt;br /&gt;&lt;br /&gt;It's a layer in addition to basic color layers (RGB) that will create transparency (a white layer without colors, only black &amp;amp; white -and shades of grey-).&lt;br /&gt;&lt;br /&gt;You find it here in Photoshop:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i27.tinypic.com/2lieamc.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;If it's here, no problem, your .dds file is in DXT5 format.&lt;br /&gt;If it isn't there, the .dds file should be in DXT1, you'll have to add one yourself.&lt;br /&gt;&lt;br /&gt;To know the DXT format of your .dds files I recommend downloading Windows Texture Viewer from the NVIDIA site: it shows the DXT.&lt;br /&gt;link: &lt;a href="http://developer.nvidia.com/object/windows_texture_viewer.html" target="_blank" class="externalLink" rel="nofollow"&gt;Windows Texture Viewer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="bbCodeBlock bbCodeQuote"&gt; &lt;br /&gt; &lt;aside&gt; &lt;br /&gt;&lt;br /&gt;  &lt;blockquote&gt;&lt;span style="text-decoration: underline"&gt;Warning&lt;/span&gt;: note the DXT format of your dds, a character can have some of different formats (Sakura's hairband is located on a DXT5, her skirt on a DXT1).&lt;br /&gt;If you want to edit a DXT1 (normal without alpha), you'll have to save it as a DXT1 with 1bit alpha (make backups, it erases the texture under the alpha layer edit) or as a DXT5 matching the DXT1 weight (by losing some quality on your textures)&lt;br /&gt;*&lt;br /&gt;Full transparency works if you save in both formats, DXT1 1bit alpha or DXT5.&lt;br /&gt;Semi transparency only works if you save in DXT5.&lt;/blockquote&gt; &lt;br /&gt; &lt;/aside&gt; &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;To show you the effect of &lt;b&gt;semi transparency&lt;/b&gt;, I put a big rectangle with a gradient from white (visible) to black (invisible) on Sakura's hairband:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i27.tinypic.com/kbevwz.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;(on screen: Alpha layer alone)&lt;br /&gt;&lt;br /&gt;To show you &lt;b&gt;full transparency&lt;/b&gt;, I draw some simple shapes on her skirt:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i30.tinypic.com/29d8qi0.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;(on screen: RGB layers and Alpha layer displayed together: the black of the Alpha layer is shown in transparent red under this display mode in Photoshop)&lt;br /&gt;&lt;br /&gt;Then I inject the .dds back in the col.emz file...&lt;br /&gt;&lt;br /&gt;And here is the result:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i31.tinypic.com/s3lsue.jpg" class="bbCodeImage LbImage" alt="[IMG]" /&gt;&lt;br /&gt;&lt;br /&gt;Have fun!&lt;br /&gt;&lt;br /&gt;Credits goes to &lt;a href="http://forums.shoryuken.com/member.php?u=92303" target="_blank" class="externalLink" rel="nofollow"&gt;sn00pee&lt;/a&gt; for all his finds on the subject.&lt;br /&gt;&lt;br /&gt;edit: &lt;br /&gt;&lt;br /&gt;*forgot to mention an important thing:&lt;br /&gt;Full transparency works if you save in both formats, DXT1 1bit alpha or DXT5.&lt;br /&gt;Semi transparency only works if you save in DXT5.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forums.shoryuken.com/member.php?u=92303" target="_blank" class="externalLink" rel="nofollow"&gt;sn00pee&lt;/a&gt; (again) found a way to inject bigger files in .emz without crashing the game &lt;a href="http://forums.shoryuken.com/showpost.php?p=7264070&amp;amp;postcount=714" target="_blank" class="externalLink" rel="nofollow"&gt;here&lt;/a&gt;.&lt;br /&gt;(I think the guy that created Rose Ninja used that method on the *cough*second color*cough*)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-8644372628679780252?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/8644372628679780252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=8644372628679780252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/8644372628679780252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/8644372628679780252'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/07/sensibeats-col-based-transparency.html' title='Sensibeat&apos;s Col-based Transparency Tutorial'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i29.tinypic.com/2wcgwt4_th.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-7585671933072755188</id><published>2011-07-06T08:22:00.000-07:00</published><updated>2011-09-19T12:44:11.204-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>SSF4AE PC Moveset Swap Tutorial</title><content type='html'>Thanks to Capcom's decision to forego emz containers and their associated headaches, moveset swaps are extremely easy to do now and they're not plagued by the "monkeyface" problem we all know so well.&lt;br /&gt;&lt;br /&gt;Here's how you do it:&lt;br /&gt;&lt;b&gt;&lt;big&gt;Step 1:&lt;/big&gt;&lt;/b&gt; Make a backup of your AE installation. If you mess something up, this will save you a lot of time, I promise.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;Step 2:&lt;/big&gt;&lt;/b&gt; Pick 2 characters: 1 whose moveset we'll be taking (the donor) and 1 who will be receiving those moves (the recipient). For this example, I will use Hakan as the donor and Ryu as the recipient (i.e., Ryu with Hakan's moveset).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;Step 3:&lt;/big&gt;&lt;/b&gt; Go to the resource/battle/chara directory and find your donor's folder, in this case HKN. In this folder, copy all of the files from HKN.cam.ema down to HKN.vfx.ttex.emz EXCEPT for HKN.fce.ema and copy them somewhere (a working folder where we have write permissions is appropriate).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;Step 4:&lt;/big&gt;&lt;/b&gt; Rename all of those files we just copied to match our recipient's character prefix, in this case RYU. Now, go back to resource/battle/chara and copy them into our recipient's folder, overwriting the ones that are already there (it's cool, you backed everything up anyway, right? Right??).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;Step 5:&lt;/big&gt;&lt;/b&gt; Now, this is the key step: navigate to your donor's "latest" moveset files, which are located in dlc/03_character_free/battle/regulation/latest/ for normal characters (I'll update this post with the AE character's locations when I get home). Take the donor's bac and bcm files, in this case HKN.bac and HKN.bcm, copy them to our working directory and rename them to our recipient's character prefix.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;Step 6:&lt;/big&gt;&lt;/b&gt; Finally, we take our renamed bac and bcm files and drop them into our recipient's folder in dlc/03_character_free/battle/regulation/latest/ (assuming they're a normal character and not AE-specific), overwriting what's there.&lt;br /&gt;&lt;br /&gt;That's it. All done!&lt;br /&gt;&lt;br /&gt;I'm going to explain a little bit about what we've just done, so read over it if you're interested:&lt;br /&gt;&lt;br /&gt;The actual moves and animations are stored in the .bac and .bcm files, which were previously components of the *.cmn.emz bundles in vanilla SF4. When they were bundled, we had to open the entire bundle in a hex editor and find the desired files and names to edit manually. However, since Capcom stopped using the bundles, we can just rename the files and be done with it.&lt;br /&gt;&lt;br /&gt;Now, you'll notice in step 3 we omitted the *.fce.ema file, which contains the character's face animation data. By doing so, we've let Ryu--our recipient--keep his original face animation data, thus avoiding the monkeyface for the most part.&lt;br /&gt;&lt;br /&gt;Last, I wanted to mention the various revisions of moveset files included in the AE installation. The ones included in the resource/battle/chara directory are the regular, non-AE movesets, which are superseded by the ones located in dlc/03_character_free/battle/regulation/latest/. However, during the challenges/trials, the game reverts to using the SSF4 movesets, which access the resource/battle/chara ones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-7585671933072755188?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/7585671933072755188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=7585671933072755188' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/7585671933072755188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/7585671933072755188'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/07/ssf4ae-pc-moveset-swap-tutorial.html' title='SSF4AE PC Moveset Swap Tutorial'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-6625146448116555744</id><published>2011-06-22T10:07:00.000-07:00</published><updated>2011-07-12T05:34:31.951-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='happ'/><category scheme='http://www.blogger.com/atom/ns#' term='arcade'/><category scheme='http://www.blogger.com/atom/ns#' term='fighter stick'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>Solder-less Happ Button Mod for Mad Catz SE Fight Stick</title><content type='html'>I actually performed this mod about a year ago on my own stick, but never published the pictures or process until now because I didn't think anyone would be interested. However, I've noticed a few threads on the Shoryuken forums with individuals asking for "clickier" alternatives to the sensitive-yet-mushy Sanwa and Seimitsu buttons that are currently preferred by most players, and Happ's products fill that niche quite nicely.&lt;div&gt;&lt;br /&gt;Before I dive in with the mod itself, I'm going to take a few moments to talk about differences between Japanese- and American-style arcade buttons and why someone might prefer one over the other. I'll try to be as objective as possible. If you already know or don't care, feel free to skip straight to the tutorial and pics.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;Background&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;American-style buttons--specifically those from arcade part manufacturers Happ and IL--use a plunger positioned atop a &lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/SjQp-gOY-2I/AAAAAAAAASo/8gcwTQKQ87g/s1600-h/cherry+switch.JPG"&gt;Cherry microswitch&lt;/a&gt;, which produces a tangible and audible click when depressed. Japanese-style buttons, on the other hand, use a silent, low-resistance switch that provides little-to-no feedback as to when a button press is registered to the system. This is not to say that Japanese-style buttons are not sensitive, as they are actually significantly more sensitive than the Happ designs, there is simply no indication from the button itself as to when it will register.&lt;br /&gt;&lt;br /&gt;Overall, Happ buttons seem to be popular with individuals who also like clicky, mechanical keyboards (like the venerable IBM Model M keyboard, which I use at home), as well as folks who grew up with the American arcade scene (i.e., "old farts," as the kids like to call us).&lt;br /&gt;&lt;br /&gt;With that out of the way, lets get started. Some people have laughed at this mod for being "ghetto," but I'll take that over those tacky, overwrought custom sticks so many people seem to favor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, as it says in the title, this is a solder-less mod, but you'll still need some additional items (Note: this is a button-only mod; putting a Happ stick into an SE is a much bigger undertaking and I don't recommend attempting it unless you are an experienced modder)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;What You'll Need&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;1. Phillips-head screwdriver.&lt;/big&gt;&lt;/b&gt; To remove the screws from the bottom of the case.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;2. Buttons.&lt;/big&gt;&lt;/b&gt; I recommend the &lt;a href="http://www.lizardlick.com/Competition-Pushbuttons_c_170.html"&gt;Happ Competition&lt;/a&gt; pushbuttons, which have a low travel distance and convex shape, similar to Japanese-style buttons, but with that same satisfying click as the &lt;a href="http://www.lizardlick.com/Classic-Buttons_c_171.html"&gt;Happ Classics&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;3.  &lt;a href="http://4.bp.blogspot.com/_Kzdww8T9fUA/SjQtaO7xu1I/AAAAAAAAASw/SfeSpjTr1iw/s1600-h/quick+release.JPG"&gt;.187 quick-disconnects&lt;/a&gt;.&lt;/big&gt;&lt;/b&gt; These connect the stick's board to your buttons. The Japanese-style buttons use .110 quick-disconnects, which are too small for your mighty Happ buttons.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;4. Wire.&lt;/big&gt;&lt;/b&gt; Somewhere around 14 to 16 gauge is good, even a little thicker or thinner should be fine, though you'll want to make sure your quick-releases can grab them properly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;5. Cardboard box.&lt;/big&gt;&lt;/b&gt; This will be used to make a spacer to provide room for your long-ass American buttons, which run deeper than their Japanese counterparts (/innuendo).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;6. Glue.&lt;/big&gt;&lt;/b&gt; For the aforementioned spacer, which needs to be 2 layers deep. Pretty much any glue should be fine, but you want it to be pretty strong and thick. I used wood glue.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;7. Optional.&lt;/big&gt;&lt;/b&gt; You can use special solderless connectors--&lt;a href="http://www.google.com/search?um=1&amp;amp;hl=en&amp;amp;biw=1346&amp;amp;bih=862&amp;amp;tbm=isch&amp;amp;sa=1&amp;amp;q=solderless+splice&amp;amp;oq=solderless+splice&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;gs_sm=e&amp;amp;gs_upl=5792l6464l0l6l5l0l4l0l0l161l161l0.1l1"&gt;like these&lt;/a&gt;--to join your wires to the stock wires, but I'll show you a little trick later on that works just fine without any connectors.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 1:&lt;/big&gt;&lt;/b&gt; Remove the bottom plate from the stick&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pretty self-explanatory. Just unscrew the 6 screws (2 in the middle and 1 under each of the 4 rubber feet).&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 2:&lt;/big&gt;&lt;/b&gt; Trace the outline of the bottom plate onto your cardboard, twice&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-MxzOIhO4qsY/TgK2fafpOPI/AAAAAAAAA7U/6k6lioEpqgY/s1600/tracing%2B1.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-MxzOIhO4qsY/TgK2fafpOPI/AAAAAAAAA7U/6k6lioEpqgY/s200/tracing%2B1.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5621255935716047090" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Depending on the size of your cardboard, you may have to break down your box. While you're at it, go ahead and draw a second square inside of each, about 1" smaller in each direction.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 3:&lt;/big&gt;&lt;/b&gt; Cut your cardboard&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cut along the lines you just drew such that you have 2x 1" frames of cardboard.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 4:&lt;/big&gt;&lt;/b&gt; Glue the frames together to make your spacer&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-qd3N7LvlR2w/TgK2fj6S91I/AAAAAAAAA7c/9l4_rgZRS-Q/s1600/glue%2Blayers.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-qd3N7LvlR2w/TgK2fj6S91I/AAAAAAAAA7c/9l4_rgZRS-Q/s200/glue%2Blayers.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5621255938243753810" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-pbP5m-haPHk/TgK2gMgkEBI/AAAAAAAAA7s/5WE1uwDW91s/s1600/gluing%2B3.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-pbP5m-haPHk/TgK2gMgkEBI/AAAAAAAAA7s/5WE1uwDW91s/s200/gluing%2B3.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5621255949141676050" style="cursor: pointer; width: 200px; height: 142px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Put your 2 frames together and glue them. This is your spacer, which provides the necessary clearance for your buttons.&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-RoY46vU7i44/TgPgfmvMUVI/AAAAAAAAA8A/xap0dGPMoCE/s1600/glued%2Bspacer.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-RoY46vU7i44/TgPgfmvMUVI/AAAAAAAAA8A/xap0dGPMoCE/s200/glued%2Bspacer.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5621583593467564370" style="cursor: pointer; width: 200px; height: 192px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;For the next couple of steps, which cover removing the old buttons and putting the new ones in, I recommend replacing 1 button at a time so you don't get the wires mixed up. They're color-coded, but if you lose track of which wires go with which button, you'll have to do a bunch of trial-and-error testing at the end to get everything sorted out. Anyway...&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 5:&lt;/big&gt;&lt;/b&gt; Pop out your stock buttons&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They have a little clippy thing that holds them in:&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-gbPld3G6bxg/TgPgfgWCgRI/AAAAAAAAA74/YBLuwklH5nQ/s1600/clips.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-gbPld3G6bxg/TgPgfgWCgRI/AAAAAAAAA74/YBLuwklH5nQ/s200/clips.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5621583591751450898" style="cursor: pointer; width: 200px; height: 192px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;If you press it in with a screwdriver or whatever, you should be able to pop them out without much trouble. Make sure you disconnect the wires from the bottoms first.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 6:&lt;/big&gt;&lt;/b&gt; Connect your new wires to the old button connectors&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can use the aforementioned optional solderless splicers or you can do what I did: strip the end of your new wire, pull back the rubber sleeve thing from the old .110 quick-disconnects, wrap your bare wire around the old quick-disconnects&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-AfDKeQ9ow5Q/TgPggKOAveI/AAAAAAAAA8Q/_sZXPHFaavY/s1600/twisted.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-AfDKeQ9ow5Q/TgPggKOAveI/AAAAAAAAA8Q/_sZXPHFaavY/s200/twisted.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5621583602992070114" style="cursor: pointer; width: 200px; height: 140px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;and then slide the rubber sleeve over the whole thing. The connection will be fine and the sleeve will hold everything in place nice and tight. :D&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-hoIG4Kvxw_I/TgPggebDa8I/AAAAAAAAA8Y/B5sGJA75u2k/s1600/sleeved.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-hoIG4Kvxw_I/TgPggebDa8I/AAAAAAAAA8Y/B5sGJA75u2k/s200/sleeved.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5621583608415480770" style="cursor: pointer; width: 200px; height: 151px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 7:&lt;/big&gt;&lt;/b&gt; Add your new buttons&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not much to this step. Just stick 'em in there, screw on the included nut until it's tight and then clip in the included Cherry microswitch. It's a tight squeeze in the tiny SE case, so you'll want to take that into consideration. Take a look at my finished layout:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-A78RvNzrp8Y/TgPkqgbJbJI/AAAAAAAAA8g/wPPraDouLH4/s1600/button%2Barrangement.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-A78RvNzrp8Y/TgPkqgbJbJI/AAAAAAAAA8g/wPPraDouLH4/s200/button%2Barrangement.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5621588178797948050" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 8:&lt;/big&gt;&lt;/b&gt; Connect your buttons and test it out&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Crimp your .187 quick-disconnects to stripped ends of your new wires and then connect them to your new Happ buttons. One wire connects to the bent post on the side of the microswitch and one connects to the nearest post on the bottom, as shown in the previous pic. Important: if the quick-disconnect on the side touches the bottom plate of your stick, it will ground itself and cause a button press to register (this is bad). To prevent it, you can tape/glue a piece of paper or plastic (I used one of those anti-static bags that an old computer motherboard was shipped in) to the inside of the plate, just to be extra-cautious.&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-6FHolKjqiFE/TgPgf_UDbpI/AAAAAAAAA8I/IApnkJECGPw/s1600/static%2Bbag%2Btaped.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-6FHolKjqiFE/TgPgf_UDbpI/AAAAAAAAA8I/IApnkJECGPw/s200/static%2Bbag%2Btaped.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5621583600064622226" style="cursor: pointer; width: 179px; height: 200px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;At this point, you should be ready to test your buttons out. Make sure the wires are all connected to the correct button (i.e., the buttons execute the correct actions in-game). If any of them act like they're always pressed until you actually press the button (i.e., its response is backwards), then you've attached the wire to the wrong post. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Step 9:&lt;/big&gt;&lt;/b&gt; Replace the bottom plate&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you're sure everything works properly, just cram your wires into place and screw the bottom back on. With the spacer, the screws should be just long enough to catch if you press firmly on the bottom plate. However, they probably won't be able to hold the rubber feet in place securely and you'll probably lose them (though I imagine most of you are like me and have long since lost those rubber feet anyway).&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's what it looks like from the side. Yes, the cardboard is visible (though not particularly noticeable), and yes, people will probably make fun of you for it.&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-4x2BY4YIcj0/TgvXbYsrQaI/AAAAAAAAA8o/W3jJ3YRpjpw/s1600/profile.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-4x2BY4YIcj0/TgvXbYsrQaI/AAAAAAAAA8o/W3jJ3YRpjpw/s200/profile.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5623825425188471202" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;If you have any questions about the process, hit me up in the comments.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;UPDATE:&lt;/big&gt;&lt;/b&gt; Reader sfkingalpha had the clever idea of covering the cardboard edge with duct tape, which greatly improves the appearance compared with nekkid cardboard:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;a href="http://img.photobucket.com/albums/v341/sfkingalfa/the%20stick/3.jpg" target="_blank" style="color: rgb(64, 100, 128); "&gt;http://img.photobucket.com/&lt;wbr&gt;albums/v341/sfkingalfa/the%&lt;wbr&gt;20stick/3.jpg&lt;/a&gt;&lt;br /&gt;&lt;a href="http://img.photobucket.com/albums/v341/sfkingalfa/the%20stick/2.jpg" target="_blank" style="color: rgb(64, 100, 128); "&gt;http://img.photobucket.com/&lt;wbr&gt;albums/v341/sfkingalfa/the%&lt;wbr&gt;20stick/2.jpg&lt;/a&gt;&lt;br /&gt;&lt;a href="http://img.photobucket.com/albums/v341/sfkingalfa/the%20stick/1.jpg" target="_blank" style="color: rgb(64, 100, 128); "&gt;http://img.photobucket.com/&lt;wbr&gt;albums/v341/sfkingalfa/the%&lt;wbr&gt;20stick/1.jpg&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;"Aside from aesthetics, I think this also helps with air tightness and cardboard deterioration!"&lt;/blockquote&gt;Looks great, sfkingalpha!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He was also able to keep his rubber feet by getting longer screws, specifically 3/4 SS panheads.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's his finished product:&lt;/div&gt;&lt;div&gt;&lt;a href="http://img.photobucket.com/albums/v341/sfkingalfa/the%20stick/IMAG0007.jpg"&gt;http://img.photobucket.com/albums/v341/sfkingalfa/the%20stick/IMAG0007.jpg&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://img.photobucket.com/albums/v341/sfkingalfa/the%20stick/IMAG0006.jpg"&gt;http://img.photobucket.com/albums/v341/sfkingalfa/the%20stick/IMAG0006.jpg&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-6625146448116555744?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/6625146448116555744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=6625146448116555744' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6625146448116555744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6625146448116555744'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/06/solder-less-happ-button-mod-for-mad.html' title='Solder-less Happ Button Mod for Mad Catz SE Fight Stick'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-MxzOIhO4qsY/TgK2fafpOPI/AAAAAAAAA7U/6k6lioEpqgY/s72-c/tracing%2B1.JPG' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-6259295891387738320</id><published>2011-06-13T13:32:00.001-07:00</published><updated>2011-06-13T19:18:56.782-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AE'/><category scheme='http://www.blogger.com/atom/ns#' term='vanilla'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><category scheme='http://www.blogger.com/atom/ns#' term='mod'/><title type='text'>Converting Mods Between SF4 Vanilla and AE</title><content type='html'>Note: these instructions were written pre-release and are subject to change. They're based on the file structure used in the Xbox 360 version of Super Street Fighter 4 - Arcade Edition but will hopefully apply to the PC version, as well.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;The biggest, most obvious difference between vanilla and AE is the fact that AE no longer uses the formerly ubiquitous *.emz bundles--*.cos.emz, *.col.emz and *.cmn.emz--around everything. This makes it easier for us to move costumes around within the character folders, as you no longer have to hex edit the files; just rename them and you're all set. It also means we don't have to muck around with the emz indexes, which really served no purpose and were a total hassle to create from scratch, even with Kensou's SF4tool.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Vanilla to AE&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the easier conversion of the two, and the only tool you need is piecemontee's Asset Explorer (aka SF4 Viewer).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To get started, find the file(s) you wish to convert and open them in the Asset Explorer. I'll be using my Santa Rufus mod (both cos and col files included) as an example.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once the files are loaded in the Asset Explorer, click the plus signs to expand them to the point that you see the components of the emz bundles, as pictured:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-j1EkwxpUG6g/TfZ9ke0nIEI/AAAAAAAAA6U/zDyx0GEf8to/s1600/1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-j1EkwxpUG6g/TfZ9ke0nIEI/AAAAAAAAA6U/zDyx0GEf8to/s200/1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5617815650893766722" style="cursor: pointer; width: 200px; height: 169px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Then, just go down the line selecting each component file and then right-clicking and choosing 'Raw dump' from the context menu:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-vwthu-iZ0ro/TfZ9kFMDMsI/AAAAAAAAA6M/ybp89Wt9KpQ/s1600/2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-vwthu-iZ0ro/TfZ9kFMDMsI/AAAAAAAAA6M/ybp89Wt9KpQ/s200/2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5617815644012753602" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Once you have the components busted out of the emz containers, you're all set. Easy, eh?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;AE to Vanilla&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;This one's a little more complicated, but not by much. It also uses just one tool, but this time it's Kensou's SF4tool, which greatly simplifies the creation of emz containers and indexes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, to get started, collect all of the component files from an AE character (*.obj.emo, *.shd.emo, *.nml.emb and *.bsr for a cos.emz bundle, *.obj.emm and *.col.emb for a col.emz bundle or *.skl.emo, *.skl.emm, *.obj.ema, *.fce.ema, *.cam.ema, *.bac and *.bac for a cmn.emz bundle) and put them in an easily-accessible folder (your Desktop works just fine for now). Again, I'll be using my Santa Rufus mod, which I just converted for AE a few minutes ago. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next, we'll open Kensou's SF4tool. If your SF4tool folder does not already have a folder in it named 'emz' go ahead and create one now and drag our desired component files into it. This probably goes without saying, but we have to work with the cos and col components separately; you can't just dump them all in there at once.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, open SF4tool. It should look like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-w88cA9bsano/TfZ9jzVrz1I/AAAAAAAAA6E/WLdEBPc7Vr8/s1600/3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-w88cA9bsano/TfZ9jzVrz1I/AAAAAAAAA6E/WLdEBPc7Vr8/s200/3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5617815639221325650" style="cursor: pointer; width: 200px; height: 156px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Then, in the big window area on the right that shows your file structure, double-click on the emz folder (the one we just created if it didn't exist, remember?) and click the left-hand button (the one crudely circled in red in my screenshot). It should automatically populate the smaller window area with our component files, like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-3MTPT5-mngo/TfZ9jUC5EUI/AAAAAAAAA58/INsQxgdgM2k/s1600/4.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-3MTPT5-mngo/TfZ9jUC5EUI/AAAAAAAAA58/INsQxgdgM2k/s200/4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5617815630821003586" style="cursor: pointer; width: 200px; height: 156px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, Kensou's tool doesn't know the appropriate order for our emz bundles, so we'll have to move some of the components around to suit. Just click right into that little window and edit the entries that are there until they're in the right order. You might want to open a normal vanilla file in the Asset Explorer first to see which order things should be in (obj, shd, nml, and bsr for a cos bundle).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once everything is in order, click on the right-hand button (the one that ends in emb) to bundle everything up. This window should pop up if you did it correctly:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-o1pol8Ka4ag/TfZ9jExMeuI/AAAAAAAAA50/Yisl8g95kgs/s1600/5.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-o1pol8Ka4ag/TfZ9jExMeuI/AAAAAAAAA50/Yisl8g95kgs/s200/5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5617815626720246498" style="cursor: pointer; width: 154px; height: 154px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Now, back in your emz directory, you should have a shiny new file named "newpack.emz." Just rename that to match the numbers of the component files (in my case, CHB_01) and to reflect the type of file you just created (cos, col, cmn, etc) and you should be all set.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(68, 68, 68); font-family: 'Segoe UI', 'Lucida Grande', Arial; line-height: 19px; font-size: small; "&gt; &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-6259295891387738320?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/6259295891387738320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=6259295891387738320' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6259295891387738320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6259295891387738320'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/06/converting-mods-between-sf4-vanilla-and.html' title='Converting Mods Between SF4 Vanilla and AE'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-j1EkwxpUG6g/TfZ9ke0nIEI/AAAAAAAAA6U/zDyx0GEf8to/s72-c/1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-4592253469513724584</id><published>2011-06-05T18:19:00.000-07:00</published><updated>2011-06-05T20:06:30.254-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cg'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='pixel shader'/><title type='text'>Cg Shader Tutorial For Emulators</title><content type='html'>copyright Hans-Kristian "Themaister"&lt;themaister&gt; Arntzen&lt;div&gt;04.06.2011 (reposted with permission)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Introduction&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This document is for a (fresh) shader developer that wants to develop shader programs for use in various emulators. Shader programs run on your GPU, and thus enables very sophisticated effects to be performed on the picture which might not be possible in real-time on the CPU. Some introduction to shader programming in general is given, so more experienced developers that only need reference for the specification may just skip ahead.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Current emulators that supports the specification explained here to a certain degree are:&lt;/div&gt;&lt;div&gt;– SSNES&lt;/div&gt;&lt;div&gt;– Various PlayStation 3 emulators (SNES9x, Genesis GX, FCEU, VBA)&lt;/div&gt;&lt;div&gt;– SNES9x Win32&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are three popular shader languages in use today:&lt;/div&gt;&lt;div&gt;– HLSL (High-Level Shading Language, Direct3D)&lt;/div&gt;&lt;div&gt;– GLSL (GL Shading Language, OpenGL)&lt;/div&gt;&lt;div&gt;– Cg (HLSL/GLSL, nVidia)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The spec is for the Cg shading language developed by nVidia. It «wraps» around OpenGL and HLSL to make shaders written in Cg quite portable. It is also the shading language implemented on the PlayStation 3, thus increasing the popularity of it. The specification itself can be found here:&lt;/div&gt;&lt;div&gt;&lt;a href="https://github.com/Themaister/Emulator-Shader-Pack/blob/master/Cg/README"&gt;https://github.com/Themaister/Emulator-Shader-Pack/blob/master/Cg/README&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;The Rendering Pipeline&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With shaders you are able to take control over a large chunk of the GPUs inner workings by writing your own programs that are uploaded and run on the GPU. In the old days, GPUs were a big black box that was highly configurable using endless amount of API calls. In more modern times, rather than giving you endless amounts of buttons, you are expected to implement the few «buttons» you actually need, and have a streamlined API.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The rendering pipeline is somewhat complex, but we can in general simplify it to:&lt;/div&gt;&lt;div&gt;– Vertex processing&lt;/div&gt;&lt;div&gt;– Rasterization&lt;/div&gt;&lt;div&gt;– Fragment processing&lt;/div&gt;&lt;div&gt;– Framebuffer blend&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We are allowed to take control of what happens during vertex processing, and fragment processing.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;A Cg Program&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you were to process an image on a CPU, you would most likely do something like this:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;for (unsigned y = 0; y &amp;lt; height; y++) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;for (unsigned x = 0; x &amp;lt; width; x++) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;out_pixel[y][x] = process_pixel(in_pixel[y][x], y, x);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;We quickly realize that this is highly serial and slow. We see that &lt;span class="Apple-style-span"&gt;out_pixel[y][x]&lt;/span&gt; isn't dependent on &lt;span class="Apple-style-span"&gt;out_pixel[y + k][x + k]&lt;/span&gt;, so we see that we can parallelize quite a bit.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Essentially, we only need to implement &lt;span class="Apple-style-span"&gt;process_pixel()&lt;/span&gt; as a single function, which is called thousands, even millions of time every frame. The only purpose in life for &lt;span class="Apple-style-span"&gt;process_pixel()&lt;/span&gt; is to process an input, and produce an output. No state is needed, thus, a «pure» function in CS terms.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the Cg program, we need to implement two different functions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;main_vertex()&lt;/span&gt; takes care of transforming every incoming vertex from camera space down to clip space. This essentially means projection of 3D (coordinates on GPU) down to 2D (your screen). Since we're dealing with old school emulators here, which are already 2D, the vertex shading is very trivial.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vertex shaders get various coordinates as input, and &lt;b&gt;&lt;i&gt;uniform&lt;/i&gt;&lt;/b&gt;s. Every vertex emitted by the emulator is run through &lt;span class="Apple-style-span"&gt;main_vertex&lt;/span&gt; which calculates the final output position. For our emulators this is just 4 times, since we're rendering a quad on the screen :D 3D games would obviously have a lot more vertices.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While coordinates differ for each invocation, &lt;b&gt;&lt;i&gt;uniform&lt;/i&gt;&lt;/b&gt;s are constant throughout every call. Think of it as a global variable that you're not allowed to change.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vertex shading can almost be ignored altogether, but since the vertex shader is run only 4 times, and the fragment shader is run millions of times per frame, it is a good idea to precalculate values in vertex shader that can later be used in fragment shader. There are some limitations to this which will be mentioned later.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;main_fragment()&lt;/span&gt; takes care of calculating a pixel color for every single output pixel on the screen. If you're playing at 1080p, the fragment shader will have to be run 1920 * 1080 times! This is obviously straining on the GPU unless the shader is written efficiently.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Obviously, &lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;main_fragment&lt;/span&gt; &lt;/span&gt;is where the real action happens. For many shaders we can stick with a «dummy» vertex shader which does some very simple stuff.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The fragment shader receives a handle to a texture (the game frame itself), and the texture coordinate for the current pixel, and a bunch of uniforms.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A fragment shaders final output is a color, simple as that. Processing ends here.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Hello World!&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;&lt;br /&gt;&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;We'll start off with the basic vertex shader. No fancy things are being done. You'll see a similiar vertex shader in most of the Cg programs out there in the wild.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;void main_vertex(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float4 pos : POSITION,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float4 out_pos : POSITION,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;uniform float4x4 modelViewProj,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float4 color : COLOR,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float4 out_color : COLOR,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 tex : TEXCOORD,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float2 out_tex : TEXCOORD&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out_pos = mul(modelViewProj, pos);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out_color = color;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out_tex = tex;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;This looks vaguely familiar to C, and it is. Cg stands for «C for graphics» after all. We notice some things are happening, notable some new types.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;float4&lt;/span&gt; is a vector type. It contains 4 elements. It could be colors, positions, whatever. It's used for vector processing which the GPUs are extremely efficient at.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We see various &lt;b&gt;semantics&lt;/b&gt;. The POSITION semantic means that the variable is tied to vertex coordinates. We see that we have an input POSITION, and an output (out) POSITION. We thus transform the input to the output with a matrix multiply with the current model-view projection. Since this matrix is the same for every vertex, it is a &lt;b&gt;uniform&lt;/b&gt;. Remember that the variable names DO matter. &lt;span class="Apple-style-span"&gt;modelViewProj &lt;/span&gt;has to be called exactly that, as the emulator will pass the MVP to this uniform. It is in the specification.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since we have semantics for the POSITION, etc, we can call them whatever we want, as the Cg environment figures out what the variables mean.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The transformation happens here:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt;out_pos = mul(modelViewProj, pos);&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;The COLOR semantic isn't very interesting for us, but the example code in nVidias Cg documentation includes it, so we just follow along :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;TEXCOORD is the texture coordinate we get from the emulator, and generally we just pass it to the fragment shader directly. The coordinate will then be &lt;i&gt;linearly interpolated&lt;/i&gt; across the fragments. More complex shaders can output (almost) as many variables they want, that will be linearly interpolated for free to the fragment shader.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;We also need a fragment shader to go along with the vertex shader, and here's a basic shader that only outputs the pixel as-is. This is pretty much the result you'd get if you didn't run any shader (fixed-function) at all.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;float4 main_fragment(uniform sampler2D s0 : TEXUNIT0, float2 tex : TEXCOORD) : COLOR&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return tex2D(s0, tex);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;This is arguably simpler than the vertex shader :D Important to notice are:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;sampler2D&lt;/span&gt; &lt;/span&gt;is a handle to a texture in Cg. The semantic here is &lt;span class="Apple-style-span"&gt;TEXUNIT0&lt;/span&gt;, which means that it refers to the texture in &lt;b&gt;texture unit 0&lt;/b&gt;. This is also part of the specification.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;float2 tex&lt;/span&gt; : TEXCOORD&lt;/span&gt; is the interpolated coordinate we received from the vertex shader.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;tex2D(s0, tex);&lt;/span&gt; simply does texture lookup and returns a &lt;span class="Apple-style-span"&gt;COLOR&lt;/span&gt;, which is emitted to the framebuffer. Simple enough. Practically every fragment does more than one texture lookup. For example, classic pixel shaders look at the neighbor pixels as well to determine the output. But where is the neighbor pixel? We'll revise the fragment shader and try to make a really blurry shader to demonstrate. We now need to pull up some uniforms. We need to know how to modify our tex coordinates so that it points to a neighbor pixel.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;struct input&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 video_size;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 texture_size;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 output_size;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float frame_count;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;float4 main_fragment(uniform sampler2D s0 : TEXUNIT0, uniform input IN, float2 tex :&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;TEXCOORD) : COLOR&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float4 result = float4(0.0);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float dx = 1.0 / IN.texture_size.x;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float dy = 1.0 / IN.texture_size.y;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;// Grab some of the neighboring pixels and blend together for a very mushy blur.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;result += tex2D(s0, tex + float2(-dx, -dy));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;result += tex2D(s0, tex + float2(dx, -dy));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;result += tex2D(s0, tex + float2(0.0, 0.0));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;result += tex2D(s0, tex + float2(-dx, 0.0));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return result / 4.0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Here we use &lt;span class="Apple-style-span"&gt;IN.texture_size&lt;/span&gt; to determine the the size of the texture. Since GL maps the whole texture to the interval [0.0, 1.0], 1.0 /&lt;span class="Apple-style-span"&gt; IN.texture_size&lt;/span&gt; means we get the offset for a single pixel, simple enough. Almost every shader uses this. We can calculate these offsets in vertex shader to improve performance since the coordinates are linearly interpolated anyways, but that is for another time ... ;)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Putting It Together&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The final runnable product is a single .cg file with the main_vertex and main_fragment functions added together. Not very complicated. For the icing on the cake, you should add a license header. It's just a comment ;)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;/*&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Stupid blur shader.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Author: Your friendly neighbor.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;License: We don't have those things! :(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;struct input&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 video_size;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 texture_size;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 output_size;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float frame_count;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;void main_vertex(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float4 pos : POSITION,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float4 out_pos : POSITION,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;uniform float4x4 modelViewProj,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float4 color : COLOR,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float4 out_color : COLOR,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 tex : TEXCOORD,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float2 out_tex : TEXCOORD&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out_pos = mul(modelViewProj, pos);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out_color = color;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out_tex = tex;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;float4 main_fragment(uniform sampler2D s0 : TEXUNIT0, uniform input IN, float2 tex :&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;TEXCOORD) : COLOR&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float4 result = float4(0.0);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float dx = 1.0 / IN.texture_size.x;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float dy = 1.0 / IN.texture_size.y;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;// Grab some of the neighboring pixels and blend together for a very mushy blur.&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;b&gt;Result of the shader shown:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-LbFi0hAjLa8/Tew2PslQ-bI/AAAAAAAAA5M/FNfb_uuBIRE/s1600/metroid%2Bblur.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-LbFi0hAjLa8/Tew2PslQ-bI/AAAAAAAAA5M/FNfb_uuBIRE/s200/metroid%2Bblur.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5614922478717565362" style="cursor: pointer; width: 200px; height: 157px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;As you can see, it's not a practical shader, but it shows the blurring effect to the extreme :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Expanding Further&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It doesn't stop here. A single .cg shader like this is by far the most common way to distribute a shader, but it has some problems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;– There is no way to set the filtering used for the texture. Some filters require nearest filtering, some require linear, although nearest is by far the most common.&lt;/div&gt;&lt;div&gt;– No way to set custom output scale. We're forced to output to full viewport size, which hurts some filters like HQx and friends.&lt;/div&gt;&lt;div&gt;– No way to use multiple shaders. (multi-pass, FBO).&lt;/div&gt;&lt;div&gt;– No way to grab external lookup textures. (Borders, etc)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This has been solved in various ways for the different emulators. The way to do metadata like this varies for the Cg implementations. As of writing, SNES9x Win32 hasn't addressed this, but will hopefully in the near future.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SSNES and the PS3 emulators solve this with a config file.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Lookup textures&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We'll first mention a very popular feature among the PS3 emulators, the ability to access external textures. This means we have several samplers available for use. In the config file, we define the textures as so:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;textures = "foo;bar"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;foo = path_foo.png # In SSNES this is relative, but PS3 emus are absolute path for now.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;bar = bar_foo.png&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;foo_linear = true # Linear filtering for foo.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;bar_linear = true # Linear filtering for bar.&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PS3 emus use PNG as the main format, SSNES can use whatever if Imlib2 support is compiled in. If not, it's restricted to lop-left ordered, non-RLE TGA.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From here on, «foo» and «bar» can be found as uniforms in the shaders. The texture coordinates for the lookup texture will be found in &lt;span class="Apple-style-span"&gt;TEXCOORD1&lt;/span&gt;. This can simply be passed along with &lt;span class="Apple-style-span"&gt;TEXCOORD0 &lt;/span&gt;in the vertex shader as we did with &lt;span class="Apple-style-span"&gt;TEXCOORD0&lt;/span&gt;. Here we make a fragment shader that blends in two background picture at a reduced opacity. Do NOT assign lookup textures to a certain &lt;span class="Apple-style-span"&gt;TEXUNIT&lt;/span&gt;, Cg will assign a fitting texture unit to the sampler.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;float4 main_fragment(uniform sampler2D s0 : TEXUNIT0,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;uniform sampler2D foo, uniform sampler2D bar,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 tex : TEXCOORD0, float2 tex_lut : TEXCOORD1) : COLOR&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float4 bg_sum = (tex2D(foo, tex_lut) + tex2D(bar, tex_lut)) * 0.15;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return lerp(tex2D(s0, tex), bg_sum, bg_sum.a); // Alpha blending. :D&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;In the PS3 emus there is a magic «bg» sampler that is assigned to the current border selected in the menu. It is not needed to define this in any config file.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's an example of what can be achieved using borders (which are just a simple lookup texture):&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-hd96eKwAMPc/Tew7vLDlrQI/AAAAAAAAA5c/b9i8iWZ7l1U/s1600/ff6%2Bbgl.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-hd96eKwAMPc/Tew7vLDlrQI/AAAAAAAAA5c/b9i8iWZ7l1U/s200/ff6%2Bbgl.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5614928517031898370" style="cursor: pointer; width: 200px; height: 124px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;big&gt;&lt;b&gt;Multipass&lt;/b&gt;&lt;/big&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is sometimes feasible to process an effect in several steps. SSNES and PS3 emus differ here.&lt;/div&gt;&lt;div&gt;SSNES uses the same config file where you can do:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;shaders = 2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;shader0 = pass1.cg&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;shader1 = pass2.cg&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;scale_type0 = source&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;scale0 = 2.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;filter_linear0 = true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;filter_linear1 = false&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;The PS3 emulators handle the same case in the menu generally. There is however a new config system on the way that will handle these kinds of configs.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Game-aware Shaders&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is a new and exiting feature. It allows shaders to grab data from the emulator state itself, such as RAM data. This is only implemented for SNES so far, but the idea is quite extendable and portable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The basic idea is that we capture RAM data in a certain way (semantic if you will) from the SNES, and pass it as a uniform to the shader. The shader can thus act on game state in interesting ways.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a tool to show this feature, we'll focus on replicating the simple tech demo shown on YouTube:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=4VzaE9q735k"&gt;http://www.youtube.com/watch?v=4VzaE9q735k&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What happens is that when Mario jumps in the water, the screen gets a «watery» effect applied to it, with a rain lookup texture, and a wavy effect. When he jumps out of the water, the water effect slowly fades away.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We thus need to know two things:&lt;/div&gt;&lt;div&gt;– Is Mario currently in water or not?&lt;/div&gt;&lt;div&gt;– If not, how long time was it since he jumped out?&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Since shaders do not have state associated with it, we have to let the environment provide the state we need in a certain way. We'll call this concept a semantic.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To capture a RAM value directly, we can use the «capture» semantic. To record the time when the RAM value last changed, we can use the «transition» semantic. We obviously also need to know where in RAM we can find this information. Luckily, the guys over at SMW Central know the answer: &lt;/div&gt;&lt;div&gt;&lt;a href="http://www.smwcentral.net/?p=map&amp;amp;type=ram"&gt;http://www.smwcentral.net/?p=map&amp;amp;type=ram&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We see:&lt;/div&gt;&lt;div&gt;$7E:0075, byte, Flag, Player is in water flag. #$00 = No; #$01 = Yes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bank $7E and $7F are mapped to WRAM $0000-$FFFF and $10000-$1FFFF respectively. Thus, our WRAM address is $0075.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the config file, we can now set up the uniforms we'll want to be captured in the config file.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;imports = "mario_water;mario_water_time"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;mario_water_semantic = capture # Capture the RAM value as-is.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;mario_water_wram = 0075 # This value is hex!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;mario_water_time_semantic = transition # Capture the frame count when this variable last&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;changed. Use with IN.frame_count, to create a fade-out effect.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;mario_water_time_wram = 0075&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;The amount of possible «semantics» are practically endless. It might be worthwhile to attempt some possibility to run custom code that keeps track of the shader uniforms in more sophisticated ways later on. Do note that there is also a %s_mask value which will let you bitmask the RAM value to check for bit-flags more easily.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Now that we got that part down, let's work on the shader design. In the fragment shader we simply render both the full water effect, and the «normal» texture, and let a «blend» variable decide. We can say that 1.0 is full water effect, 0.0 is no effect. We can start working on our vertex shader. We will do something useful here for once.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;struct input&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float frame_count; // We only need frame count. :D&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;void main_vertex(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float4 pos : POSITION,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float4 out_pos : POSITION,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;uniform float4x4 modelViewProj,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float4 color : COLOR,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float4 out_color : COLOR,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 tex : TEXCOORD0,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float2 out_tex : TEXCOORD0,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float2 tex1 : TEXCOORD1,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float2 out_tex1 : TEXCOORD1,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;uniform float mario_water, // Even if the data should have been int, Cg doesn't seem to&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;support integer uniforms :(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;uniform float mario_water_time,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;uniform input IN,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out float blend_factor // Blend factor is passed to fragment shader. We'll output the&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;same value in every vertex, so every fragment will get the same value for blend_factor&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;since there is nothing to interpolate.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out_pos = mul(modelViewProj, pos);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out_color = color;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out_tex = tex;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;out_tex1 = tex1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;float transition_time = 0.5 * (IN.frame_count – mario_water_time) / 60.0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;if (mario_water &amp;gt; 0.0)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;blend_factor = 1.0; // If Mario is in the water ($0075 != 0), it's always 1 ...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;blend_factor = exp(-transition_time); // Fade out from 1.0 towards 0.0 as&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;transition_time grows larger.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;All fine and dandy so far, now we just need to use this blend_factor in our fragment shader somehow ... Let's move on to the fragment shader where we blend :D&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;div&gt;const float2 src0 = float2(0.6, 0.7);&lt;/div&gt;&lt;div&gt;const float2 src1 = float2(0.9, 0.9);&lt;/div&gt;&lt;div&gt;const float2 src2 = float2(-0.6, 0.3);&lt;/div&gt;&lt;div&gt;const float2 src3 = float2(0.1, 0.4);&lt;/div&gt;&lt;div&gt;const float2 src4 = float2(0.1, 0.4);&lt;/div&gt;&lt;div&gt;const float2 src5 = float2(0.5, 0.5);&lt;/div&gt;&lt;div&gt;const float2 src6 = float2(-1.0, 1.0);&lt;/div&gt;&lt;div&gt;float apply_wave(float2 pos, float2 src, float cnt)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;float2 diff = pos - src;&lt;/div&gt;&lt;div&gt;float dist = 300.0 * sqrt(dot(diff, diff));&lt;/div&gt;&lt;div&gt;dist -= 0.15 * cnt;&lt;/div&gt;&lt;div&gt;return sin(dist);&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;// Fancy shizz to create a wave.&lt;/div&gt;&lt;div&gt;float4 water_texture(float4 output, float2 scale, float cnt)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;float res = apply_wave(scale, src0, cnt);&lt;/div&gt;&lt;div&gt;res += apply_wave(scale, src1, cnt);&lt;/div&gt;&lt;div&gt;res += apply_wave(scale, src2, cnt);&lt;/div&gt;&lt;div&gt;res += apply_wave(scale, src3, cnt);&lt;/div&gt;&lt;div&gt;res += apply_wave(scale, src4, cnt);&lt;/div&gt;&lt;div&gt;res += apply_wave(scale, src5, cnt);&lt;/div&gt;&lt;div&gt;res += apply_wave(scale, src6, cnt);&lt;/div&gt;&lt;div&gt;return output * (0.95 + 0.012 * res);&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;float4 main_fragment&lt;/div&gt;&lt;div&gt;(&lt;/div&gt;&lt;div&gt;uniform input IN,&lt;/div&gt;&lt;div&gt;float2 tex : TEXCOORD0, uniform sampler2D s0 : TEXUNIT0,&lt;/div&gt;&lt;div&gt;uniform sampler2D rain, float2 tex1 : TEXCOORD1,&lt;/div&gt;&lt;div&gt;in float blend_factor // Passed from vertex&lt;/div&gt;&lt;div&gt;) : COLOR&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;float4 water_tex = water_texture(tex2D(s0, tex), tex1, IN.frame_count);&lt;/div&gt;&lt;div&gt;float4 normal_tex = tex2D(s0, tex);&lt;/div&gt;&lt;div&gt;float4 rain_tex = tex2D(rain, tex1);&lt;/div&gt;&lt;div&gt;// First, blend normal and water texture together,&lt;/div&gt;&lt;div&gt;// then add the rain texture with alpha blending on top :)&lt;/div&gt;&lt;div&gt;return lerp(lerp(normal_tex, water_tex, blend_factor), rain_tex, rain_tex.a *&lt;/div&gt;&lt;div&gt;blend_factor * 0.5);&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;The SNES9x-PS3 config file:&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;imports = "mario_water;mario_water_time"&lt;/div&gt;&lt;div&gt;mario_water_semantic = capture&lt;/div&gt;&lt;div&gt;mario_water_time_semantic = transition&lt;/div&gt;&lt;div&gt;mario_water_wram = 0075&lt;/div&gt;&lt;div&gt;mario_water_time_wram = 0075&lt;/div&gt;&lt;div&gt;textures = rain&lt;/div&gt;&lt;div&gt;rain = "/dev_hdd0/game/SNES90000/USRDIR/borders/Centered-1080p/overlays/none-overlay.png"&lt;/div&gt;&lt;div&gt;rain_linear = true&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;The shader itself could be added to this config, but it can also be used from the regular menus in case you want to test different approaches to the same RAM value.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;SSNES config file:&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;shaders = 1&lt;/div&gt;&lt;div&gt;shader0 = mario.cg&lt;/div&gt;&lt;div&gt;filter_linear0 = true&lt;/div&gt;&lt;div&gt;imports = "mario_water;mario_water_time"&lt;/div&gt;&lt;div&gt;mario_water_semantic = capture&lt;/div&gt;&lt;div&gt;mario_water_time_semantic = transition&lt;/div&gt;&lt;div&gt;mario_water_wram = 0075&lt;/div&gt;&lt;div&gt;mario_water_time_wram = 0075&lt;/div&gt;&lt;div&gt;textures = rain&lt;/div&gt;&lt;div&gt;rain = rain.tga&lt;/div&gt;&lt;div&gt;rain_linear = true&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;As you can see, these formats are very similiar. The differences are mostly for historical reasons, and might become closer in the future.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;How to test when developing for SNES9x-PS3?&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To develop these kinds of shaders, I'd recommend using SSNES w/ Cg support, and bSNES as a SNES debugger to peek at RAM values (build it yourself with options=debugger). After written, the shader should translate nicely over to SNES9x-PS3 with some slight changes to the config.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Here are some screenshots of the mario effect we developed. Obviously this is a very simple example showing what this thing can do :) It's not confined to overlays. The imagination is the limit here.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Before water ...&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-APdXz-2O5Iw/TexDcsSw9II/AAAAAAAAA5s/47_XAJjbLS4/s1600/before%2Bwater.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-APdXz-2O5Iw/TexDcsSw9II/AAAAAAAAA5s/47_XAJjbLS4/s200/before%2Bwater.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5614936995629429890" style="cursor: pointer; width: 200px; height: 161px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;In water :D&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-liYZrqmnaJ0/TexDcYHLu9I/AAAAAAAAA5k/27KIUj_no9g/s1600/in%2Bwater.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-liYZrqmnaJ0/TexDcYHLu9I/AAAAAAAAA5k/27KIUj_no9g/s200/in%2Bwater.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5614936990212144082" style="cursor: pointer; width: 200px; height: 160px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/themaister&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-4592253469513724584?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/4592253469513724584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=4592253469513724584' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/4592253469513724584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/4592253469513724584'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/06/cg-shader-tutorial-for-emulators.html' title='Cg Shader Tutorial For Emulators'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-LbFi0hAjLa8/Tew2PslQ-bI/AAAAAAAAA5M/FNfb_uuBIRE/s72-c/metroid%2Bblur.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-7049188715985942975</id><published>2011-05-28T12:54:00.000-07:00</published><updated>2011-10-07T12:18:44.954-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='problem'/><category scheme='http://www.blogger.com/atom/ns#' term='64-bit'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Programs Won't Launch in Win7 64-bit</title><content type='html'>&lt;b&gt;UPDATE (10/7/11)&lt;/b&gt;: I never did find an actual solution for this problem. Every time I thought I had something, it would always come back. In the end, I had to reinstall the system. :/&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I've been running into an issue on my Lenovo Thinkpad X120e when booted into Windows 7 where programs won't launch from the taskbar when I click on them. The little transparent box shows up around it, it sits for a second, then fades away.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I found, however, that I could run things from the command line, though that was not a good fix. After futzing around with the startup applications in msconfig, I found that it would start programs just fine if I turned off all of my startup items. This was also suboptimal, so I set to tracking down the culprit from the startup items by enabling them one-by-one and restarting each time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;UPDATE (6/5/11)&lt;/big&gt;&lt;/b&gt;: Turns out my below "fix" may have just been coincidental, because my issue returned. It hung around through several reboots until I ran Windows Update and updated my video card driver, after which it went away again. Whether this fixes things permanently, we'll have to see.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll update this post if anything changes. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Original, ineffectual post:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Eventually, I found the problem to be related to the Sidebar application, which powers the CPU frequency and weather widgets I like to have sitting on my desktop. :(&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I haven't had any problems since I turned it off.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-7049188715985942975?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/7049188715985942975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=7049188715985942975' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/7049188715985942975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/7049188715985942975'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/05/programs-wont-launch-in-win7-64-bit.html' title='Programs Won&apos;t Launch in Win7 64-bit'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-669550984995340866</id><published>2011-05-16T13:44:00.001-07:00</published><updated>2011-05-18T07:28:37.735-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssnes'/><category scheme='http://www.blogger.com/atom/ns#' term='libsnes'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Profiled, optimized libsnes builds for win32</title><content type='html'>I've been playing around with mingw, doing cross-compiles of libsnes with profile-guided optimizations (PGO) for use with SSNES in Windows and I think I've gotten it down pretty well.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I used the following C-flags at compile time:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;-msse2 -fmerge-all-constants -fmodulo-sched -fgcse-sm -fgcse-las -funsafe-loop-optimizations -fsched-spec-load -fsched-spec-load-dangerous -fsched-stalled-insns=0 -fsched-stalled-insns-dep -fsched2-use-superblocks -fipa-pta -ftree-loop-linear -ftree-loop-im -ftree-loop-ivcanon -fivopts -fvariable-expansion-in-unroller -ffast-math -fbranch-target-load-optimize -maccumulate-outgoing-args -combine&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;This means it's only going to work on CPUs that support the SSE2 SIMD instructions, but that includes pretty much every processor manufactured in the past 8 years, so I figured that was good enough.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you want to give them a try, you can get them &lt;a href="http://www.mediafire.com/?18na1xei86v66"&gt;from my mediafire&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-669550984995340866?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/669550984995340866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=669550984995340866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/669550984995340866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/669550984995340866'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/05/profiled-optimized-libsnes-builds-for.html' title='Profiled, optimized libsnes builds for win32'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-9206672873005789720</id><published>2011-05-15T19:34:00.000-07:00</published><updated>2012-01-11T10:22:35.685-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SNES'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='CRT'/><category scheme='http://www.blogger.com/atom/ns#' term='pixel shader'/><title type='text'>More Emulator Pixel Shaders (CRT updated and more)</title><content type='html'>I'm just going to dive right in with the pictures in this post. If you want/need some backstory, &lt;a href="http://filthypants.blogspot.com/2010/12/crt-pixel-shader-filter-for-snes.html"&gt;read my previous CRT shader post&lt;/a&gt;. These shaders are all available in &lt;a href="https://gitorious.org/bsnes/bsnes/trees/patches/snesshader"&gt;Screwtape's bsnes git repo&lt;/a&gt;, except for Beam4, &lt;a href="http://pastebin.com/mjVZTJJz"&gt;which can be downloaded here&lt;/a&gt;, and NTSC, &lt;a href="http://pastebin.com/TcPdyik0"&gt;which can be downloaded here&lt;/a&gt; (&lt;a href="http://www.mediafire.com/?awpl15dspshis"&gt;both mirrored in my mediafire&lt;/a&gt; in case the pastebins expire before Screwtape adds them to his repo).&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Update (01/11/12)&lt;/span&gt;&lt;/b&gt;: bsnes support is back! Plus, the Win32 and GTK+ ports of snes9x support these shaders, as well. :D&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;UPDATE (9/20/11)&lt;/big&gt;&lt;/b&gt;: Themaister has written &lt;a href="http://themaister.net/xmlview/index.html"&gt;an awesome little WebGL applet&lt;/a&gt; that enables shader testing and combining (up to 2 separate shaders) quickly and easily. Check it out! (requires browser with support for WebGL, such as newer versions of Google Chrome and Mozilla Firefox; only supports single-pass shaders at the time of this writing)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;Here's a good picture to test with (320x240 resolution with point filtering, mimics raw SNES output):&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-N_FT96oS-Wc/Tnjt_tMLIbI/AAAAAAAABBc/nmBAuXFuFPw/s1600/mario.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-N_FT96oS-Wc/Tnjt_tMLIbI/AAAAAAAABBc/nmBAuXFuFPw/s1600/mario.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;UPDATE (5/30/11)&lt;/big&gt;&lt;/b&gt;: Added shots of caligari's phosphor21x shader (a.k.a. &lt;a href="https://gitorious.org/bsnes/bsnes/blobs/5e828bd64fef1aaf0e0a14553c8454b9db11d816/snesshader/caligari-scanlines.OpenGL.shader"&gt;caligari's scanlines in Screwtape's repo&lt;/a&gt;). &lt;b&gt;&lt;big&gt;UPDATE (6/3/11)&lt;/big&gt;&lt;/b&gt;: Added Themaister's Dot 'n' Bloom, available from Screwtape's repo. &lt;b&gt;&lt;big&gt;UPDATE (6/18/11)&lt;/big&gt;&lt;/b&gt;: Added caligari's scanlines - rgb triad. &lt;b&gt;&lt;big&gt;UPDATE (9/29/11)&lt;/big&gt;&lt;/b&gt;: Added Themaister's phosphorish. &lt;b&gt;&lt;big&gt;UPDATE (11/22/11)&lt;/big&gt;&lt;/b&gt;: Added edge detection and ALovelyBloom.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All images are taken at 3x scale, followed by that same image blown up 400% with no further interpolation. As always, click the thumbnails to embiggen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;4xBR&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-MzyQyDIRXgg/TdCPcI9fx8I/AAAAAAAAA4M/SuGp_pUicj4/s1600/4xBR.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607139249680795586" src="http://2.bp.blogspot.com/-MzyQyDIRXgg/TdCPcI9fx8I/AAAAAAAAA4M/SuGp_pUicj4/s200/4xBR.png" style="cursor: hand; cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-ZPETnxro6fc/TdCPb7gzPKI/AAAAAAAAA4E/9nGy7rN5Kms/s1600/4xBR-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607139246070774946" src="http://1.bp.blogspot.com/-ZPETnxro6fc/TdCPb7gzPKI/AAAAAAAAA4E/9nGy7rN5Kms/s200/4xBR-big.png" style="cursor: hand; cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-ZPETnxro6fc/TdCPb7gzPKI/AAAAAAAAA4E/9nGy7rN5Kms/s1600/4xBR-big.png"&gt;&lt;/a&gt;This one uses an algorithm similar to HQ4x and it shows.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;ALovelyBloom&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-yIWnrKklDSo/TsveobTy8bI/AAAAAAAABFY/yIeydQFoh9U/s1600/alovelybloom-fullscreen.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5677876541337563570" src="http://1.bp.blogspot.com/-yIWnrKklDSo/TsveobTy8bI/AAAAAAAABFY/yIeydQFoh9U/s200/alovelybloom-fullscreen.png" style="cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-C0MMK-PAFxg/TsveoDw1lII/AAAAAAAABFQ/BvcBIkdcU6E/s1600/alovelybloom-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5677876535016920194" src="http://3.bp.blogspot.com/-C0MMK-PAFxg/TsveoDw1lII/AAAAAAAABFQ/BvcBIkdcU6E/s200/alovelybloom-big.png" style="cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, this one's just a big flare-out on Super Mario World, but it looks pretty good on darker games, if you're into bloom. You can stack it with some other shaders to soften up phosphor effects and so on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Beam4&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-OszT1uZCWJg/TdCPbg8pcAI/AAAAAAAAA38/1xN3lPw-uoQ/s1600/beam4.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607139238939815938" src="http://2.bp.blogspot.com/-OszT1uZCWJg/TdCPbg8pcAI/AAAAAAAAA38/1xN3lPw-uoQ/s200/beam4.png" style="cursor: hand; cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-OszT1uZCWJg/TdCPbg8pcAI/AAAAAAAAA38/1xN3lPw-uoQ/s1600/beam4.png"&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-ZKYCjVaZL4c/TdCPKTAG_EI/AAAAAAAAA3k/KLOX67KKy0k/s1600/beam4-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607138943138462786" src="http://2.bp.blogspot.com/-ZKYCjVaZL4c/TdCPKTAG_EI/AAAAAAAAA3k/KLOX67KKy0k/s200/beam4-big.png" style="cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-b6kkCZYdAH8/TdCPbUQcBAI/AAAAAAAAA30/g3EOhFcFV_U/s1600/beam4%252Bntsc-big.png"&gt;&lt;/a&gt;This is a multipass scanline shader from cgwg that also simulates an electron beam that takes longer to rise than to fall. It is perfect for producing the pseudo-hires transparency used in Kirby's Dreamland 3 and Jurassic Park. Sadly, it only works in emulators that support shader spec 1.1 (at the time of this writing, Themaister's SSNES and PS3 homebrew emus written by Dante Ali).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Bicubic&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-8L_Z64kGnKk/TdCPKAP9cjI/AAAAAAAAA3c/SEHJleDHhOU/s1600/bicubic.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607138938104672818" src="http://4.bp.blogspot.com/-8L_Z64kGnKk/TdCPKAP9cjI/AAAAAAAAA3c/SEHJleDHhOU/s200/bicubic.png" style="cursor: hand; cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-bwsZq7Frs_s/TdCPKH3QOrI/AAAAAAAAA3U/FrHgfBU2gAI/s1600/bicubic-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607138940148529842" src="http://3.bp.blogspot.com/-bwsZq7Frs_s/TdCPKH3QOrI/AAAAAAAAA3U/FrHgfBU2gAI/s200/bicubic-big.png" style="cursor: hand; cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-bwsZq7Frs_s/TdCPKH3QOrI/AAAAAAAAA3U/FrHgfBU2gAI/s1600/bicubic-big.png"&gt;&lt;/a&gt;This one's pretty straightforward, using an algorithm similar to that of bilinear filtering (aka, 'smooth video'). It's a little sharper and preserves edges a little better.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;CRT.OpenGL&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-G8oWWUTLvEs/TdCPJ_O8dTI/AAAAAAAAA3M/ainjFJmOKeU/s1600/CRT.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607138937831978290" src="http://2.bp.blogspot.com/-G8oWWUTLvEs/TdCPJ_O8dTI/AAAAAAAAA3M/ainjFJmOKeU/s200/CRT.png" style="cursor: hand; cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-j2TxfCxJU8c/TdCO-0Z6e_I/AAAAAAAAA20/jy52jXsLh10/s1600/CRT-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607138745946635250" src="http://4.bp.blogspot.com/-j2TxfCxJU8c/TdCO-0Z6e_I/AAAAAAAAA20/jy52jXsLh10/s200/CRT-big.png" style="cursor: hand; cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-j2TxfCxJU8c/TdCO-0Z6e_I/AAAAAAAAA20/jy52jXsLh10/s1600/CRT-big.png"&gt;&lt;/a&gt;This is the latest and greatest version of the collaborative CRT shader. The screen curvature is user-definable, based on changing a single value in the helpfully commented shader code. As you can see, it looks totally amazing. It also runs a lot faster than it used to, so give it a shot even if your machine couldn't handle it before.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;CRT-simple.OpenGL&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-7IEbxhfeA6k/TdCO-tGD_4I/AAAAAAAAA2s/lFproErnij8/s1600/CRT-simple.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607138743984324482" src="http://4.bp.blogspot.com/-7IEbxhfeA6k/TdCO-tGD_4I/AAAAAAAAA2s/lFproErnij8/s200/CRT-simple.png" style="cursor: hand; cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-cskuT6ly3y0/TdCO-WBnz2I/AAAAAAAAA2k/5FxRwl073ys/s1600/CRT-simple-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607138737791684450" src="http://3.bp.blogspot.com/-cskuT6ly3y0/TdCO-WBnz2I/AAAAAAAAA2k/5FxRwl073ys/s200/CRT-simple-big.png" style="cursor: hand; cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-cskuT6ly3y0/TdCO-WBnz2I/AAAAAAAAA2k/5FxRwl073ys/s1600/CRT-simple-big.png"&gt;&lt;/a&gt;This one is very closely related to the aforementioned CRT shader, only this one is optimized for weaker cards while only sacrificing a tiny bit of accuracy. If your machine can't run the full-fledged CRT shader, this one is your last good chance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Dot 'n' Bloom&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-i1RKEvHrXcU/TemChamYraI/AAAAAAAAA5E/A0ejx0Rqzvo/s1600/dotnbloom.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5614161921081650594" src="http://1.bp.blogspot.com/-i1RKEvHrXcU/TemChamYraI/AAAAAAAAA5E/A0ejx0Rqzvo/s200/dotnbloom.png" style="cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-Q8Rom2uClcg/TemChKIeoWI/AAAAAAAAA48/pbprWVnzSAg/s1600/dotnbloombig.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5614161916661244258" src="http://2.bp.blogspot.com/-Q8Rom2uClcg/TemChKIeoWI/AAAAAAAAA48/pbprWVnzSAg/s200/dotnbloombig.png" style="cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Another cool one from Themaister, Dot 'n' Bloom treats each pixel like a single, distinct dot and then adjusts its size based on brightness, such that brighter dots appear larger than darker ones, similar to a CRT electron beam (though this shader is not attempting to reproduce a CRT, it resembles one). He then added a bit of bloom to blend things together some. The results look really nice in motion (especially on Super Metroid :D) and the shader runs extremely fast.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Edge Detection&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-Z10ZSFsWQAE/Tsvf3I06LoI/AAAAAAAABFw/kHgLDxWCbaA/s1600/edgedetection-fullscreen.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5677877893585841794" src="http://4.bp.blogspot.com/-Z10ZSFsWQAE/Tsvf3I06LoI/AAAAAAAABFw/kHgLDxWCbaA/s200/edgedetection-fullscreen.png" style="cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-OSC5ZR9KKFY/Tsvf23SXjgI/AAAAAAAABFo/Aud5rg9ynGU/s1600/edgedetection-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5677877888877563394" src="http://4.bp.blogspot.com/-OSC5ZR9KKFY/Tsvf23SXjgI/AAAAAAAABFo/Aud5rg9ynGU/s200/edgedetection-big.png" style="cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;This one is more stylized than most of the others I've covered. As you might have guessed by the title, it finds the edges of colors and presents them as an outline. On SMW's cartoony, hard outlines, it makes a crazy quadruple outline.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Lanczos 4-tap&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-k9MG9ZDCpXc/TdCON4pibOI/AAAAAAAAA2c/uHF09w4MqGk/s1600/lanczos4tap.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607137905272319202" src="http://4.bp.blogspot.com/-k9MG9ZDCpXc/TdCON4pibOI/AAAAAAAAA2c/uHF09w4MqGk/s200/lanczos4tap.png" style="cursor: hand; cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-I_0YH8CSZxw/TdCONu_KIdI/AAAAAAAAA2U/UjXYaIE9seI/s1600/lanczos4tap-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607137902678647250" src="http://3.bp.blogspot.com/-I_0YH8CSZxw/TdCONu_KIdI/AAAAAAAAA2U/UjXYaIE9seI/s200/lanczos4tap-big.png" style="cursor: hand; cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-I_0YH8CSZxw/TdCONu_KIdI/AAAAAAAAA2U/UjXYaIE9seI/s1600/lanczos4tap-big.png"&gt;&lt;/a&gt;Another fairly straightforward interpolation filter, this one runs quite fast even on weaker hardware. &lt;a href="http://en.wikipedia.org/wiki/Lanczos_resampling"&gt;You can learn more about the Lanczos algorithm and its use in resampling at the Wikipedia&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Lanczos 6-tap&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-ZHgGoT4LJCg/TdCONryUIBI/AAAAAAAAA2M/KlAopo4HWLU/s1600/lanczos6tap.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607137901819469842" src="http://1.bp.blogspot.com/-ZHgGoT4LJCg/TdCONryUIBI/AAAAAAAAA2M/KlAopo4HWLU/s200/lanczos6tap.png" style="cursor: hand; cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-Fa4MvHeSYGA/TdCONTx1L5I/AAAAAAAAA2E/SHofeEuE1eE/s1600/lanczos6tap-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607137895374991250" src="http://1.bp.blogspot.com/-Fa4MvHeSYGA/TdCONTx1L5I/AAAAAAAAA2E/SHofeEuE1eE/s200/lanczos6tap-big.png" style="cursor: hand; cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-Fa4MvHeSYGA/TdCONTx1L5I/AAAAAAAAA2E/SHofeEuE1eE/s1600/lanczos6tap-big.png"&gt;&lt;/a&gt;As you might have guessed, this one is very similar to the 4-tap Lanczos, but it is further sharpened, which leads to the ringing/halo effect around sprites.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;NTSC&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-9xrba-lv1gk/TdCONFC4tSI/AAAAAAAAA18/v2d-Lgvd2TU/s1600/ntsc.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607137891419993378" src="http://3.bp.blogspot.com/-9xrba-lv1gk/TdCONFC4tSI/AAAAAAAAA18/v2d-Lgvd2TU/s200/ntsc.png" style="cursor: hand; cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-18n7CuBj2EY/TdCOAJ-yviI/AAAAAAAAA10/3d9ZcZGIvfE/s1600/ntsc-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607137669406703138" src="http://1.bp.blogspot.com/-18n7CuBj2EY/TdCOAJ-yviI/AAAAAAAAA10/3d9ZcZGIvfE/s200/ntsc-big.png" style="cursor: hand; cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-18n7CuBj2EY/TdCOAJ-yviI/AAAAAAAAA10/3d9ZcZGIvfE/s1600/ntsc-big.png"&gt;&lt;/a&gt;This multipass shader is the result of cgwg and Themaister porting blargg's awesome NTSC filter to GLSL. It looks quite nice and doesn't bog down the CPU like the regular filter version. Unfortunately, it only works on shader spec 1.1-compatible emus.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Phosphor21x&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-5eIy_iLB_q0/TePjQny0WTI/AAAAAAAAA4o/OZU5ZcwDRWw/s1600/phosphor21xbig.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5612579435333310770" src="http://4.bp.blogspot.com/-5eIy_iLB_q0/TePjQny0WTI/AAAAAAAAA4o/OZU5ZcwDRWw/s200/phosphor21xbig.png" style="cursor: pointer; height: 150px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-bBRwUX4yuLk/TePjQ6czXNI/AAAAAAAAA4w/mLu7-PsmowE/s1600/phosphor21x.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5612579440341245138" src="http://4.bp.blogspot.com/-bBRwUX4yuLk/TePjQ6czXNI/AAAAAAAAA4w/mLu7-PsmowE/s200/phosphor21x.png" style="cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;This is caligari's implementation of an algorithm originally written by xythen in Matlab, which served as the inspiration for the work that later became CRT.OpenGL. This shader builds on xythen's work to be essentially scale factor-independent, except it looks a little weird at 2x in my experience;  everything larger looks great. An interesting note: the scanlines that appear with this shader are not simply added in. Instead, they are naturally occurring as a result of the phosphor simulation. Pretty cool stuff :D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By uncommenting some lines in caligari's code, you can enable one of three phosphor/shadow mask arrangements, of which the RGB triad option is the nicest (I recommend clicking these thumbnails to see in full size):&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-2-oLOoCn-ww/Tf63xrDl59I/AAAAAAAAA60/o4ll67PGX1s/s1600/caligari%2Btriad.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5620131449004222418" src="http://4.bp.blogspot.com/-2-oLOoCn-ww/Tf63xrDl59I/AAAAAAAAA60/o4ll67PGX1s/s200/caligari%2Btriad.png" style="cursor: pointer; height: 150px; width: 200px;" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-CyeCtcJ880Y/Tf63xlZbDjI/AAAAAAAAA6s/w_bXL3wftkQ/s1600/caligari%2Btriad-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5620131447485173298" src="http://2.bp.blogspot.com/-CyeCtcJ880Y/Tf63xlZbDjI/AAAAAAAAA6s/w_bXL3wftkQ/s200/caligari%2Btriad-big.png" style="cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-zCpsgQaSc6w/Tf63xVcRLMI/AAAAAAAAA6k/2GaqTNUzFd4/s1600/caligari%2Btriad-bigger.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5620131443202141378" src="http://3.bp.blogspot.com/-zCpsgQaSc6w/Tf63xVcRLMI/AAAAAAAAA6k/2GaqTNUzFd4/s200/caligari%2Btriad-bigger.png" style="cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-VP3SR_QNNQs/Tf64TdmNvcI/AAAAAAAAA68/AkOffiaHoFg/s1600/caligari%2Btriad-biggest.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5620132029506895298" src="http://3.bp.blogspot.com/-VP3SR_QNNQs/Tf64TdmNvcI/AAAAAAAAA68/AkOffiaHoFg/s200/caligari%2Btriad-biggest.png" style="cursor: pointer; height: 150px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;As you can see, this option causes some serious dimming of the picture brightness, which was also a technological obstacle for actual CRT engineers when shadow masks were first being designed and implemented. In bsnes, you should be able to just increase the gamma in the picture settings to compensate. You can download this shader variation from &lt;a href="http://www.mediafire.com/?5ufjj94ticauh1c"&gt;my mediafire account&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;Phosphorish&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Riz-z5NOw2E/ToR-e77b2WI/AAAAAAAABBs/vbtqnblKvio/s1600/phosphorish.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="155" src="http://4.bp.blogspot.com/-Riz-z5NOw2E/ToR-e77b2WI/AAAAAAAABBs/vbtqnblKvio/s200/phosphorish.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ktdVa3Y5ojg/ToR-fJUneuI/AAAAAAAABBw/KovTtQwW23g/s1600/phosphorish-big.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-ktdVa3Y5ojg/ToR-fJUneuI/AAAAAAAABBw/KovTtQwW23g/s200/phosphorish-big.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A simple, single-pass shader that makes a nice phosphor effect. This shader runs fast and works with both bsnes and SSNES. It is available &lt;a href="https://gist.github.com/1250766"&gt;here&lt;/a&gt; or in my mediafire.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Quilez&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-WujeQyxzBYg/TdCOAILMHRI/AAAAAAAAA1s/-0o9kqCO02s/s1600/quilez.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607137668921826578" src="http://3.bp.blogspot.com/-WujeQyxzBYg/TdCOAILMHRI/AAAAAAAAA1s/-0o9kqCO02s/s200/quilez.png" style="cursor: hand; cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-r74xwM0q43U/TdCN_pFOJdI/AAAAAAAAA1k/QGbpBp6zVr0/s1600/quilez-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607137660575294930" src="http://3.bp.blogspot.com/-r74xwM0q43U/TdCN_pFOJdI/AAAAAAAAA1k/QGbpBp6zVr0/s200/quilez-big.png" style="cursor: hand; cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-r74xwM0q43U/TdCN_pFOJdI/AAAAAAAAA1k/QGbpBp6zVr0/s1600/quilez-big.png"&gt;&lt;/a&gt;This fast, crisp interpolation filter is totally new to the emulation scene. It's based on &lt;a href="http://www.iquilezles.org/www/articles/texture/texture.htm"&gt;some fancy math demonstrated by Inigo Quilez&lt;/a&gt; and represents a good compromise between the pixelate2x and bicubic shaders.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Simple TV Blur&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-uPACNw6IcCM/TdCN_iddXYI/AAAAAAAAA1c/n6oMuU5WcoA/s1600/simpleTVblur.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607137658797907330" src="http://2.bp.blogspot.com/-uPACNw6IcCM/TdCN_iddXYI/AAAAAAAAA1c/n6oMuU5WcoA/s200/simpleTVblur.png" style="cursor: hand; cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-LKhVl-oNbmE/TdCN_ZcLNVI/AAAAAAAAA1U/9VO9a2SzEvY/s1600/simpleTVblur-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607137656376603986" src="http://3.bp.blogspot.com/-LKhVl-oNbmE/TdCN_ZcLNVI/AAAAAAAAA1U/9VO9a2SzEvY/s200/simpleTVblur-big.png" style="cursor: hand; cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;This one's rather subtle, but is intended to do the minimum amount of work required to reproduce the pseudo-hires transparency.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Beam4+NTSC&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-d4Rhk7I8Jvk/TdCPKeU-OfI/AAAAAAAAA3s/gGZSMgeXBvc/s1600/beam4%252Bntsc-shaders.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607138946178759154" src="http://2.bp.blogspot.com/-d4Rhk7I8Jvk/TdCPKeU-OfI/AAAAAAAAA3s/gGZSMgeXBvc/s200/beam4%252Bntsc-shaders.png" style="cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-d4Rhk7I8Jvk/TdCPKeU-OfI/AAAAAAAAA3s/gGZSMgeXBvc/s1600/beam4%252Bntsc-shaders.png"&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-b6kkCZYdAH8/TdCPbUQcBAI/AAAAAAAAA30/g3EOhFcFV_U/s1600/beam4%252Bntsc-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607139235533161474" src="http://4.bp.blogspot.com/-b6kkCZYdAH8/TdCPbUQcBAI/AAAAAAAAA30/g3EOhFcFV_U/s200/beam4%252Bntsc-big.png" style="cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Just for fun, I used SSNES' shader stacking support to combine the new NTSC shader with the Beam4 shader. It's almost indistinguishable from Beam4 alone (except for some really slight changes to the color palette), so I wouldn't bother trying it yourself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;CRT+NTSC&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-_MSllkC-Lkw/TdCO_L8bqRI/AAAAAAAAA3E/Q3i2egnZpls/s1600/CRT%252Bntsc-shaders.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607138752265431314" src="http://2.bp.blogspot.com/-_MSllkC-Lkw/TdCO_L8bqRI/AAAAAAAAA3E/Q3i2egnZpls/s200/CRT%252Bntsc-shaders.png" style="cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-eEEd7AQYOFE/TdCO-4dXvXI/AAAAAAAAA28/p3JtkG8VSlo/s1600/CRT%252Bntsc-shaders-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5607138747034877298" src="http://1.bp.blogspot.com/-eEEd7AQYOFE/TdCO-4dXvXI/AAAAAAAAA28/p3JtkG8VSlo/s200/CRT%252Bntsc-shaders-big.png" style="cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;As above, I tried stacking the NTSC shader with the new CRT shader and this was the result. It's kinda cool in a way, like newsprint. :P According to cgwg, this is happening because it's only picking up the first pass of the NTSC shader, which has no color values.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;CRT-Flat+Caligari's Scanlines - RGB Triad&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;When the regular CRT shader (edited to have 0.0 for the distortion value) is paired with caligari's scanlines - RGB triad variant, you end up with a pretty neat result:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-e4-zjHYbFrg/Tf7E4g78cEI/AAAAAAAAA7M/m486bzKNmXg/s1600/CRT%252Bcaligari-triad.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5620145860198035522" src="http://3.bp.blogspot.com/-e4-zjHYbFrg/Tf7E4g78cEI/AAAAAAAAA7M/m486bzKNmXg/s200/CRT%252Bcaligari-triad.png" style="cursor: pointer; height: 150px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-S1KeJ6ObE-s/Tf7E4Z3Ad6I/AAAAAAAAA7E/UvK7yXNMxfo/s1600/CRT%252Bcaligari-triad-big.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5620145858298279842" src="http://2.bp.blogspot.com/-S1KeJ6ObE-s/Tf7E4Z3Ad6I/AAAAAAAAA7E/UvK7yXNMxfo/s200/CRT%252Bcaligari-triad-big.png" style="cursor: pointer; height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;The colors are off by a good bit (I think because of the double gamma correction) and it's very dark, but the phosphor triads from caligari's are still clearly discernible over the CRT shader's already-awesome result. Still not perfect, obviously, but getting close in a lot of ways.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-9206672873005789720?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/9206672873005789720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=9206672873005789720' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/9206672873005789720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/9206672873005789720'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/05/more-emulator-pixel-shaders-crt-updated.html' title='More Emulator Pixel Shaders (CRT updated and more)'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-N_FT96oS-Wc/Tnjt_tMLIbI/AAAAAAAABBc/nmBAuXFuFPw/s72-c/mario.png' height='72' width='72'/><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-1188294379933251771</id><published>2011-04-14T21:21:00.000-07:00</published><updated>2011-04-14T21:39:32.547-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='barkeeper&apos;s friend'/><category scheme='http://www.blogger.com/atom/ns#' term='experiment'/><title type='text'>Barkeeper's Friend for Cleaning Stainless Steel Cookware</title><content type='html'>I don't normally do this sort of post on my blog, but I figured people might find it useful, so...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Barkeeper's Friend is an abrasive cleaning powder, similar to Comet, that is renowned for its ability to clean stainless steel pots and pans. I've always heard that it can clean stains you would think were there forever, so I figured I'd give it a shot with my well-worn tea kettle:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-XWlOwHzGJkM/TafIrmv9JEI/AAAAAAAAA0w/OFAAr5qoE1w/s1600/BEFORE.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-XWlOwHzGJkM/TafIrmv9JEI/AAAAAAAAA0w/OFAAr5qoE1w/s200/BEFORE.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5595661713492747330" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;As you can see, there are some pretty nasty black stains flecked around the bottom of the kettle, quite a bit of brown crud caked on underneath that, and an overall cloudiness to the finish everywhere else.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By reading the directions on the side of the Barkeeper's Friend label, you can see that it recommends a couple of different ways to use the product:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. wet the item to be cleaned so the powder will stick to it better, sprinkle on some Barkeeper's Friend, then scrub vigorously with a damp rag&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. mix Barkeeper's Friend with water to make a paste and then spread that onto the surface of the item to be cleaned and let it sit for a minute or so, then scrub vigorously with a damp rag.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I tried both methods.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first method is faster, obviously, but I found its performance underwhelming. While cloudiness was greatly reduced after scrubbing, much of the brown crud remained and the black stains were completely unaffected. Unfortunately, I wasn't able to take a picture after this treatment. You'll have to just take my word for it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The second method is kind of a hassle, but it's worth the extra time and effort. In addition to clearing up the cloudiness, this method also removed the vast majority of the brown crud and helped somewhat with the black stains, though a noticeable amount of black staining still remains after scrubbing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's how it looked after cleaning:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-2NJM4x2uny8/TafIrp_dL5I/AAAAAAAAA0o/i9fAf_vEKoE/s1600/AFTER.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-2NJM4x2uny8/TafIrp_dL5I/AAAAAAAAA0o/i9fAf_vEKoE/s200/AFTER.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5595661714363068306" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Substantially improved, but far from perfect.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also scrubbed the scorched bottom surface of the kettle using both methods and left a section cleaned only with regular soapy water as a control:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-yQlY1Zafjqs/TafK4SOE8tI/AAAAAAAAA04/819cQ0zIqec/s1600/BOTTOM.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-yQlY1Zafjqs/TafK4SOE8tI/AAAAAAAAA04/819cQ0zIqec/s200/BOTTOM.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5595664130343498450" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Again, method 1 certainly helped, but method 2 was much more effective. However, even method 2 wasn't able to completely clean up everything.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have any questions, drop me a comment.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-1188294379933251771?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/1188294379933251771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=1188294379933251771' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/1188294379933251771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/1188294379933251771'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/04/barkeepers-friend-for-cleaning.html' title='Barkeeper&apos;s Friend for Cleaning Stainless Steel Cookware'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-XWlOwHzGJkM/TafIrmv9JEI/AAAAAAAAA0w/OFAAr5qoE1w/s72-c/BEFORE.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-6526414657777853960</id><published>2011-03-24T18:01:00.000-07:00</published><updated>2011-08-13T05:47:49.626-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scroll'/><category scheme='http://www.blogger.com/atom/ns#' term='trackpoint'/><category scheme='http://www.blogger.com/atom/ns#' term='emulation'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='lenovo'/><title type='text'>Configuring Lenovo TrackPoint Mouse Wheel Emulation Scrolling in Ubuntu</title><content type='html'>I have a Lenovo X120e and have grown accustomed to using the once-loathed TrackPoint (also known as the nubbin, the navigation nipple, the eraserhead, and others) for scrolling through Web pages, windows, etc. as I would with a mousewheel. Here is how you would do it in Ubuntu (in this case 11.04 Natty Narwhal, but it should apply to anything Maverick or later:&lt;br /&gt;&lt;br /&gt;Open up a terminal and type:&lt;div&gt;&lt;blockquote style="font-family: courier new;"&gt;gpointing-device-settings&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;UPDATE (8/13/11):&lt;/b&gt; The package isn't installed by default in 11.10 Oneiric Ocelot, so you'll have to install it first, either through Synaptic package manager or by typing&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" &gt;sudo apt-get install gpointing-device-settings&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Select the TrackPoint device from the pane on the left. Mine is called "TPPS/2 IBM TrackPoint." In the middle of the window, you'll see a checkbox labeled "Use wheel emulation." Check the box, along with the ones labeled "Enable vertical scroll" and "Enable horizontal scroll" as you see fit.&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-gQSCXAnkR1k/TYwWKkJ7wCI/AAAAAAAAA0g/6AYodGP5eTI/s1600/Screenshot-GPointing%2BDevice%2BSettings.png"&gt;&lt;img src="http://4.bp.blogspot.com/-gQSCXAnkR1k/TYwWKkJ7wCI/AAAAAAAAA0g/6AYodGP5eTI/s200/Screenshot-GPointing%2BDevice%2BSettings.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5587865608419786786" style="cursor: pointer; width: 200px; height: 170px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-gQSCXAnkR1k/TYwWKkJ7wCI/AAAAAAAAA0g/6AYodGP5eTI/s1600/Screenshot-GPointing%2BDevice%2BSettings.png"&gt;&lt;/a&gt;You'll also need to select your scroll button from the pull-down menu. In my case, it was button 2, but YMMV.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While you're here, you can also switch to the TrackPad options and disable your trackpad, if that's what you're into.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-6526414657777853960?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/6526414657777853960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=6526414657777853960' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6526414657777853960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6526414657777853960'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/03/configuring-lenovo-trackpoint-mouse.html' title='Configuring Lenovo TrackPoint Mouse Wheel Emulation Scrolling in Ubuntu'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-gQSCXAnkR1k/TYwWKkJ7wCI/AAAAAAAAA0g/6AYodGP5eTI/s72-c/Screenshot-GPointing%2BDevice%2BSettings.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-1031923800478394388</id><published>2011-03-23T08:16:00.000-07:00</published><updated>2011-04-01T05:57:15.077-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='natty narwhal'/><category scheme='http://www.blogger.com/atom/ns#' term='x120e'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu Natty on Lenovo ThinkPad X120e</title><content type='html'>If you've read my &lt;a href="http://filthypants.blogspot.com/2011/03/ubuntu-maverick-on-lenovo-x120e-fusion.html"&gt;earlier post regarding Maverick on this machine&lt;/a&gt;, you'll know I ran into a few annoying issues.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The biggest problem was that my Broadcom wireless driver kept getting deactivated with every reboot, so I decided to try installing Natty instead.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first issue I ran into with Natty was that the installer kept crapping out before the partitioning phase with an error about ubi-partman failing to start due to error 141. There are a couple of Launchpad bugs filed for this error, but a claimed fix that was checked in a few days earlier did not seem to help things. What fixed me up, though, was using the alternate install image, which uses an ncurses-based installer rather than the fancy Ubiquity installer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, moving on, everything installed fine and, upon booting into the new system, the hardware driver manager detected my wireless card and recommended the proprietary Broadcom SLA driver. Click to enable, reboot and wireless should be fine and dandy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you opted for the default Ralink card, it should be detected and supported out-of-the-box, without even needing to consult the driver manager.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By default, the system utilizes the open source "radeon" driver, with 3D support provided by the Gallium3D backend. This should be fine for light 3D duties, such as Compiz, though&lt;a href="http://www.phoronix.com/scan.php?page=news_item&amp;amp;px=OTIxNw"&gt; it does have a show-stopping bug that will cause crashes, loops and reboots under heavy stress, such as 3D games&lt;/a&gt;. As long as you don't play any games, though, you should be fine. If you want to play games and/or use video decoding acceleration, you'll have to install the proprietary Catalyst driver, but it is not yet compatible with the X Server included in Natty. This will be resolved before final release in April.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;big&gt;&lt;b&gt;Update 3/30/11&lt;/b&gt;&lt;/big&gt;: &lt;a href="http://www.phoronix.com/scan.php?page=news_item&amp;amp;px=OTI3MQ"&gt;The updated proprietary fglrx driver should be available from the Natty repos now&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At this point, my system works pretty well, except for an odd dependency hell issue that is preventing Unity from installing/running because of some Compiz virtual package conflict B.S., though I suspect this will be sorted out in a couple of days. &lt;big&gt;&lt;b&gt;UPDATE (3/23/11)&lt;/b&gt;&lt;/big&gt;: fixed now.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I haven't tried suspend/hibernate yet, but will update with results as soon as possible.&lt;/div&gt; &lt;big&gt;&lt;b&gt;UPDATE (3/23/11)&lt;/b&gt;&lt;/big&gt;: waking from suspend seems fine, though my notification stuff isn't updating (wireless is showing that it's disconnected, even though it's not, etc). Hibernate, in contrast, seems totally b0rked. It just sits there blowing its fan and blinking the sleep LED on the front edge until you do a hard poweroff. :(&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;big&gt;&lt;b&gt;UPDATE (4/1/11)&lt;/b&gt;&lt;/big&gt;: To get multitouch working on your trackpad, install the package gsynaptics (not to be confused with the synaptic package manager):&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;sudo aptitude install gsynaptics&lt;/blockquote&gt;and then type:&lt;/div&gt;&lt;div&gt;&lt;blockquote style="font-family: courier new;"&gt;gpointing-device-settings&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;You should be able to enable two-finger scrolling from the trackpad menu. While you're there, you can &lt;a href="http://filthypants.blogspot.com/2011/03/configuring-lenovo-trackpoint-mouse.html"&gt;configure the navigation nub for mousewheel emulation&lt;/a&gt;, if that's what you're into.&lt;br /&gt;&lt;br /&gt;Everything else I've tested, including audio and webcam, work just fine. Even the function volume keys work.&lt;br /&gt;&lt;br /&gt;Things I haven't tested:&lt;br /&gt;HDMI-out&lt;br /&gt;audio over HDMI&lt;br /&gt;VGA-out&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The middle scroll button works too, it &lt;a href="http://filthypants.blogspot.com/2011/03/configuring-lenovo-trackpoint-mouse.html"&gt;just takes a little configuration&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-1031923800478394388?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/1031923800478394388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=1031923800478394388' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/1031923800478394388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/1031923800478394388'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/03/ubuntu-natty-on-lenovo-thinkpad-x120e.html' title='Ubuntu Natty on Lenovo ThinkPad X120e'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-6428150384671443901</id><published>2011-03-18T08:34:00.001-07:00</published><updated>2011-04-14T21:50:21.355-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='horn'/><category scheme='http://www.blogger.com/atom/ns#' term='compression driver'/><category scheme='http://www.blogger.com/atom/ns#' term='d250-x'/><category scheme='http://www.blogger.com/atom/ns#' term='audiophile'/><category scheme='http://www.blogger.com/atom/ns#' term='selenium'/><title type='text'>My First Mid-horns for Hifi</title><content type='html'>I've spent a lot of time on audiophile forums reading about the advantages of horns over purely cone-based speakers, including crisp sound reproduction, consistency, "realism" and extremely high sensitivity. The drawbacks, of course, being high cost (sometimes ridiculously so), a dearth of non-vintage models to choose from, few places to demo products before buying and, perhaps most importantly, the tremendous size requirements for horns that will reach lower frequencies. Horns are also known for their "honkiness" and directivity, which can be a problem if you often listen to music outside of your stereo's "sweet spot."&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While any driver can be horn-loaded, when people talk about horns, they usually mean a compression driver with a horn attached to the front, either through bolting (the standard for audiophile equipment) or via a threaded, screw-on junction (the standard for professional equipment). Relative to normal drivers, compression drivers have very low distortion due to the small size of the membrane and the relatively short distance the membrane needs to travel.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, as I began looking into mid-horns, most of the information available online suggests that you will need to purchase vintage equipment, such as 1950s-era JBL compression drivers and similarly aged JBL or Altec Lansing horns or else build your own horns, which can be a daunting task to say the least. If you go on eBay and look for these products, you'll see that very little is available for less than $1,000, as they have reached the status of collectors' items and are priced as such.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, I also noticed that horns and compression drivers are still used quite extensively in professional audio settings, such as stage monitors and PA speakers. In fact, &lt;a href="http://www.parts-express.com/pe/showdetl.cfm?Partnumber=264-204"&gt;Selenium's D250-X&lt;/a&gt; compression driver has performance specs that looked very similar to those of the multi-thousand-dollar, vintage compression drivers I was seeing on eBay, including an uncrossed frequency response from 400 Hz to approximately 9 kHz and a sensitivity of 107 db at 1w/1m, but with a power handling capability of 150w (vs. very low power handling on vintage equipment). The biggest difference, though, is the price: ~$35!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.mcmelectronics.com/product/DISTRIBUTED-BY-MCM-DU-40-/54-050"&gt;These&lt;/a&gt; &lt;a href="http://www.mcmelectronics.com/product/DISTRIBUTED-BY-MCM-DU-40-/54-050"&gt;MCM drivers&lt;/a&gt; are also a good, cheap option, with a low frequency range down to 100 Hz!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Likewise, when looking into mid-horns, the prices for newly constructed or high-quality vintage equipment usually range from ~$750+ up to tens of thousands of dollars. This is simply too expensive for me, so I began looking for other options, including DIY solutions and professional audio. At this point, I had to make some decisions, including which horn curve I wanted to use.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Deciding on horn curves is basically a matter of weighing a series of compromises and figuring out what matters to you most/least. While conical horns tend to have the least honky horn coloring and are also easy to construct, owing to their straight-angled sides, they are also the least space-friendly and also tend to be very ugly, in my opinion. Exponential horns take up considerably less space than conical horns for a given frequency response, but they are more difficult to construct, due to their curved sides. Similarly, square/rectangular horns tend to have better dispersion and listening angles than round horns, while round horns impart less distortion to the sound wave.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I decided that a round exponential, while difficult to construct, would be my best bet, since I want to experience the horn sound and my space is limited (my listening room is less than 200 sq feet).&lt;/div&gt;&lt;br /&gt;&lt;div&gt;While weighing my options, I came across some potentially good options in the pro realm, including the &lt;a href="http://www.parts-express.com/pe/showdetl.cfm?Partnumber=270-312"&gt;Dayton Audio H12RW 12" waveguide&lt;/a&gt; and the &lt;a href="http://www.parts-express.com/pe/showdetl.cfm?Partnumber=264-315"&gt;Selenium HL14-25 exponential horn&lt;/a&gt;. The waveguide was attractive to me because it can easily drop right into an existing speaker cabinet designed to house a 12" woofer. However, &lt;a href="http://www.audioheritage.org/vbulletin/attachment.php?attachmentid=19827&amp;amp;stc=1&amp;amp;d=1161638799"&gt;waveguides are a little different from traditional horns&lt;/a&gt;, and that's really what I wanted to try. That in mind, I went with the HL14-25 horns, which have a suggested frequency range from approximately 600 Hz to 5 kHz, well inside the range of the driver.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When I received the horns, I first tested them by wiring them in series with my Phase Technology Teatro 7.5s (8 ohm, 90 db sensitivity, freq. resp. of 40 Hz to 20 kHz), but the sensitivity of the horns was too far off from that of the Teatros, such that the horns were ear-splittingly loud by the time the volume was high enough to hear the Teatros comfortably. With that in mind, I resurrected my old Sony solid state receiver (100w per channel) and wired it to push the Teatros and my subwoofer while my Dared VP-20 pushed the Selenium horns. This way, I could independently adjust the volumes to achieve a good balance between the horns and the Teatros, and then use my preamp's volume control as a sort of 'master volume.'&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To run my initial tests, I left the horns uncrossed and expected a good bit of distortion below the 400 Hz mark, since that's as low as the drivers are supposed to go. I cautiously kept the volume very low as I didn't wish to blow my new drivers on their first go 'round. However, I was pleasantly surprised to find that the horns handled the lower frequencies quite gracefully, with no distortion that I could notice--even when playing as loud as I could comfortably stand--and with a fairly smooth (though rapid) rolloff below around 600 Hz. I'm assuming this success is largely due to the fact that the horns are probably receiving only a handful of watts instead of the 100+ watts that are normally shoved through them in professional applications.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Based on this experience, I have decided not to bother with a crossover at this time, though I may revisit the issue in the future.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I guess the real question now is: "How does it sound?" In short, it sounds fantastic. The frequency range covered by the horns encompasses guitar solos, most vocals and organs, which all sounded a bit anemic on my Teatros alone. The clarity and definition in these frequencies is truly astounding and must be experienced. If you've only ever heard cone drivers for this range (like me before I bought these horns), it's honestly impossible to imagine how rich the sound reproduction can truly be.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My setup is designed to allow for extensive A/B testing (in addition to the independent volume control for the Teatros and horns, the VP-20 has independent volume control for each channel), and this is where the improvements really shine. Even my wife (who is very honest about differences she can and can't hear, often to my chagrin) was blown away by the disparity between Teatro+horn vs. Teatro alone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The horns admittedly have some strong directivity, but they also have a good--though different--sound off-axis, such that listening outside of the sweet spot is still nice, just not the same as getting right there in the middle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are a couple of pictures of the horns sitting on top of my Teatros:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-y--O3tl2OTQ/TafNwom0qCI/AAAAAAAAA1I/PlO68yvMydk/s1600/HORNFAR.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-y--O3tl2OTQ/TafNwom0qCI/AAAAAAAAA1I/PlO68yvMydk/s200/HORNFAR.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5595667297448798242" style="cursor: pointer; width: 127px; height: 200px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-2ZppUWYJFS4/TafNwR5JDXI/AAAAAAAAA1A/QkPbSQm5-gA/s1600/HORNCLOSE.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-2ZppUWYJFS4/TafNwR5JDXI/AAAAAAAAA1A/QkPbSQm5-gA/s200/HORNCLOSE.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5595667291351616882" style="cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;In the first picture, you can see the VP-20 that pushes them, as well a little bit of my disc changer, preamp and crummy solid state amplifier.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-6428150384671443901?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/6428150384671443901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=6428150384671443901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6428150384671443901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6428150384671443901'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/03/my-first-mid-horns-for-hifi.html' title='My First Mid-horns for Hifi'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-y--O3tl2OTQ/TafNwom0qCI/AAAAAAAAA1I/PlO68yvMydk/s72-c/HORNFAR.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-5525938947686731721</id><published>2011-03-15T13:08:00.000-07:00</published><updated>2011-04-01T05:59:09.690-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maverick meerkat'/><category scheme='http://www.blogger.com/atom/ns#' term='grub'/><category scheme='http://www.blogger.com/atom/ns#' term='efi'/><category scheme='http://www.blogger.com/atom/ns#' term='fusion'/><category scheme='http://www.blogger.com/atom/ns#' term='x120e'/><category scheme='http://www.blogger.com/atom/ns#' term='lenovo'/><title type='text'>Ubuntu Maverick on Lenovo X120e Fusion Laptop</title><content type='html'>&lt;big&gt;&lt;b&gt;UPDATE 3/23/11&lt;/b&gt;&lt;/big&gt;: Natty seems to work much better with these systems, so I recommend skipping Maverick and going straight for 11.04, even thought it's still in Alpha stage at the time of this writing. &lt;a href="http://filthypants.blogspot.com/2011/03/ubuntu-natty-on-lenovo-thinkpad-x120e.html"&gt;Check out my post about it here&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Original Post:&lt;/div&gt;&lt;div&gt;Due to a wonderful pricing error at Lenovo, I got a really sweet deal on a Thinkpad X120e laptop, featuring AMD's new Zacate Fusion chipset.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When trying to install Ubuntu 10.10 Maverick on it, though, the Ubiquity installer kept failing with this error:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;grub-install efi-dummy failed. This is a fatal error.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;To fix this, you need to go into the computer's BIOS and, under the boot tab, change the uEFI settings to try 'legacy' first. This will allow Ubuntu to install grub successfully.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After you make that change, installation should be able to complete and you can reboot into your new system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's as far as I've gotten so far, so I'll update this post as I find out more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;Update (3/15/11):&lt;/big&gt;&lt;/b&gt; I ran into a few more issues that I had to muddle through: wireless networking and waking up after closing the lid of the computer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, we'll fix the &lt;b&gt;&lt;big&gt;&lt;red&gt;suspend&lt;/red&gt;&lt;/big&gt;&lt;/b&gt; issue, since it's the easier of the two.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;big&gt;&lt;b&gt;Update 3/23/11&lt;/b&gt;&lt;/big&gt;: Actually, this doesn't fix anything. It still has problems after a few seconds of having the lid closed (i.e., when it actually goes to sleep). Sorry for any inconvenience. I'll add a real solution if/when I find one.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Open up a terminal and type:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;gconf-editor&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;It will bring up a window with lots of configuration items. Navigate to apps &amp;gt; gnome-power-manager &amp;gt; actions, then change the default entry for sleep_type_battery from 'hibernate' to 'suspend.'&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This should get you fixed up.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now for the tedious one...&lt;b&gt;&lt;big&gt;wireless&lt;/big&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have the default Ralink wireless card, for now you'll have to get the driver from the manufacturer's website, build it and install it (&lt;a href="http://218.210.127.131/downloads/downloadsView.aspx?Langid=1&amp;amp;PNid=48&amp;amp;PFid=48&amp;amp;Level=5&amp;amp;Conn=4&amp;amp;DownTypeID=3&amp;amp;GetDown=false&amp;amp;Downloads=true#2782"&gt;download it here&lt;/a&gt;). However, the driver *should* work out-of-the-box in Natty.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;big&gt;&lt;b&gt;UPDATE 3/21/11&lt;/b&gt;&lt;/big&gt;: annoyingly, my system keeps deactivating the driver. I give up on Maverick and have to recommend skipping to Natty instead.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the recommendation of others, I purchased my machine with the optional Broadcom 802.11 a/b/g/n wireless card instead of the default Ralink card. Unfortunately, the Broadcom card isn't much better. It uses the 802.11 Linux STA driver, but the device isn't supported by the version available in the official Ubuntu repos. Instead, we'll have to download and install it directly from Broadcom.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To get it going, first you want to download the driver from &lt;a href="http://www.broadcom.com/support/802.11/linux_sta.php"&gt;this page&lt;/a&gt;. The drivers are specific to your CPU architecture, so make sure you get the right one. After that, we need to install some prerequisites to build the driver:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;sudo apt-get install build-essential linux-headers-`uname -r`&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Now, we'll navigate to wherever you downloaded the driver (I'm going to assume it's located in the default ~/Downloads directory):&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;cd ~/Downloads&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Decompress the archive:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;tar -xvf hybrid-portsrc_x86_64-v5_100_82_38.tar.gz&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;and then build and install the driver:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;make &amp;amp;&amp;amp; sudo make install&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;The driver is now installed, but we need to activate it and tie up some loose ends. So, still in a terminal, type:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;sudo depmod -a&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;This will fetch all of the dependencies for drivers located in /lib/modules (including our newly installed driver).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, we'll make sure no conflicting drivers are in use by typing:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;sudo rmmod bcm43xx&lt;/div&gt;&lt;div&gt;sudo rmmod b43&lt;/div&gt;&lt;div&gt;sudo rmmod b43legacy&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;and then try our new driver out by typing:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;sudo modprobe lib80211_crypt_tkip &amp;amp;&amp;amp; sudo insmod wl.ko&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;At this point, your wireless should start working. If it does, we need to make sure conflicting drivers don't start bothering us again by typing:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;sudo gedit /etc/modprobe.d/blacklist&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;and adding these lines:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;blacklist b43&lt;/div&gt;&lt;div&gt;blacklist b43legacy&lt;/div&gt;&lt;div&gt;blacklist bcm43xx&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Save and exit. Then, back in the terminal, type:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;sudo gedit /etc/modules&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;and add:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;ieee80211_crypt_tkip&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;at the bottom. Then, type:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;sudo gedit /etc/rc.local&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;and add this:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;sudo insmod /lib/modules/[whatever your kernel revision is]/wlan/wl.ko&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;to the end of the file, but before it says "exit 0."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You should be all set at that point. If you need to reverse these steps for whatever reason, just go back through these steps and delete the lines we added.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Last, we'll talk a bit about &lt;b&gt;&lt;big&gt;graphics drivers&lt;/big&gt;&lt;/b&gt;. The open source drivers do not support our fancy new APU graphics, so we'll have to use the proprietary fglrx driver binary blob from AMD, which you can install through the 'Additional Drivers' applet, located under the System &amp;gt; Administration menus. However, after rebooting, you'll see (at the time of this writing) a translucent black square in the bottom-right corner of your screen that shows an AMD logo and says 'Unsupported hardware.'&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This can be avoided by manually installing a newer fglrx driver directly from AMD instead of using the package from the official repos, but that adds its own hassles that I didn't feel like dealing with, such as needing to manually reinstall the driver after every kernel update. If you would rather go that route, you can find &lt;a href="http://wiki.cchtml.com/index.php/Ubuntu_Maverick_Installation_Guide#Installing_Proprietary_Drivers_a.k.a._Catalyst.2Ffglrx"&gt;detailed instructions here&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-5525938947686731721?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/5525938947686731721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=5525938947686731721' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/5525938947686731721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/5525938947686731721'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/03/ubuntu-maverick-on-lenovo-x120e-fusion.html' title='Ubuntu Maverick on Lenovo X120e Fusion Laptop'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-6150336181056288825</id><published>2011-03-08T09:51:00.000-08:00</published><updated>2011-03-08T10:42:03.489-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssnes'/><category scheme='http://www.blogger.com/atom/ns#' term='CRT'/><category scheme='http://www.blogger.com/atom/ns#' term='pixel shader'/><title type='text'>Filter and Shader Stacking In SSNES</title><content type='html'>Themaister just added support for multipass shader application--a.k.a. shader stacking--to SSNES, his excellent (and recently GUI-fied) frontend for libsnes. His implementation includes some interesting and fancy options, including configurable scale factors for the first pass (i.e., the first shader). This allows hq2x to be scaled to its expected scale factor during the first pass and then scaled up again to fit the desired resolution, resulting in much better retention of detail (&lt;a href="http://board.byuu.org/viewtopic.php?p=30940#p30940"&gt;see this post for a side-by-side comparison&lt;/a&gt; of the two scaling methods). Additionally, we can use the second pass to stack a scanline shader on top of the resulting image, or even cgwg's CRT shaders:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-MpPPNO_4LBw/TXZw1OJvQqI/AAAAAAAAA0Y/5Vs8XFRbZOc/s1600/hq2x%252BCRTflat%252Bntsc-CT.png"&gt;&lt;img src="http://4.bp.blogspot.com/-MpPPNO_4LBw/TXZw1OJvQqI/AAAAAAAAA0Y/5Vs8XFRbZOc/s200/hq2x%252BCRTflat%252Bntsc-CT.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5581772847806628514" style="cursor: pointer; width: 200px; height: 157px; " /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-edEezHpaPzw/TXZw0aJoaQI/AAAAAAAAA0Q/NfPolhtx0kg/s1600/hq2x%252BCRTflat%252Bntsc-SMW.png"&gt;&lt;img src="http://2.bp.blogspot.com/-edEezHpaPzw/TXZw0aJoaQI/AAAAAAAAA0Q/NfPolhtx0kg/s200/hq2x%252BCRTflat%252Bntsc-SMW.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5581772833847535874" style="cursor: pointer; width: 200px; height: 157px; " /&gt;&lt;/a&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-edEezHpaPzw/TXZw0aJoaQI/AAAAAAAAA0Q/NfPolhtx0kg/s1600/hq2x%252BCRTflat%252Bntsc-SMW.png"&gt;&lt;/a&gt;As you can see, this combination greatly smooths out the jaggies and rounds the curves without blasting out all of the details, like hq2x can often do on its own.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;This two-pass shader implementation also allows users to control the amount of bloom applied by a bloom shader in the first pass simply by modifying the scale factor. Here are two examples in which I've stacked blargg's NTSC filter, cgwg's CRT-Flat v3 shader, and Whateverman's simplebloom shader (rendered at 2x and 1x respectively):&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-_rjXJt0FyXs/TXZwXanjYpI/AAAAAAAAA0I/bPHWtvwteb0/s1600/simplebloom2x%252Bcgwg%252Bntsc-CT.png"&gt;&lt;img src="http://1.bp.blogspot.com/-_rjXJt0FyXs/TXZwXanjYpI/AAAAAAAAA0I/bPHWtvwteb0/s200/simplebloom2x%252Bcgwg%252Bntsc-CT.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5581772335756829330" style="cursor: pointer; width: 200px; height: 157px; " /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-CzWkTQj2EUQ/TXZwW6G5ZaI/AAAAAAAAA0A/b7Vzw6cZ4a0/s1600/simplebloom1x%252Bcgwg%252Bntsc-CT.png"&gt;&lt;img src="http://1.bp.blogspot.com/-CzWkTQj2EUQ/TXZwW6G5ZaI/AAAAAAAAA0A/b7Vzw6cZ4a0/s200/simplebloom1x%252Bcgwg%252Bntsc-CT.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5581772327029925282" style="cursor: pointer; width: 200px; height: 157px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;In my opinion, this combination of bloom+CRT shaders+NTSC filter is &lt;a href="http://img440.imageshack.us/img440/1803/phosphor2xbyuusphos2xbl.png"&gt;exceptionally close to the Photoshop renders&lt;/a&gt; that inspired the CRT shader effort.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Windows binaries for &lt;a href="https://github.com/downloads/Themaister/SSNES/ssnes-win32-0.3.2-test.zip"&gt;this latest version of SSNES are available here&lt;/a&gt;, while &lt;a href="https://launchpad.net/~hunter-kaller/+archive/ppa/+packages"&gt;Linux users can download deb binaries from my PPA repo&lt;/a&gt;. Mac users can also get in on the fun, but they'll have to compile everything themselves, as no one is providing Mac packages of SSNES yet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As always, any shaders covered here are available in &lt;a href="http://www.mediafire.com/?awpl15dspshis"&gt;my mediafire account&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-6150336181056288825?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/6150336181056288825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=6150336181056288825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6150336181056288825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6150336181056288825'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/03/filter-and-shader-stacking-in-ssnes.html' title='Filter and Shader Stacking In SSNES'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-MpPPNO_4LBw/TXZw1OJvQqI/AAAAAAAAA0Y/5Vs8XFRbZOc/s72-c/hq2x%252BCRTflat%252Bntsc-CT.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-7857579771679278576</id><published>2011-03-03T10:09:00.000-08:00</published><updated>2011-03-03T10:30:39.656-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='glsl'/><category scheme='http://www.blogger.com/atom/ns#' term='SNES'/><category scheme='http://www.blogger.com/atom/ns#' term='bsnes'/><category scheme='http://www.blogger.com/atom/ns#' term='pixel shader'/><title type='text'>Themaister's Waterpaint and Scanline Pixel Shaders for SNES</title><content type='html'>Themaister, author of the excellent libsnes interface &lt;a href="http://board.byuu.org/viewtopic.php?f=17&amp;amp;t=1308"&gt;SSNES&lt;/a&gt;, has been working on some really fantastic GLSL pixel shaders for use with compatible emulators, such as bsnes and SNES9x.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, we'll take a look at the waterpaint shader, which has an effect similar to smoothing filters, such as SuperSaI, but with a little extra fattening that gives it the appearance of a watercolor painting:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-BJj6fPyH7lY/TW_axrsJEZI/AAAAAAAAAzA/AqKHux3-KBA/s1600/waterpaint.png"&gt;&lt;img src="http://1.bp.blogspot.com/-BJj6fPyH7lY/TW_axrsJEZI/AAAAAAAAAzA/AqKHux3-KBA/s200/waterpaint.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5579919010411647378" style="cursor: pointer; width: 200px; height: 164px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;This looks great already, but text can sometimes get a bit hard to read and some details get flattened out, so he also made a version that includes light scanlines (both the standard horizontal scanlines, as well as faint vertical lines, as would be found in a phospher mask):&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-y6g_ks6M_8U/TW_bJ-n5yeI/AAAAAAAAAzI/hQNixpVv7M8/s1600/waterpaint-scanline.png"&gt;&lt;img src="http://2.bp.blogspot.com/-y6g_ks6M_8U/TW_bJ-n5yeI/AAAAAAAAAzI/hQNixpVv7M8/s200/waterpaint-scanline.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5579919427811002850" style="cursor: pointer; width: 200px; height: 164px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;I think this version does a better job of maintaining fine details and really looks nice, especially on Zelda:LttP.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next, he produced a beautiful (and easily customizable) resolution-agnostic scanline shader. In contrast with my own scanline shaders, Themaister's shader will work with any scale factor instead of having one hardcoded in. Here's how his default version looks without and with bilinear filtering (smooth video), respectively:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-AmB7o7TBsCY/TW_cAeg123I/AAAAAAAAAzQ/d3Pa3bM2j0s/s1600/scanline-light-nosmoothing.png"&gt;&lt;img src="http://4.bp.blogspot.com/-AmB7o7TBsCY/TW_cAeg123I/AAAAAAAAAzQ/d3Pa3bM2j0s/s200/scanline-light-nosmoothing.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5579920364084255602" style="cursor: pointer; width: 200px; height: 164px; " /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-q-YzAYfeI1Q/TW_cAtEa_LI/AAAAAAAAAzY/lcRaHoqHrYY/s1600/scanline-light-smooth.png"&gt;&lt;img src="http://2.bp.blogspot.com/-q-YzAYfeI1Q/TW_cAtEa_LI/AAAAAAAAAzY/lcRaHoqHrYY/s200/scanline-light-smooth.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5579920367991585970" style="cursor: pointer; width: 200px; height: 164px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;In addition to this default, I modified the settings to create medium and dark scanline settings, as well (each shown without and with bilinear filtering enabled, respectively):&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-BIWkOy41Lic/TW_cjisEXdI/AAAAAAAAAz4/F30J93ANlHs/s1600/scanline-med-nosmooth.png"&gt;&lt;img src="http://4.bp.blogspot.com/-BIWkOy41Lic/TW_cjisEXdI/AAAAAAAAAz4/F30J93ANlHs/s200/scanline-med-nosmooth.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5579920966500507090" style="cursor: pointer; width: 200px; height: 164px; " /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-c6sxOAKKoY8/TW_cjPuvXpI/AAAAAAAAAzw/o7h-W-KJgiQ/s1600/scanline-med-smooth.png"&gt;&lt;img src="http://1.bp.blogspot.com/-c6sxOAKKoY8/TW_cjPuvXpI/AAAAAAAAAzw/o7h-W-KJgiQ/s200/scanline-med-smooth.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5579920961411440274" style="cursor: pointer; width: 200px; height: 164px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-byxoj5COcxY/TW_cjBYq9nI/AAAAAAAAAzo/O2NvvPEBzyA/s1600/scanline-dark-nosmooth.png"&gt;&lt;img src="http://4.bp.blogspot.com/-byxoj5COcxY/TW_cjBYq9nI/AAAAAAAAAzo/O2NvvPEBzyA/s200/scanline-dark-nosmooth.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5579920957560780402" style="cursor: pointer; width: 200px; height: 164px; " /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-zgBcf_g4HoY/TW_cixV38eI/AAAAAAAAAzg/Cf6rVHgu0vQ/s1600/scanline-dark-smooth.png"&gt;&lt;img src="http://4.bp.blogspot.com/-zgBcf_g4HoY/TW_cixV38eI/AAAAAAAAAzg/Cf6rVHgu0vQ/s200/scanline-dark-smooth.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5579920953254080994" style="cursor: pointer; width: 200px; height: 164px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;You can download these shader's from &lt;a href="http://www.mediafire.com/?8vprsz4e6wro8"&gt;my mediafire account&lt;/a&gt;. If you would like to modify the scaline shaders yourself, you can play around with these figures:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;const float base_brightness = 0.95;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;const vec2 sine_comp = vec2(0.05, 0.15);&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-7857579771679278576?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/7857579771679278576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=7857579771679278576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/7857579771679278576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/7857579771679278576'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/03/themaisters-waterpaint-and-scanline.html' title='Themaister&apos;s Waterpaint and Scanline Pixel Shaders for SNES'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-BJj6fPyH7lY/TW_axrsJEZI/AAAAAAAAAzA/AqKHux3-KBA/s72-c/waterpaint.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-4632887209918334164</id><published>2011-02-05T14:43:00.000-08:00</published><updated>2012-01-23T08:15:26.965-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='moveset swap'/><category scheme='http://www.blogger.com/atom/ns#' term='face-fixing'/><category scheme='http://www.blogger.com/atom/ns#' term='sf4'/><title type='text'>Beginner's Guide to Face-fixing</title><content type='html'>Many of the steps in this tutorial are no longer necessary in SSF4AE. You can just copy over the donor's *.fce.ema file and overwrite the recipient's.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE (11/26/11)&lt;/b&gt;: you can now use &lt;a href="http://aemods.pbworks.com/w/page/42053948/aetools#MonkeyFix"&gt;sloth86's MonkeyFix tool&lt;/a&gt;&amp;nbsp;in conjunction with the replaced *.fce.ema to get fixed faces all the time, even through the cinematics.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;If you've experimented with moveswapping across characters, you've certainly seen the horrible deformation that occurs to their faces, commonly known as "monkeyface."&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3T-ODp8vI/AAAAAAAAAws/G1H4PaZIecQ/s1600/monkeyface.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570341380005950194" src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3T-ODp8vI/AAAAAAAAAws/G1H4PaZIecQ/s200/monkeyface.jpg" style="cursor: pointer; height: 184px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;This tutorial is going to show you how to swap movesets (we're actually swapping models, but it comes out to the same thing) without the monkeyface problem (except in cinematics, such as intro/outro and during ultras).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Background&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Animations and movesets in Street Fighter 4 are stored in the ***.cmn.emz file. Specifically, facial animations are stored in the ***.fce.ema file, which is itself a component of the cmn.emz file. To transplant these face animations from one character alongside the moveset of another character, we're going to have to collect a few tools: piecemontee's Asset Explorer, Kensou's Tool and your favorite hex editor (I use the free and open source Frhed).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Getting Started&lt;/b&gt;&lt;/div&gt;&lt;div&gt;First, identify which characters we're going to mess with and backup their chara directories. I'll be using Chun Li's model (I'll refer to her as the 'donor') on Sagat's moveset (I'll refer to him as the 'receiver'), so I made copies of those files.&lt;/div&gt;&lt;div&gt;Next, run the donor's cos and col files through the Asset Explorer, along with both characters' cmn.emz files (in my case, CNL.cmn.emz and SGT.cmn.emz). This will decompress them and get them ready for modding.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, open the donor's cos and col files in a hex editor, scroll all the way down to the bottoms of the files and change the 3-letter character name references to match the receivers'. In my case, I changed the CNL instances to SGT (there will be 4 instances to change in the cos file and 2 in the col file). Then, rename the files to match (e.g., CNL_01.cos.emz to SGT_01.cos.emz and CNL_01_01.col.emz to SGT_01_01.col.emz).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At this point, you should copy those new donor model files over to the receiver's chara folder (in my case, the SGT directory) and make sure the game loads without crashing. If it loads ok, you should see some monkeyface. Good job, we're halfway there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Extracting the CMN components&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Now, open the receiver's cmn.emz file in the Asset Explorer. Click the 'plus' signs to expand the base file and the overall #EMB file, like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Kzdww8T9fUA/TU3T-ewt7_I/AAAAAAAAAw0/8WOesU9_Whs/s1600/expanded%2Bcmn.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570341384489922546" src="http://2.bp.blogspot.com/_Kzdww8T9fUA/TU3T-ewt7_I/AAAAAAAAAw0/8WOesU9_Whs/s200/expanded%2Bcmn.jpg" style="cursor: pointer; height: 169px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Then, left-click on the first section (#EMO (SGT.skl.emo)) to select it and then right-click on it and choose 'Raw dump...' Repeat this process for each section in the cmn.emz file except for the *.cam.ema file, which will crash the Asset Explorer if you select it. Unfortunately, we need that section, so we'll have to get it the hard way--via hex editor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Isolating the cam.ema Component&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Open the receiver's cmn.emz file in a hex editor and make your way down to the third section labeled '#EMA' (I find it easiest to search sequentially through the document for #EMA 3 times). It will be the last one in the file.&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3T-ZnwJPI/AAAAAAAAAw8/W9GNCOMzXBM/s1600/finding%2Bema.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570341383110141170" src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3T-ZnwJPI/AAAAAAAAAw8/W9GNCOMzXBM/s200/finding%2Bema.jpg" style="cursor: pointer; height: 200px; width: 194px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Now, write down where it starts, in my case x760e40.&lt;/div&gt;&lt;div&gt;Next, we need to find the end of that section, which is most easily accomplished by searching again, but this time for '#BAC.'&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TU3T--RchGI/AAAAAAAAAxE/fTPvetNmws8/s1600/finding%2Bbac.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570341392948692066" src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TU3T--RchGI/AAAAAAAAAxE/fTPvetNmws8/s200/finding%2Bbac.jpg" style="cursor: pointer; height: 200px; width: 194px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Now, select everything between that last #EMA (at the location we wrote down) and the beginning of #BAC&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Kzdww8T9fUA/TU3T_Pjcz2I/AAAAAAAAAxM/1wAP9OKvCWQ/s1600/selecting.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570341397587611490" src="http://4.bp.blogspot.com/_Kzdww8T9fUA/TU3T_Pjcz2I/AAAAAAAAAxM/1wAP9OKvCWQ/s200/selecting.jpg" style="cursor: pointer; height: 200px; width: 194px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Copy it and paste it into a new file and save it with the appropriate name (in my case, SGT.cam.ema):&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Kzdww8T9fUA/TU3UkQiVwtI/AAAAAAAAAxU/Uf1CAexQeMM/s1600/saving.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570342033506550482" src="http://2.bp.blogspot.com/_Kzdww8T9fUA/TU3UkQiVwtI/AAAAAAAAAxU/Uf1CAexQeMM/s200/saving.jpg" style="cursor: pointer; height: 125px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Ok, now that we have all of our receiver's cmn components extracted and isolated, we're ready to get our donor's face animation ready for transplantation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Open the donor's cmn.emz file in the Asset Explorer and expand it just like we did with the receiver's cmn file earlier on. Left-click on the section labeled #EMA (***.fce.ema) and then right-click and select 'Raw dump...' just like before.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, we want to rename that file--in my case, CNL.fce.ema--to match the receiver's other files (you'll have to overwrite the receiver's original fce.ema file in the process, but we don't need it anyway, so no big deal). Alright, we're almost there. Time to rebuild the receiver's cmn file with the new face data using Kensou's Tool.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Repacking A New File&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Open up the directory for Kensou's Tool, then navigate to 'sf4' and then the 'emz' directory (you might have to create this directory if it doesn't already exist). Take your receiver's 6 original cmn component files that we raw-dumped, along with the renamed fac.ema file from our donor, and place them all in the aforementioned 'emz' directory:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3UkRFAPbI/AAAAAAAAAxc/AlOBVnLq9Zw/s1600/emz.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570342033651940786" src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3UkRFAPbI/AAAAAAAAAxc/AlOBVnLq9Zw/s200/emz.jpg" style="cursor: pointer; height: 137px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Go back into the sf4 directory and launch sf4tool.exe:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Kzdww8T9fUA/TU3UlfJHjxI/AAAAAAAAAx0/FihOO_KNIuY/s1600/sf4tool.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570342054607163154" src="http://4.bp.blogspot.com/_Kzdww8T9fUA/TU3UlfJHjxI/AAAAAAAAAx0/FihOO_KNIuY/s200/sf4tool.jpg" style="cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;In the big pane to the right with all of the directory structure, double-click on the folder labeled 'emz,' then click on the left-hand button below that pane. It should then populate the smaller, lower-left pane with a bunch of paths referencing our cmn component files:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3UlGcpFXI/AAAAAAAAAxk/jGhCBYgSanw/s1600/populated.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570342047978165618" src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3UlGcpFXI/AAAAAAAAAxk/jGhCBYgSanw/s200/populated.jpg" style="cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;These files need to be in exactly the same order as the ones in the original cmn.emz file (skl.emo, skl.emm, obj.ema, fce.ema, cam.ema, bac and bcm) but they won't be by default, so we'll need to click into that pane and do a little manual reordering. Everything should be in order except for the last two, so just copy/paste their paths into the right spots.&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Kzdww8T9fUA/TU3UlV4HFjI/AAAAAAAAAxs/aPNwix4zLic/s1600/reordered.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570342052119909938" src="http://4.bp.blogspot.com/_Kzdww8T9fUA/TU3UlV4HFjI/AAAAAAAAAxs/aPNwix4zLic/s200/reordered.jpg" style="cursor: pointer; height: 156px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Once that's done, click the right-hand button to combine everything. It should pop up this window:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3U-OKhp6I/AAAAAAAAAx8/Dwv-JbWtZFo/s1600/ok.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570342479546394530" src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3U-OKhp6I/AAAAAAAAAx8/Dwv-JbWtZFo/s200/ok.jpg" style="cursor: pointer; height: 154px; width: 154px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;and you should have a shiny new file named 'newpack.emz' alongside your original cmn component files in the 'emz' directory. Now we're really in the home stretch.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Testing it Out&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Rename your newpack.emz file to match the receiver's cmn file--in my case, SGT.cmn.emz.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Copy that file into your receiver's chara directory and overwrite the old one (you made sure to make a backup, right? Right??) and go test it out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you did everything correctly, you should have a perfectly normal face:&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Kzdww8T9fUA/TU3U-IhGHSI/AAAAAAAAAyE/sdzG3qN01Fo/s1600/fixed%2Bface.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5570342478030445858" src="http://2.bp.blogspot.com/_Kzdww8T9fUA/TU3U-IhGHSI/AAAAAAAAAyE/sdzG3qN01Fo/s200/fixed%2Bface.jpg" style="cursor: pointer; height: 200px; width: 158px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Congratulations!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-4632887209918334164?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/4632887209918334164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=4632887209918334164' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/4632887209918334164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/4632887209918334164'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/02/beginners-guide-to-face-fixing.html' title='Beginner&apos;s Guide to Face-fixing'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Kzdww8T9fUA/TU3T-ODp8vI/AAAAAAAAAws/G1H4PaZIecQ/s72-c/monkeyface.jpg' height='72' width='72'/><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-3519055996444708013</id><published>2011-02-01T21:27:00.000-08:00</published><updated>2011-02-02T13:52:27.420-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='filters'/><category scheme='http://www.blogger.com/atom/ns#' term='HLSL'/><category scheme='http://www.blogger.com/atom/ns#' term='bsnes'/><category scheme='http://www.blogger.com/atom/ns#' term='pixel shader'/><title type='text'>Mudlord's HLSL Shaders for BSNES</title><content type='html'>I came across a set of HLSL pixel shaders from mudlord that were intended for use with snes9x, so I formatted them for use with bsnes and everything seems to work just fine. &lt;a href="http://www.mediafire.com/download.php?xs31jjsn0s9q2ds"&gt;You can download the whole pack here&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are some screenshots from a couple of them:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Emboss&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Kzdww8T9fUA/TUjsC9PqG4I/AAAAAAAAAv8/wSB5ldLQhWI/s1600/emboss.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Kzdww8T9fUA/TUjsC9PqG4I/AAAAAAAAAv8/wSB5ldLQhWI/s200/emboss.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5568960474787748738" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Looks pretty cool but gets old quickly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Blur 2&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TUjsCN2E4UI/AAAAAAAAAvs/uAGkAUE0F3k/s1600/blur2.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TUjsCN2E4UI/AAAAAAAAAvs/uAGkAUE0F3k/s200/blur2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5568960462063984962" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;There are 4 different blur settings. The first one actually looks pretty decent, but the rest are too intense for me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. Pixelator&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Kzdww8T9fUA/TUjsCUYcgvI/AAAAAAAAAv0/g22LOThMtM0/s1600/pixelator.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Kzdww8T9fUA/TUjsCUYcgvI/AAAAAAAAAv0/g22LOThMtM0/s200/pixelator.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5568960463818752754" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Hmmm. Can't really see shit... Kinda like if your favorite SNES game came out on Atari first.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. Toon&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TUjsDICWAbI/AAAAAAAAAwE/NRkyL-0ZMuo/s1600/toon.png"&gt;&lt;img src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TUjsDICWAbI/AAAAAAAAAwE/NRkyL-0ZMuo/s200/toon.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5568960477684695474" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;This one actually looks really cool. It makes everything look like Yoshi's Island :D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are a number of others in the pack, including all of the blurs, another take on bloom, a toon shader without the black outlines and a couple that cover everything with a wave mask.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This pack gives D3D users a bit more freedom beyond the lone Sepia filter that comes with bsnes, and I hope to add more of these in the future. I'll post them here if/when I come across them.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;UPDATE (2/2/11):&lt;/div&gt;&lt;div&gt;I fiddled around with some and came up with a couple more. They're essentially functioning just like mudlord's 'emboss' shader, but they maintain color:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. color emboss bright&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TUnRUzVAx2I/AAAAAAAAAwM/96CzRe5E2QU/s1600/color%2Bemboss%2Bbright.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TUnRUzVAx2I/AAAAAAAAAwM/96CzRe5E2QU/s200/color%2Bemboss%2Bbright.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5569212569526257506" style="cursor: pointer; width: 200px; height: 175px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;2. color emboss mild (this one requires that 'smooth video' be enabled to work properly; similar results to smooth video+mudlord's 'sharpen' shader)&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TUnRVjmt5vI/AAAAAAAAAwc/PKXFg_3YDF4/s1600/color%2Bemboss%2Bmild2.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TUnRVjmt5vI/AAAAAAAAAwc/PKXFg_3YDF4/s200/color%2Bemboss%2Bmild2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5569212582485419762" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Kzdww8T9fUA/TUnRVG-Q_oI/AAAAAAAAAwU/5MH4bsV81to/s1600/color%2Bemboss%2Bmild.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Kzdww8T9fUA/TUnRVG-Q_oI/AAAAAAAAAwU/5MH4bsV81to/s200/color%2Bemboss%2Bmild.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5569212574799560322" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-3519055996444708013?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/3519055996444708013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=3519055996444708013' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3519055996444708013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3519055996444708013'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/02/mudlords-hlsl-shaders-for-bsnes.html' title='Mudlord&apos;s HLSL Shaders for BSNES'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Kzdww8T9fUA/TUjsC9PqG4I/AAAAAAAAAv8/wSB5ldLQhWI/s72-c/emboss.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-477572635103018943</id><published>2011-01-24T12:47:00.000-08:00</published><updated>2011-01-24T13:15:17.109-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssnes'/><category scheme='http://www.blogger.com/atom/ns#' term='squeeze'/><category scheme='http://www.blogger.com/atom/ns#' term='bsnes'/><category scheme='http://www.blogger.com/atom/ns#' term='PPA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lucid Lynx'/><title type='text'>BSNES on Older Distros, such as Lucid and Squeeze</title><content type='html'>In addition to being on the forefront of SNES emulation, BSNES also utilizes cutting-edge programming techniques to maintain the cleanest, most easily readable code possible. Unfortunately, that means that older distros--even ones that are still well within their supported lifespan--may get left out in the cold.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, BSNES forums user Themaister has done us all a favor and backported byuu's cutting-edge C++0x code to use the more widely supported C++98 standard, which allows it to be compiled on any version of GCC from 3.x on up. The only catch is that his work only applies to libsnes, the modular emulation core of BSNES in library form, so byuu's official Phoenix GUI is still off limits, as is his libsnes-driven Qt GUI.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thankfully, Themaister has us covered here, too, by offering SSNES, his super-slim CLI-only interface to libsnes. Just like his C++98 port of libsnes, SSNES can be readily compiled with even extremely old versions of GCC, so any semi-modern distro should be able to use it just fine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My PPA now contains Lucid packages for both libsnes (all three official cores, plus an snes9x-based core for legacy machines) and SSNES, which should also (hopefully) work on Debian Squeeze.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A few things I'd like to point out about SSNES:&lt;/div&gt;&lt;div&gt;1. It will accept a variety of audio drivers, including jack, which allows ultra-low latency :D&lt;/div&gt;&lt;div&gt;2. My package was built using dynamic libsnes linking, so it requires a libsnes package from my PPA to function&lt;/div&gt;&lt;div&gt;3. In addition to accepting BSNES-style XML shaders written in GLSL, SSNES will also accept shaders written in Nvidia's Cg language if you install the nvidia-cg-toolkit package&lt;/div&gt;&lt;div&gt;4. The default configuration file for SSNES is located at /etc/ssnes.cfg, but you can override this by placing another config file in ~/.config/ssnes&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As always, let me know if you run into any problems with these packages.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-477572635103018943?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/477572635103018943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=477572635103018943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/477572635103018943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/477572635103018943'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/01/bsnes-on-older-distros-such-as-lucid.html' title='BSNES on Older Distros, such as Lucid and Squeeze'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-6833768416976978635</id><published>2011-01-20T07:49:00.001-08:00</published><updated>2011-01-20T08:32:01.792-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ups'/><category scheme='http://www.blogger.com/atom/ns#' term='flames of eternity'/><category scheme='http://www.blogger.com/atom/ns#' term='chrono trigger'/><category scheme='http://www.blogger.com/atom/ns#' term='bsnes'/><category scheme='http://www.blogger.com/atom/ns#' term='crimson echoes'/><title type='text'>Crimson Echoes and Flames of Eternity</title><content type='html'>These two ROMhacks for the legendary SNES RPG Chrono Trigger were just leaked on Reddit the other day and I happened across some bsnes-compatible UPS patches, &lt;a href="http://sharebee.com/931d2378"&gt;which you can download here&lt;/a&gt;. (I didn't make these patches, btw, and I didn't upload them)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I haven't played through them yet, but they seem to work fine from what I've seen. They will get past the initial intro sequence and into the playable game, but I haven't tested any further than that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They were tested with an unheadered Chrono Trigger ROM that had been run through snespurify.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll update this post with anything interesting I find in my playthrough.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-6833768416976978635?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/6833768416976978635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=6833768416976978635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6833768416976978635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6833768416976978635'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/01/crimson-echoes-and-flames-of-eternity.html' title='Crimson Echoes and Flames of Eternity'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-6945690856613662182</id><published>2011-01-15T06:05:00.000-08:00</published><updated>2011-03-25T09:38:36.062-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='launchpad'/><category scheme='http://www.blogger.com/atom/ns#' term='pbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='PPA'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Setting Up Pbuilder To Act Like Launchpad Build Farm</title><content type='html'>I build a lot of packages for my Launchpad PPA and I use a number of different systems to do it, so I find myself needing to set up pbuilder environments to test my build procedures pretty often. Unfortunately, documentation for this procedure is often out of date and/or goes into a lot of strange details and edge-cases that are unrelated to me, so I decided to write down my steps for future reference.&lt;br /&gt;&lt;br /&gt;Here's what I do:&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;1&lt;/span&gt;&lt;/b&gt;. Install pbuilder and some other handy packages&lt;br /&gt;Open up a terminal and type:&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt;sudo aptitude install pbuilder debhelper devscripts build-essential&lt;/blockquote&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;2&lt;/span&gt;&lt;/b&gt;. Tell the pbuilder environment that it is going to act just like the Launchpad build farm&lt;br /&gt;Still in our terminal:&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt;sudo pbuilder create --debootstrapopts --variant=buildd&lt;/blockquote&gt;&lt;/span&gt;This one takes a while because it's basically installing an entire system inside your existing installation, so grab a cup of coffee and watch the messages fly by.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;3&lt;/span&gt;&lt;/b&gt;. Give it access to all official Ubuntu repositories&lt;div&gt;By default, your shiny new pbuilder environment won't have access to a lot of packages, so we'll want to add mirrors for common Ubuntu packages, as well as our own PPA to the pbuilder configuration file. So, still in a terminal, type:&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt;nano ~/.pbuilderrc&lt;/blockquote&gt;&lt;/span&gt;and paste in:&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt;OTHERMIRROR="deb http://archive.ubuntu.com/ubuntu [YOUR UBUNTU VERSION] main restricted universe multiverse | deb http://archive.ubuntu.com/ubuntu [YOUR UBUNTU VERSION]-backports main restricted universe multiverse | deb http://archive.ubuntu.com/ubuntu [YOUR UBUNTU VERSION]-security main restricted universe multiverse | deb http://archive.ubuntu.com/ubuntu [YOUR UBUNTU VERSION]-updates main restricted universe multiverse"&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;and we'll also pipe on a section for our PPA, so we can use our own packages as dependencies, which in my case looks like this:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt; | deb http://ppa.launchpad.net/hunter-kaller/ppa/ubuntu maverick main&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;4&lt;/span&gt;&lt;/b&gt;. Make our pbuilder trust packages from our PPA&lt;/div&gt;&lt;div&gt;First, we'll login to our pbuilder environment:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt;sudo pbuilder --login --save-after-login&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Then, we'll give it the public key to our PPA, just like if we were adding it to our own keyring:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; line-height: 13px; "&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt;apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [YOUR PUBLIC KEY HERE]&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;If all goes well, you can leave your pbuilder environment by typing:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt;exit&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;5&lt;/span&gt;&lt;/b&gt;. Update our environment with these new packages&lt;/div&gt;&lt;div&gt;Still in our terminal, type:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt;sudo pbuilder --update --override-config&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;This should get you in pretty good shape. Let me know if you run into any issues.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-6945690856613662182?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/6945690856613662182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=6945690856613662182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6945690856613662182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/6945690856613662182'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/01/setting-up-pbuilder-to-act-like.html' title='Setting Up Pbuilder To Act Like Launchpad Build Farm'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-5587321061174135817</id><published>2011-01-11T13:06:00.000-08:00</published><updated>2011-02-28T11:01:36.829-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shader'/><category scheme='http://www.blogger.com/atom/ns#' term='bloom'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='bsnes'/><category scheme='http://www.blogger.com/atom/ns#' term='CRT'/><title type='text'>Bloom Pixel Shader for bsnes</title><content type='html'>I did some digging around online and came across some &lt;a href="http://myheroics.wordpress.com/2008/09/04/glsl-bloom-shader/"&gt;bloom filters written in GLSL&lt;/a&gt;. The one &lt;a href="http://www.hlc-games.de/forum/viewtopic.php?f=15&amp;amp;t=171"&gt;on this site&lt;/a&gt; looked the best to my eyes, so I converted it to work with bsnes and tweaked the settings a bit to achieve the desired effects.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I found while playing around with it is:&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;&lt;span class="Apple-style-span"&gt;1.&lt;/span&gt;&lt;/big&gt;&lt;/b&gt; Turning on 'Smooth video' seems to amplify the bloom effect.&lt;/div&gt;&lt;div&gt;&lt;big&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;2. &lt;/span&gt;&lt;/b&gt;&lt;/big&gt;The same amount of bloom looks different on each game, depending on the overall dark/light-ness of the game.&lt;/div&gt;&lt;div&gt;&lt;big&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;3.&lt;/span&gt;&lt;/b&gt;&lt;/big&gt; Combining excessive bloom with bsnes' scanline filters can make a pretty decent approximation of a CRT. While this is in no way as accurate or as nice looking as cgwg's CRT shaders, it may be an option for the many people whose video cards don't have enough horsepower to handle that complex shader.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, I made a simple, fairly subtle (as far as bloom is concerned...) shader, which looks like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TSzJVryetII/AAAAAAAAAuo/vL0Z2rgQ3Zc/s1600/simplebloom.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TSzJVryetII/AAAAAAAAAuo/vL0Z2rgQ3Zc/s200/simplebloom.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5561041014264607874" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Looks pretty nice, eh? Unfortunately, the exact same shader settings look awful in Super Mario World:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TSzJ18sTX_I/AAAAAAAAAvI/cppw_4uAGWU/s1600/simplebloomsmw.png"&gt;&lt;img src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TSzJ18sTX_I/AAAAAAAAAvI/cppw_4uAGWU/s200/simplebloomsmw.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5561041568557916146" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;One big flare-out... All I need is some brown and lens flare and I'll have next-gen graphics.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, if you add in a scanline filter, things can really get evened out. In fact, you can use the different scanline intensity filters on a game-to-game basis to attenuate the inconsistency of the bloom effect. For example, here's a shot of Super Mario World with even more bloom added and 'smooth video' checked, but with 100% scanlines to chill things out a bit:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TSzJX4_PIII/AAAAAAAAAvA/CDbllrJmPi0/s1600/heavy%2Bbloom%2B-%2B00%2Bscanlines%2B-%2Bsmooth%2Bvideo.png"&gt;&lt;img src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TSzJX4_PIII/AAAAAAAAAvA/CDbllrJmPi0/s200/heavy%2Bbloom%2B-%2B00%2Bscanlines%2B-%2Bsmooth%2Bvideo.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5561041052167512194" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;As you can see, it kinda gives it a plasticy, oversaturated look, but it's sort of charming, if you ask me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In contrast, those exact same settings in Chrono Trigger--an altogether darker game--produce a really nice CRT-style effect, like this:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TSzJWSRFVkI/AAAAAAAAAuw/X8SoH9IajSY/s1600/heavy%2Bbloom%2B-%2B00%2Bscanlines%2B-%2Bsmooth%2Bvideo-%2BCT.png"&gt;&lt;img src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TSzJWSRFVkI/AAAAAAAAAuw/X8SoH9IajSY/s200/heavy%2Bbloom%2B-%2B00%2Bscanlines%2B-%2Bsmooth%2Bvideo-%2BCT.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5561041024593516098" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;As you can see, even the bright parts don't suffer from excessive flare-out and the color bleed into the scanlines from the bloom provides an effect that is reminiscent of the phosphor glow on a CRT display.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One more shot of Chrono Trigger, this time using heavy bloom, 25% scanlines and smooth video:&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Kzdww8T9fUA/TSzJXHKPS6I/AAAAAAAAAu4/OYE0541si6A/s1600/heavy%2Bbloom%2Bwith%2B25-percent%2Bscanlines%2Band%2Bsmooth%2Bvideo.png"&gt;&lt;img src="http://2.bp.blogspot.com/_Kzdww8T9fUA/TSzJXHKPS6I/AAAAAAAAAu4/OYE0541si6A/s200/heavy%2Bbloom%2Bwith%2B25-percent%2Bscanlines%2Band%2Bsmooth%2Bvideo.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5561041038791887778" style="cursor: pointer; width: 200px; height: 168px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;I have asked WhateverMan if he would release his shader code under a permissive license. If he does, I will post my simplebloom and heavybloom versions here for download.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Update (1/19/11)&lt;/span&gt;&lt;/b&gt;: WhateverMan was nice enough to allow his work to be distributed/modified under the GPL, so you can download the &lt;a href="http://www.mediafire.com/?784erglivp8iy5t"&gt;heavybloom shader here&lt;/a&gt; and the &lt;a href="http://www.mediafire.com/?l5tde7pqeq6ncso"&gt;simplebloom shader here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Update (2/2/11):&lt;/b&gt;&lt;div&gt;I also made a simple scanline shader that works with or without video smoothing:&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TUnS9ssLRTI/AAAAAAAAAwk/ZQjSs_T_ddc/s1600/scanline.png"&gt;&lt;img src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TUnS9ssLRTI/AAAAAAAAAwk/ZQjSs_T_ddc/s200/scanline.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5569214371630630194" style="cursor: pointer; width: 200px; height: 164px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;For best results, use it along with a scale factor of 4x. Otherwise, the pixels won't line up with the scanlines correctly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;UPDATE (2/28/11)&lt;/b&gt;: I made a scanline shader that works with a 3x scale factor, as well.  &lt;a href="http://www.mediafire.com/?awpl15dspshis"&gt;You can download it (and the other GLSL shaders) here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-5587321061174135817?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/5587321061174135817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=5587321061174135817' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/5587321061174135817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/5587321061174135817'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/01/bloom-pixel-shader-for-bsnes.html' title='Bloom Pixel Shader for bsnes'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Kzdww8T9fUA/TSzJVryetII/AAAAAAAAAuo/vL0Z2rgQ3Zc/s72-c/simplebloom.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-3820874552134175986</id><published>2011-01-01T20:01:00.000-08:00</published><updated>2011-01-20T15:13:52.730-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nestopia'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='NES'/><title type='text'>Added NEStopia to my Ubuntu PPA</title><content type='html'>I added packages for the latest Linux port of the awesome NES emulator NEStopia to my PPA. The only problem is that I don't know how to make a package create a ~/.[appname] config directory and/or put required config files into that directory at first run. If anyone knows how to do that, I'd appreciate the info. &lt;b&gt;EDIT&lt;/b&gt;: Ok, I fixed it. I created a quick-and-dirty bash launcher script that will check for the required directory and file and create them if needed.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;NO LONGER NECESSARY:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Unless/until I find out how to do that, anyone wanting to use my package will have to manually create the config directory and at least create a husk of an inputs file by opening a terminal and typing:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;blockquote&gt;mkdir .nestopia ; touch .nestopia/nstcontrols&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;From that point on, everything should work fine. If you are super-scared of hitting the terminal and would feel better with a script, &lt;a href="http://www.mediafire.com/?elvhlca1f5clw5w"&gt;you can download and run this script and it will take care of it for you&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let me know if you run into any issues or have any questions.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-3820874552134175986?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/3820874552134175986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=3820874552134175986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3820874552134175986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/3820874552134175986'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2011/01/added-nestopia-to-my-ubuntu-ppa.html' title='Added NEStopia to my Ubuntu PPA'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-313583627813514311</id><published>2010-12-28T13:46:00.000-08:00</published><updated>2011-05-18T09:04:40.168-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shader'/><category scheme='http://www.blogger.com/atom/ns#' term='SNES'/><category scheme='http://www.blogger.com/atom/ns#' term='bsnes'/><category scheme='http://www.blogger.com/atom/ns#' term='CRT'/><category scheme='http://www.blogger.com/atom/ns#' term='emulation'/><title type='text'>CRT Pixel Shader Filter for SNES Emulation</title><content type='html'>&lt;b&gt;&lt;big&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;&lt;span class="Apple-style-span" style="font-size: 16px; font-weight: normal; "&gt;&lt;b&gt;&lt;big&gt;Update 05/18/2011&lt;/big&gt;&lt;/b&gt;: More screenshots for more new filters &lt;a href="http://filthypants.blogspot.com/2011/05/more-emulator-pixel-shaders-crt-updated.html"&gt;in my new post&lt;/a&gt;. :-)&lt;/span&gt;&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;big&gt;&lt;br /&gt;&lt;/big&gt;&lt;/b&gt;&lt;/div&gt;Update 05/02/11&lt;/big&gt;&lt;/b&gt;: After many changes, it looks like the CRT shader development has settled down, so there's less need for me to maintain the older versions of the shaders. From here on out, I recommend visiting &lt;a href="https://gitorious.org/bsnes/bsnes/trees/patches/snesshader"&gt;Screwtape's git repo&lt;/a&gt; for all of your XML shader needs (my mediafire account will still be there, but Screwtape has all of mine and more).&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://gitorious.org/bsnes/bsnes/blobs/patches/snesshader/CRT.OpenGL.shader"&gt;CRT.OpenGL.shader&lt;/a&gt; and &lt;a href="https://gitorious.org/bsnes/bsnes/blobs/patches/snesshader/CRT-flat.OpenGL.shader"&gt;CRT-flat.OpenGL.shader&lt;/a&gt; are similar to the shader covered in this post, though they run slightly faster and have no visible artifacts. &lt;a href="https://gitorious.org/bsnes/bsnes/blobs/patches/snesshader/CRT-simple.OpenGL.shader"&gt;CRT-simple.OpenGL.shader&lt;/a&gt; is a simplified rewrite that should be usable on much older, slower machines.&lt;div&gt;&lt;br /&gt;&lt;b&gt;Here is the original post for informational purposes:&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This post covers the use of filters to upscale pixel art--specifically as it applies to SNES emulation--with special attention to CRT reproduction. If you just want the pictures and to download the filters, skip to the bottom of the post.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;big&gt;Background&lt;/big&gt;&lt;/span&gt;:&lt;/b&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As everyone who dabbles in old-school emulation knows, artwork that was intended for a 480i CRT television that has been upscaled to an HD resolution looks like absolute garbage on an LCD monitor. The chunky sprites with their often thick, cartoony outlines just weren't designed to be reproduced with sharp edges resulting from nearest-neighbor upscaling.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To get around this ugly upscaling effect, many emulators now include upscaling interpolation filters, which apply complex mathematical algorithms to the original picture to fill in the gaps between things that are impossible to represent in chunky low-res, such as curves and smooth diagonal lines. You're probably familiar with some of the more common and popular interpolating filters, such as SuperEagle, SuperSaI and HQ2x. Unfortunately, none of these filters gets everything quite right, especially numbers and letters, which can look bubbly or overly smoothed (&lt;a href="http://en.wikipedia.org/wiki/Pixel_art_scaling_algorithms"&gt;you can learn more about pixel art scaling algorithms here&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Purists have long been turned off by the inaccuracies of interpolating filters and have instead used scanline masks to try and capture the effect of an interlaced display, relying on the human brain's natural ability to recognize patterns and fill in the gaps between lines (&lt;a href="http://scanlines.hazard-city.de/"&gt;you can learn everything you ever wanted to know about scanlines here&lt;/a&gt;). However, this too falls short from a true representation of a CRT display, as it ignores the existence of phosphors--the tiny red-, green- and blue-colored lenses that the electron gun in the back of a CRT tube shoots with a beam of electrons to recreate a colored pixel--and the color bleed that naturally occurs in these displays.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Recently, a number of determined individuals have set out to try and capture all of the different effects of a CRT display, warts and all, to truly reproduce classic pixel art the way it was meant to be viewed.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;&lt;big&gt;The Comparisons:&lt;/big&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;small&gt;(Each of these images is presented as it would be displayed onscreen, at a resolution of approximately 800x600, then again at 400% scale without any interpolation used when scaling; as always, click the thumbnail to embiggen)&lt;/small&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, we should look at the baseline. This was scaled up to size using nearest-neighbor and is otherwise untouched:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpiTJYi6HI/AAAAAAAAAr4/L7_ohUYDWg4/s1600/default.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpiTJYi6HI/AAAAAAAAAr4/L7_ohUYDWg4/s200/default.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555861171390834802" style="cursor: pointer; width: 200px; height: 153px; " /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpiTPyuRVI/AAAAAAAAAsA/An7BWO96N3g/s1600/default-400%2525.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpiTPyuRVI/AAAAAAAAAsA/An7BWO96N3g/s200/default-400%2525.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555861173111244114" style="cursor: pointer; width: 200px; height: 152px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Next, we'll add blargg's NTSC filter, which emulates the noise and color bleed of an NTSC video signal (this filter has several presets; I will only be showing the RGB preset, which reproduces the look of an SNES hooked up via RGB connection [not available in the U.S.], and the RF preset, which reproduces the look of the SNES RF modulator attachment, respectively):&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Kzdww8T9fUA/TRpkAc4Ak9I/AAAAAAAAAsI/16k8_mZEcyM/s1600/NTSC-RGB.png"&gt;&lt;img src="http://2.bp.blogspot.com/_Kzdww8T9fUA/TRpkAc4Ak9I/AAAAAAAAAsI/16k8_mZEcyM/s200/NTSC-RGB.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555863049228817362" style="cursor: pointer; width: 200px; height: 153px; " /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpkAu-oYeI/AAAAAAAAAsQ/sLJWihcHFS8/s1600/NTSC-RGB-400%2525.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpkAu-oYeI/AAAAAAAAAsQ/sLJWihcHFS8/s200/NTSC-RGB-400%2525.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555863054088430050" style="cursor: pointer; width: 200px; height: 152px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpkAu-oYeI/AAAAAAAAAsQ/sLJWihcHFS8/s1600/NTSC-RGB-400%2525.png"&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_Kzdww8T9fUA/TRpkAju1SAI/AAAAAAAAAsY/_4G9U2vMMD0/s1600/NTSC-RF.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Kzdww8T9fUA/TRpkAju1SAI/AAAAAAAAAsY/_4G9U2vMMD0/s200/NTSC-RF.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555863051069376514" style="cursor: pointer; width: 200px; height: 153px; " /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_Kzdww8T9fUA/TRpkBNK87cI/AAAAAAAAAsg/J2ulyshQs1M/s1600/NTSC-RF-400%2525.png"&gt;&lt;img src="http://1.bp.blogspot.com/_Kzdww8T9fUA/TRpkBNK87cI/AAAAAAAAAsg/J2ulyshQs1M/s200/NTSC-RF-400%2525.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555863062193171906" style="cursor: pointer; width: 200px; height: 152px; " /&gt;&lt;/a&gt; (&amp;lt;- Look at that noisy RF signal!)&lt;/div&gt;&lt;div&gt;As a note, blargg's NTSC filter is so accurate that byuu, the author of bsnes, recommends its use along with bsnes' accuracy profile to achieve proper blending on games that use halftones to simulate transparency (Jurassic Park and Kirby's Dreamland, for example).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next up, we'll look at cgwg's CRT shader, which includes a phosphor mask and barrel distortion to simulate the screen curvature of a CRT television (just look at those RGB phophors!):&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpkvKsWBdI/AAAAAAAAAso/xfPfWHMXC98/s1600/CRT.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpkvKsWBdI/AAAAAAAAAso/xfPfWHMXC98/s200/CRT.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555863851801904594" style="cursor: pointer; width: 200px; height: 152px; " /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_Kzdww8T9fUA/TRpkvWwSBLI/AAAAAAAAAsw/hPDtbDjRD5E/s1600/CRT-400%2525.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Kzdww8T9fUA/TRpkvWwSBLI/AAAAAAAAAsw/hPDtbDjRD5E/s200/CRT-400%2525.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555863855039644850" style="cursor: pointer; width: 200px; height: 153px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Similarly, there is a version of cgwg's CRT shader, which doesn't include the barrel distortion and represents an idealized flat CRT (actual flat CRTs tended to have slight blurring at the edges where the tube curvature would normally be). Incidentally, this version also has no visible garbage pixels (the occasional black specs that are visible in the curved version):&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-WgGAE5lugbw/TVQ-D1fYSNI/AAAAAAAAAyc/DwpPJ_dgMX0/s1600/crt-flat.png"&gt;&lt;img src="http://2.bp.blogspot.com/-WgGAE5lugbw/TVQ-D1fYSNI/AAAAAAAAAyc/DwpPJ_dgMX0/s200/crt-flat.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5572146874583369938" style="cursor: pointer; width: 200px; height: 152px; " /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-D4DORAbR_Bc/TVQ91uZepJI/AAAAAAAAAyM/y_oEQ5Cf-rk/s1600/crt-flat400.png"&gt;&lt;img src="http://3.bp.blogspot.com/-D4DORAbR_Bc/TVQ91uZepJI/AAAAAAAAAyM/y_oEQ5Cf-rk/s200/crt-flat400.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5572146632161404050" style="cursor: pointer; width: 200px; height: 166px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Pixel Shaders vs. Software Filters&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;cgwg's CRT shader is a special kind of filter known as a pixel shader. Unlike regular filters, which rely on the CPU to do all of the complex upscaling calculations, pixel shaders draw on the awesome computing power of the video card to do the calculations, thereby leaving the CPU to focus on emulating the SNES. Additionally, since the pixel shader is calculated separately from the filter in bsnes, you can stack blargg's NTSC filter with cgwg's CRT shader:&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Kzdww8T9fUA/TRplyGIj6PI/AAAAAAAAAtA/jylLsrv3b0I/s1600/CRT%252BNTSC-RGB.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Kzdww8T9fUA/TRplyGIj6PI/AAAAAAAAAtA/jylLsrv3b0I/s200/CRT%252BNTSC-RGB.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555865001629313266" style="cursor: pointer; width: 200px; height: 152px; " /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRplx8UHCYI/AAAAAAAAAs4/cULuJT_cFOw/s1600/CRT%252BNTSC-RGB-400%2525.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRplx8UHCYI/AAAAAAAAAs4/cULuJT_cFOw/s200/CRT%252BNTSC-RGB-400%2525.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555864998993398146" style="cursor: pointer; width: 200px; height: 152px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Finally, for non-purists, we'll look at the combination of cgwg's CRT shader with the popular SuperSaI filter, which creates a pleasing--though not quite as accurate--output:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpnWh5MarI/AAAAAAAAAtQ/4Q5-sHhsnIA/s1600/SuperSAI%252BCRT.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpnWh5MarI/AAAAAAAAAtQ/4Q5-sHhsnIA/s200/SuperSAI%252BCRT.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555866727067970226" style="cursor: pointer; width: 200px; height: 153px; " /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpnWQiJS8I/AAAAAAAAAtI/X-ebk9syH9A/s1600/SuperSAI%252BCRT-400%2525.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpnWQiJS8I/AAAAAAAAAtI/X-ebk9syH9A/s200/SuperSAI%252BCRT-400%2525.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5555866722407893954" style="cursor: pointer; width: 200px; height: 153px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;As amazing as cgwg's CRT shader is already, there is still some room for improvement. For example, the current implementation misses the intensity-based bloom effect on individual phosphors that can be seen in a true CRT. DOLLS (J) [!], one of the contributors to the CRT reproduction effort, intends to write a more complete CRT emulation shader in the future that will incorporate these and other idiosyncracies.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.mediafire.com/?78p842uko34ce"&gt;Click here to download cgwg's CRT shader&lt;/a&gt; (Also includes the 'flat' version for those who don't like the tube-style curvature; UPDATE: fixed dead link), which is compatible with bsnes and the newest release of snes9x. For more information on CRT emulation, you can check out &lt;a href="http://board.byuu.org/viewtopic.php?f=10&amp;amp;t=147"&gt;this highly informative thread on the bsnes forum&lt;/a&gt;. For other bsnes-compatible shaders that are not included with the official download, &lt;a href="http://www.mediafire.com/?18na1xei86v66"&gt;check out my mediafire account&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE (3/4/2011)&lt;/b&gt;: Themaister did a rewrite of the flat version of cgwg's CRT shader, moving many of the calculations from fragment to vertex, which provides a substantial ~20% increase in speed (making it usable on many older and less powerful video cards). This rewrite also appears to conform more rigidly to the GLSL shader spec, making it compatible with more cards from different vendors. I have labeled it v4 of cgwg's CRT Flat, and it is available in the aforemented mediafire account.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-313583627813514311?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/313583627813514311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=313583627813514311' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/313583627813514311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/313583627813514311'/><link rel='alternate' type='text/html' href='http://filthypants.blogspot.com/2010/12/crt-pixel-shader-filter-for-snes.html' title='CRT Pixel Shader Filter for SNES Emulation'/><author><name>Hunter K.</name><uri>http://www.blogger.com/profile/18379090454291486194</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Kzdww8T9fUA/TRpiTJYi6HI/AAAAAAAAAr4/L7_ohUYDWg4/s72-c/default.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6845625574553920830.post-2279324578082885083</id><published>2010-12-24T12:36:00.000-08:00</published><updated>2011-01-20T15:12:31.337-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='filters'/><category scheme='http://www.blogger.com/atom/ns#' term='bsnes'/><category scheme='http://www.blogger.com/atom/ns#' term='phoenix gui'/><title type='text'>bsnes Phoenix GUI Filter Changes</title><content type='html'>Byuu has added support for binary filters in his Phoenix GUI as of v073, so we can finally use cgwg's CRT Curved shader in conjunction with blargg's NTSC filter! These binary filters are loaded just like shaders, i.e., via a dialog box in the video options.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can download the available filters, &lt;a href="http://www.mediafire.com/?01747etfqs8tt6g"&gt;compiled for 64-bit Linux, here&lt;/a&gt; or &lt;a href="http://www.mediafire.com/?bqnp2etqkq3fkz1"&gt;compiled for 32-bit here&lt;/a&gt;. These filters do not appear to work on Windows systems.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6845625574553920830-2279324578082885083?l=filthypants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://filthypants.blogspot.com/feeds/2279324578082885083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6845625574553920830&amp;postID=2279324578082885083' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6845625574553920830/posts/default/2279324578082885083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/684562557
