tag:blogger.com,1999:blog-31824188271405438462024-03-14T00:59:36.945-07:00LantertronicsDIY electronics, programming, music, and gamingAaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.comBlogger15125tag:blogger.com,1999:blog-3182418827140543846.post-62056066272623979632020-02-20T22:36:00.001-08:002020-02-20T22:42:36.983-08:00Writing CD-R images that the Nuon "game console" can readI put "game console" in quotes because the Nuon wasn't really marketed as such -- although it probably should have been. Much like the <a href="https://www.atlasobscura.com/articles/the-history-of-the-philips-cdi-failed-playstation-ancestor">Phillips CD-i</a>, <a href="https://en.wikipedia.org/wiki/VM_Labs">VM Lab</a>'s Nuon was conceptualized as technology that could be included in DVD players to give them game-playing functionality. It came out around the same time as Sony's Playstation 2.<br />
<div>
<br />
<div>
You've heard of the Playstation 2. You probably have never heard of the <a href="https://arstechnica.com/gaming/2015/06/before-the-ps2-nuon-famously-tried-and-failed-to-combine-dvd-and-game-consoles/">Nuon</a>.</div>
<div>
<br /></div>
<div>
There's reasons for that. </div>
<div>
<br /></div>
<div>
It turns out that marketing game consoles that incidentally can play DVDs was a much better strategy than marketing DVD players that incidentally can play games. </div>
</div>
<div>
<br /></div>
<div>
It has a fascinating quad-core architecture -- fairly rare for 2001 -- and it flopped on the market. It came to my attention because VM Labs released a consumer SDK for it, which is also a fairly rare thing. So, of course, I had to get one. </div>
<div>
<br /></div>
<div>
The fan site <a href="http://www.nuon-dome.com/">Nuon Dome</a> hosts a variety of <a href="http://www.nuon-dome.com/download.html">CD-R images of homebrew games</a>. Ideally, one simply writes a file called NUON.CD to the top level of an ISO9660 CD image. I tried this using the Yaroze Classics, Breakout, Snake, and VG Music. All of these gave "No disc" errors. It turns out you need to also include a dummy file (at the top level to pad the CD) with a filename whose name that comes earlier than NUON in alphabetical order. I tried using BombNewYear.zip, which was contained the source code for one of the Nuon games. It was around 15 megabytes. Discs written with the padding file worked fine. I wrote them using an LG Slim Portable DVD Writer, Model SP80NB80, at the lowest speed the writer supports, which is 10x. I used the macOS program <a href="https://burn-osx.sourceforge.io/Pages/English/home.html">Burn</a>. The CD-Rs were Verbatim 700 MB, 52x, 80 min media.</div>
<div>
<br /></div>
<div>
There was a disc that worked OK without padding, namely BOMB, but it had several additional files to include of the form level?.pcm (where ? is the numbers 1 through 5). I think these inherently provided the need padding. </div>
<div>
<br /></div>
<div>
At this point I decided to keep including the padding file, and successfully made discs for Same Game (shape version) and the slow Atari 800 emulator that runs M.U.L.E. I decided to test other media, and successfully wrote discs for the 2600-style Pac-Man, Pac-Man Tournament Edition, and Same Game (colors version) on Maxell 700 MB, 80 min media.</div>
<div>
<br /></div>
<div>
Actually... I started this blog post in the middle of the story. The experiments described above were conducted on the second Samsung DVD-N501 I have obtained. The first one appeared when I didn't have any official Nuon-compatible movies or games, so I solely tried burned CD-Rs of home-brew games. Only a few burns of Decaying Orbit would occasionally start up. After burning dozens upon dozens of CD-Rs in different ways, most failing in different ways, I finally picked up the game Ballistic (one of only eight games officially released) and the Nuon-enhanced movie <a href="https://www.amazon.com/Adventures-Buckaroo-Banzai-Across-Dimension/dp/B00005JKEX/ref=sr_1_fkmr0_1?keywords=Nuon+buckaroo+bonzai+and+adventures+in+the+8th+dimension&qid=1582265370&sr=8-1-fkmr0">The Adventures of Buckaroo Banzai Across the 8th Dimension</a> (one of only four such movies officially released). Both official releases seemed to work fine, so I assumed I was doing something wrong in burning the CD-Rs, but at one point I went back and checked the official releases and neither ran. I then finally realized that the first DVD-N501 I obtained had a failing DVD drive that increasingly giving up the ghost as I was using it. </div>
<div>
<br /></div>
<div>
This lead me to obtain the second DVD-N501. When I went back and tried the many Maxell CD-Rs I had created -- some on my Mac with Burn, others on a Windows 10 computer with <a href="https://www.imgburn.com/">imgburn</a> (careful, it will install a bunch of other software you don't want unless you explicitly tell it "no," repeatedly) -- I discovered most of them played fine: Decaying Orbit, Ambient Monsters, Chomp, Sheshell, and even Doom. At that point I wasn't keeping accurate records, but I can tell from looking at the discs that the ones that didn't have the padding file were the discs that showed the "no disc" error. Some of the programs had additional files, like music files, that seemed to provide the needed padding for the machine to find the NUON.CD file.</div>
<div>
<br />
I'm hoping to talk a few of my <a href="https://www.vip.gatech.edu/teams/retrofuturistic-hardware-music-gaming-and-computing">Vertically Integrated Project Retrofuturistic Hardware</a> students into trying to write games for it, or at least get the development environment up and running.</div>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com0tag:blogger.com,1999:blog-3182418827140543846.post-65017947895141208802020-02-01T13:14:00.000-08:002020-02-01T13:14:20.856-08:00A 1987 Themed Homebrew Computer<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; margin: 0px;">
<span style="font-family: inherit;">I've long had dreams of designing 70s/80s style game consoles/computers "from scratch" (where "from scratch" is vaguely defined). One of my students has started down a 70s path with the <a href="http://www.cosmacvip.com/" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">COSMAC VIP</a> with the <a href="https://spectrum.ieee.org/semiconductors/processors/chip-hall-of-fame-rca-cdp-1802" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">1802</a> processor.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">I was thinking of starting another development effort focusing on the year </span><a href="https://en.wikipedia.org/wiki/1987" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9; font-family: inherit;" target="_blank">1987</a><span style="font-family: inherit;">. Besides me starting my junior year of high school, that year saw the appearance of </span><a href="https://en.wikipedia.org/wiki/Video_Graphics_Array" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9; font-family: inherit;" target="_blank">VGA</a><span style="font-family: inherit;">, so we could justify using a 15-pin VGA cable and not something weird, along with the appearance of </span><a href="https://en.wikipedia.org/wiki/PS/2_port" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9; font-family: inherit;" target="_blank">PS/2</a><span style="font-family: inherit;"> ports (not to be confused with Playstation 2) for keyboards and mice, which are plentiful. We could use </span><a href="https://www.old-computers.com/museum/hardware.asp?t=2&c=837&st=2" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9; font-family: inherit;" target="_blank">9-pin Sega Master System</a><span style="font-family: inherit;"> style controller ports, which are like the </span><a href="https://en.wikipedia.org/wiki/Atari_joystick_port" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9; font-family: inherit;" target="_blank">Atari 2600 port</a><span style="font-family: inherit;"> with an extra button. (Lots of manufacturers used DB-9 jacks for their controllers; </span><a href="https://en.wikipedia.org/wiki/Atari_joystick_port#Other_platforms" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9; font-family: inherit;" target="_blank">there's a guide on wikipedia</a><span style="font-family: inherit;">).</span><br />
<span style="font-family: inherit;"><br style="box-sizing: border-box;" /></span>
<span style="font-family: inherit;">A general principle (on any project like this) would be to use chips and technologies available in that time period. For instance, we could use <a href="http://web.mit.edu/6.115/www/document/gal22v10.pdf" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">GAL22V10</a> PLDs, but not modern FPGAs. (One exception would be to use bigger RAM chips that are available now just to lower the chip count; one could imagine just using more chips in an earlier era). Another general guiding principle would be to avoid surface mount parts, especially anything with a tiny pitch. </span><br />
<span style="font-family: inherit;"><br /></span></div>
<h2 style="background-color: white; box-sizing: border-box; color: #283c46; line-height: 1.2; margin: 0px 0px 0.5em;">
<span style="font-family: inherit;">
Parts </span></h2>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; margin: 0px;">
<span style="font-family: inherit;">I got some chips from eBay along such lines. They would be also interesting to experiment with on their own:</span><br />
<span style="font-family: inherit;"><br style="box-sizing: border-box;" /></span>
<span style="font-family: inherit;">I bought 4 each of the following (they're interesting 64-pin chips; like a 40-pin package but smaller spacing between pins):</span></div>
<ul style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; margin: 0.65em 0px 0.9em; padding-left: 2em;">
<li style="box-sizing: border-box; margin-top: 0.3em;"><span style="font-family: inherit;"><a href="http://map.grauw.nl/resources/video/yamaha_v9958_ocr.pdf" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">V9958</a> display chip used in <a href="https://www.msx.org/wiki/MSX2%2B" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">MSX2</a>+ computers. It's the last in the line of chips that started with the <a href="https://en.wikipedia.org/wiki/Texas_Instruments_TMS9918" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">TMS9918</a> used in the <a href="https://en.wikipedia.org/wiki/Texas_Instruments_TI-99/4A" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">TI 99/4A</a> and the <a href="https://en.wikipedia.org/wiki/ColecoVision" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">Colecovision</a> (Z80 CPU) and the <a href="https://en.wikipedia.org/wiki/VTech_CreatiVision" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">Vtech Creativision</a> (6502 CPU), and it's backward compatible with an earlier chip, the <a href="https://www.mirrorservice.org/sites/www.bitsavers.org/pdf/yamaha/Yamaha_V9938_MSX-Video_Technical_Data_Book_Aug85.pdf" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">V9938</a>, and even the TMS9918. These chips use external video RAM (up to 192 KB) that's separate from the main CPU RAM; this contrasts with most other video chips of the era. </span></li>
<li style="box-sizing: border-box; margin-top: 0.3em;"><span style="font-family: inherit;">YM2610 sound chip -- <a href="https://en.wikipedia.org/wiki/Frequency_modulation_synthesis" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">FM synthesis</a> and <a href="https://en.wikipedia.org/wiki/Adaptive_differential_pulse-code_modulation" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">ADPCM</a> sample playback. Used in some <a href="https://en.wikipedia.org/wiki/Taito_Z_System" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">Taito arcade boards</a> and the <a href="https://en.wikipedia.org/wiki/Neo_Geo_(system)" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">SNK NeoGeo</a>, and quite similar to the <a href="https://en.wikipedia.org/wiki/Yamaha_YM2608" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">YM2608</a> used in NEC PC computers. You can hear lots of examples of YM2610 music on youtube. I picked the YM2610 since its sample playback is flexible; the YM2608 has built-in drum sounds, which are nice but you can't change them.</span></li>
</ul>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; margin: 0px;">
<span style="font-family: inherit;">As far as CPU, well, lots of folks have used the Z80; that's well travelled territory. I was thinking of the <a href="https://en.wikipedia.org/wiki/WDC_65C816" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">65C816</a>, which is an extension of the <a href="https://en.wikipedia.org/wiki/WDC_65C02" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">65C02</a> with 16-bit registers but an 8-bit external data bus. It has a 6502 compatibility mode. It's most famously used in the <a href="https://en.wikipedia.org/wiki/Apple_IIGS" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">Apple IIGS</a> (providing backward compatibility with the original Apple II line) and the SNES. I conjure it was originally chosen so the <a href="https://en.wikipedia.org/wiki/Super_Nintendo_Entertainment_System" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">SNES</a> could play NES games -- of course, the SNES can't play NES games, but I bet is was a design goal that got dropped somewhere along the line. (Notice I'm not going with a 68000 since I want to stick with an 8-bit bus; the V9958 and YM2610 use an 8-bit bus). This machine could be in honor of <a href="https://en.wikipedia.org/wiki/Chuck_Peddle" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">Chuck Peddle</a>, the designer of the 6502, who sadly <a href="https://www.engadget.com/2019/12/25/chuck-peddle-cpu-pioneer-dies/" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">died last year</a>.</span><br />
<span style="font-family: inherit;"><br style="box-sizing: border-box;" /></span>
<span style="font-family: inherit;">Instead of using an actual 65C816, I've been looking at the <a href="http://www.westerndesigncenter.com/wdc/documentation/w65c265s.pdf" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">65C265</a>, which is a 65C816 with a truckload of peripherals and expanded I/O that that makes it more like a microcontroller. It has the additional advantage of addressing the full 24-bit address space without the weird multiplexing that the 65C816 uses to keep the pin count low. It comes in both surface mount and PLCC packages; the later lets it be used as a through-hole part in an appropriate carrier. It came out a bit after 1987, but I feel it would be worth taking a bit of artistic license here.</span><br />
<span style="font-family: inherit;"><br style="box-sizing: border-box;" /></span>
<span style="font-family: inherit;">Western Design Center makes two "single board computers" for the 65C265: the <a href="https://wdc65xx.com/Single-Board-Computers/w65c265sxb" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">W65C265SXB</a> (around $48), which has 32K SRAM and 128K Flash ROM in a PLCC, and the <a href="https://wdc65xx.com/Single-Board-Computers/mensch" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">W65C265QBX</a>, which is isn't much more than a breakout board. I just bought a couple the fancier boards, the <a href="https://wdc65xx.com/Single-Board-Computers/w65c265sxb" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">W65C265SXB</a>, from Amazon. WDC also a reference design called <a href="https://www.westerndesigncenter.com/wdc/Mensch_Computer.cfm" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">The Mench Computer</a> (not to be confused with the W65C265QBX, which is also called "The Mench"), although that webpage looks like it is out of date. (I just noticed that it implements the full 6-button Sega Genesis controller standard, which is pretty cool).</span><br />
<span style="font-family: inherit;"><br style="box-sizing: border-box;" /></span>
<span style="font-family: inherit;">As a "stretch goal," we could add a co-processor in the form of a NEC UPD77C25 DSP (in our case, we'd use the UPD77P25 which is one-time programmable instead of masked ROM); it has an 8-bit external data bus, a 8.3 MhZ clock, and comes in a 28-pin DIP or a 44-pin PLCC. I will attach the datasheet. The reason this caught my attention is that it's the "real" chip appearing in some SNES carts labeled "<a href="https://en.wikipedia.org/wiki/List_of_Super_NES_enhancement_chips#DSP-1" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">DSP-1</a>," where it is used to do 3D calculations, among other things. Someone even managed to <a href="https://www.caitsith2.com/snes/dsp/" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">dump the masked ROM code</a> in the various DSP1 versions.</span></div>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; margin: 0px;">
<br /></div>
<div>
<h2 style="background-color: white; box-sizing: border-box; color: #283c46; line-height: 1.2; margin: 0px 0px 0.5em;">
<span style="font-family: inherit;">Other Design Efforts </span></h2>
</div>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; margin: 0px;">
<span style="font-family: inherit;">There's two main projects ongoing to create a 6502-inspired machine:</span></div>
<ul style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; margin: 0.65em 0px 0.9em; padding-left: 2em;">
<li style="box-sizing: border-box; margin-top: 0.3em;"><span style="font-family: inherit;">The <a href="http://www.commanderx16.com/X16/Ready.html" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">Commander x16</a> by the <a href="http://www.the8bitguy.com/" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">8-Bit Guy</a>, aka David Murray, uses the 65C02. His team even has an <a href="https://github.com/commanderx16/x16-emulator/releases" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">emulator</a> for it. One of his design goals is to avoid using FPGAs unless he absolutely has to, under the constraint that he wants to only use parts that are currently being manufactured; the latter constraint means they had to resort to using an FPGA for graphics. For my project, I value avoiding FPGAs and modern parts over avoiding parts that are no longer in production, and hence am happy to use the V9958 and YM2610. Although they are no longer manufactured, they are plentiful on ebay for reasonable prices (although one must watch out for counterfeits). Everyone should watch his videos (<a href="https://www.youtube.com/watch?v=ayh0qebfD2g" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">Part 1</a> and <a href="https://www.youtube.com/watch?v=sg-6Cjzzg8s" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">Part 2</a>) describing his philosophy and design process. Many folks are helping David with it; just typing Commander x16 into the youtube search field will yield lots of interesting work.</span></li>
<li style="box-sizing: border-box; margin-top: 0.3em;"><span style="font-family: inherit;">The <a href="https://c256foenix.com/" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">C256 Foenix</a> headed by Stefany Allaire, uses the 65C816. Stefany is building the machine she imagines Commodore would have build if their 8-bit line kept going, including imagining the custom chips they might have designed. Hence, she makes extensive use of powerful FPGAs. This is <em style="box-sizing: border-box;">awesome</em>, but it differs from both the 8-Bit Guy's vision and mine.</span></li>
<li style="box-sizing: border-box; margin-top: 0.3em;"><span style="font-family: inherit;">Dan Grise is building a <a href="https://www.youtube.com/watch?v=jgMxO3W5qBE" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">homebrew computer with a 65C816 and a V9958</a>; I'm very interested in following his progress. I'm hoping by using the 65C265 we could avoid needing so many support chips.</span></li>
</ul>
<h2 style="background-color: white; box-sizing: border-box; color: #283c46; line-height: 1.2; margin: 0px 0px 0.5em;">
<span style="font-family: inherit;">Naming the Thing </span></h2>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; margin: 0px;">
<span style="font-family: inherit;">There are lot of computers with numbers in the name: Commodore VIC-20s and 64s, Dragon Commander x16s, Dragon 32s and 64s, Radio Shack TRS-80s, Sharp x6800s, NEC PC-9801s and PC-9821s, Atari 400s and 800s, Atari 2600s, 5200s, and 7800s, Amstrad CPC 464s, etc.</span><br />
<span style="font-family: inherit;">Since we're imaging that this could have been a computer released in 1987, it should be called Something87, or perhaps with a hyphen, like Something-87. I briefly thought of calling it the Peddle-87 in honor of the designer of the 6502, but I wouldn't want to imply that he created it or that his estate approved of it. I asked friends to think of words associated with 1987, and after reading that I came up with Gnarly-87 or Gnarlycomp-87, but promptly decided I didn't like that either. Any ideas?</span><br />
<span style="font-family: inherit;"><br /></span></div>
<h2 style="background-color: white; box-sizing: border-box; color: #283c46; line-height: 1.2; margin: 0px 0px 0.5em;">
<span style="font-family: inherit;">Alternate Paths </span></h2>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; margin: 0px;">
<span style="font-family: inherit;">Instead of the 65C265, we could try a <a href="http://datasheets.chipdb.org/Zilog/Z180/Z8L180.pdf" rel="noreferrer" style="background: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">Z8S180 or Z8L180</a>, which are enhanced Z80s with additional peripherals, available in 64-pin DIP and 68-pin PLCC. We would probably go for the Z8S180, which can go up to 33 MHz. (The Z8L180, a low power 3.3V version, only goes up to 20 MHz, but we probably want to use 5V anyway). This might be a fun parallel effort, but if we go for just one path, I'm most interested in the 65C265. The Z8S180 version could also be a later effort.</span><br />
<span style="font-family: inherit;"><br /></span></div>
<h2 style="background-color: white; box-sizing: border-box; color: #283c46; line-height: 1.2; margin: 0px 0px 0.5em;">
<span style="font-family: inherit;">Execution </span></h2>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; margin: 0px;">
<span style="font-family: inherit;">This project would naturally lend itself to a division of labor, with different people specializing in different parts, and lots of opportunities for software development. The various parts could be tested separately; for instance, there's all sorts of projects where people interfaced Yamaha soundchips with an Arduino of some sort. Lessons learned in any part of the project could be relevant to many other projects.</span></div>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com1tag:blogger.com,1999:blog-3182418827140543846.post-15361957289213307762020-01-29T23:29:00.000-08:002020-01-29T23:29:21.871-08:00The NEC PC-98 is alive!<span style="font-family: inherit;"><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;">I have a </span><a href="https://cdromrom.wordpress.com/pc-fxga-wip/" rel="noreferrer" style="box-sizing: border-box; color: #1b6ac9; font-size: 16px; orphans: 2; widows: 2;" target="_blank">PC-FXGA</a><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;"> </span><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;">card that plugs into the special "C bus" of</span><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;"> </span><a href="https://en.wikipedia.org/wiki/PC-9800_series" rel="noreferrer" style="box-sizing: border-box; color: #1b6ac9; font-size: 16px; orphans: 2; widows: 2;" target="_blank">NEC PC-98</a> <span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;">computers, which were only released in Japan. The PC-FXGA is basically a card with the chipset for the</span><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;"> </span><a href="https://en.wikipedia.org/wiki/PC-FX" rel="noreferrer" style="box-sizing: border-box; color: #1b6ac9; font-size: 16px; orphans: 2; widows: 2;" target="_blank">NEC PC-FX</a><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;"> </span><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;">game console, which was also only released in Japan, and allowed enthusiasts to develop their own games with the</span><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;"> </span><a href="https://archive.org/details/gmaker_201905" rel="noreferrer" style="box-sizing: border-box; color: #1b6ac9; font-size: 16px; orphans: 2; widows: 2;" target="_blank">GMAKER</a><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;"> </span><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;">or GMAKER/Plus SDK in addition to playing PC-FX games through the PC-98's CD-ROM drive. This caught my attention, since it's fairly rare for companies to provide end users with tools to write games for their consoles; usually these are covered under NDAs. (Incidentally, the PC-FX apparently didn't use any copy protection.) There was also a version of the PC-FXGA developed for</span><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;"> </span><a href="https://en.wikipedia.org/wiki/DOS/V" rel="noreferrer" style="box-sizing: border-box; color: #1b6ac9; font-size: 16px; orphans: 2; widows: 2;" target="_blank">DOS/V</a><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;"> </span><span style="background-color: white; color: #283c46; font-size: 16px; orphans: 2; widows: 2;">machines.</span></span><br />
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; font-variant-ligatures: normal; margin: 0px; orphans: 2; widows: 2;">
<span style="font-family: inherit;"><br style="box-sizing: border-box;" />The PC-FX focused on doing high-quality full motion video, and not 3-D graphics, like the Playstation and the Nintendo 64 focused on. This turned out to be a bad decision by NEC, who got obliterated by Sony. The PC-FX had better FMV than any of its competitors -- but heavy use of FMV does not generally make for better games. Of course, I have an unhealthy fascination with failed game consoles, hence I found a PC-FXGA on ebay.<br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" />Anyway, since I had a PC-FXGA card that needs a NEC PC-98 computer, I bought a PC-9821 Cx2 via <a href="http://fromjapan.co.jp/" rel="noreferrer" style="background-color: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">fromjapan.co.jp</a>. It didn't come with a hard drive, so I got an IDE-to-Compact Flash adapter to replace it. I found some hard drive images here:<br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" /><a href="https://nfggames.com/forum2/index.php?PHPSESSID=05ffqo53eedl2539g54rav6od3&topic=5463.0" rel="noreferrer" style="background-color: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">https://nfggames.com/forum2/index.php?PHPSESSID=05ffqo53eedl2539g54rav6od3&topic=5463.0</a></span></div>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; font-variant-ligatures: normal; margin: 0px; orphans: 2; widows: 2;">
<span style="font-family: inherit;"><br style="box-sizing: border-box;" /></span></div>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; font-variant-ligatures: normal; margin: 0px; orphans: 2; widows: 2;">
<span style="font-family: inherit;">In particular, it gave this download link: <a href="http://nfggames.com/PC98/HDDimages/PC98HDD.7z" rel="noreferrer" style="background-color: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">http://nfggames.com/PC98/HDDimages/PC98HDD.7z</a> (542MB, so I wrote 542 on that CF card; it also came with a simpler 128MB image, so I wrote 128 on that CF card.)<br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" />The 542MB has apparently had a tool called CONV98AT applied to it that lets it be read and written to as an ordinary Window partition on a regular PC. Apparently this is NOT true of your usual PC-98 disk; trying to mount one on a Window machine without applying the CONV98AT tool can cause problems.<br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" />I ran into trouble since the 5V and 12V of the power connector on my IDE-to-CF adapter is swapped relative to the connector on the motherboard. Putting 12V into a 5V input on a CF card did not make the card very happy; it started to smell very bad and get very hot very quickly. I threw away any toasted cards. I also bought a 2nd adapter to use; the original is probably fine, but I figured I might as well get a new one to reduce variables while I sorted out the issue.<br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" />So now that I am not jamming 12V into the 5V input, the hard drive images boot OK instead of trying to catch on fire. Floppy disk drive seems to work fine. The CD-ROM drive opens and closes and spins up; I haven’t been able to read anything off it yet. I probably need to find the right driver or something. PC hardware configuration in the 80s and early 90s was always a pain. It turns out it’s much more of a pain when most of it is in Japanese.<br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" />Interestingly, the PC-FXGA allegedly has a 3-D graphics chip on it, the <a href="https://cdromrom.wordpress.com/pc-fxga-wip/huc6273-aurora/" rel="noreferrer" style="background-color: transparent; box-sizing: border-box; color: #1b6ac9;" target="_blank">HuC6273 Aurora</a>, which isn't present in the PC-FX.</span></div>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; font-variant-ligatures: normal; margin: 0px; orphans: 2; widows: 2;">
<span style="font-family: inherit;"><br /></span></div>
<div style="background-color: white; box-sizing: border-box; color: #283c46; font-size: 16px; font-variant-ligatures: normal; margin: 0px; orphans: 2; widows: 2;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgne0ouxxIDSjdUnVjuixxqQ0bjgnnz3-30TJYjGgVTvkwAwt01vsRmvjebRvlei4JZTrP0azWB2ScXVV3N9RWlUfFO5eUX8jVl8KXaweQVbgDVn5TqtPeF0brdLkgGzvVJI_1t9WaieQ7v/s1600/81463727_10157792011397095_2374761403065040896_n.jpg" imageanchor="1"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHzeKKKQGzh0GtuNLQHSsJoIhQpUkoLWLr5on7dV4L780Ebuu05Xn12L5E4ofoQqQS83y8LkftJtpiZBFyklXeoLdrTnc2beMtEb5DL5JI_6VJ2RwBFZx_RMzgZBp7-inM2KKvfW_Lw2C6/s1600/83298358_10157792010987095_3387188677674270720_n.jpg" imageanchor="1"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp4r1U__PHuL7HMvyV7sS55fv0YNO8V5xw6I1Fyw8xf3utvJqhckaugerBWlwBm8qBqlI9-OLiPLYDLwEsWWDASgdeCS-b_Cj-VRju3CtrpBAV7fUEvftSs0BU7hm8Tosk-PzUKTz1jkiT/s1600/83205328_10157792011942095_2964627839220973568_n.jpg" imageanchor="1"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBc7EyXWRPc2-s1rZr42cSm_AahUPbUbFtdhA7LRxOkaEgt0s79I7BaW0n2GZefUbYLNW7KFj_99nrlv6rffV8mQUcL9N2XjVY9NF1lWN-ROCWRBIxzl4cb6r0Xq8by4kVhb_lWmY6ybV7/s1600/83283178_10157792011057095_7584456342547464192_n.jpg" imageanchor="1"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA-8UYhIoK2jw08pPEWXtg1ck1-lV6ZAAipFFOdZa_8Tr38f0i1_gv7NVAMzXPQt0tpQFgOwjaOWBHqSwd0zSJZp1oDIqJ7sdUpLaKR2xSH821rg0_9DI0ZOVFUKmulZLhmHZB4iBUg6Vx/s1600/83403386_10157792011872095_963623075893477376_n.jpg" imageanchor="1"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDmMxwTRo2oYvoSAV70zVnGg0K-kNnPWF-sqDLuIbjjaDFe0PvKeXYmziP6yRon-ybjqr3qEkMJNJjG0ZAOCPOSutpDKeK1LsB6C2IHEZB3qyvjI8Ap4sRX0I8J_s3Faa-rCok2Guveu27/s1600/83886768_10157792010587095_9125202428931604480_n.jpg" imageanchor="1"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWaVtONPPRpO0SE1LYv8YP-mtDLecYxLt_bW7RQ0ZqREQrPQXOyXgDbVfQ4Z3WTFu1MAZ7j9WgSY7nwYxSpyaogX_h-dzxZ9lIMc-wT2fm984MXuOOCLf1llTzyik-dWOVUH7FkG1Xl0rI/s1600/84798368_10157792011487095_3993651305548611584_n.jpg" imageanchor="1"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWaVtONPPRpO0SE1LYv8YP-mtDLecYxLt_bW7RQ0ZqREQrPQXOyXgDbVfQ4Z3WTFu1MAZ7j9WgSY7nwYxSpyaogX_h-dzxZ9lIMc-wT2fm984MXuOOCLf1llTzyik-dWOVUH7FkG1Xl0rI/s320/84798368_10157792011487095_3993651305548611584_n.jpg" width="320" /></a><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDmMxwTRo2oYvoSAV70zVnGg0K-kNnPWF-sqDLuIbjjaDFe0PvKeXYmziP6yRon-ybjqr3qEkMJNJjG0ZAOCPOSutpDKeK1LsB6C2IHEZB3qyvjI8Ap4sRX0I8J_s3Faa-rCok2Guveu27/s320/83886768_10157792010587095_9125202428931604480_n.jpg" width="240" /><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA-8UYhIoK2jw08pPEWXtg1ck1-lV6ZAAipFFOdZa_8Tr38f0i1_gv7NVAMzXPQt0tpQFgOwjaOWBHqSwd0zSJZp1oDIqJ7sdUpLaKR2xSH821rg0_9DI0ZOVFUKmulZLhmHZB4iBUg6Vx/s320/83403386_10157792011872095_963623075893477376_n.jpg" width="320" /><img border="0" height="249" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBc7EyXWRPc2-s1rZr42cSm_AahUPbUbFtdhA7LRxOkaEgt0s79I7BaW0n2GZefUbYLNW7KFj_99nrlv6rffV8mQUcL9N2XjVY9NF1lWN-ROCWRBIxzl4cb6r0Xq8by4kVhb_lWmY6ybV7/s320/83283178_10157792011057095_7584456342547464192_n.jpg" width="320" /><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp4r1U__PHuL7HMvyV7sS55fv0YNO8V5xw6I1Fyw8xf3utvJqhckaugerBWlwBm8qBqlI9-OLiPLYDLwEsWWDASgdeCS-b_Cj-VRju3CtrpBAV7fUEvftSs0BU7hm8Tosk-PzUKTz1jkiT/s320/83205328_10157792011942095_2964627839220973568_n.jpg" width="320" /><img border="0" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHzeKKKQGzh0GtuNLQHSsJoIhQpUkoLWLr5on7dV4L780Ebuu05Xn12L5E4ofoQqQS83y8LkftJtpiZBFyklXeoLdrTnc2beMtEb5DL5JI_6VJ2RwBFZx_RMzgZBp7-inM2KKvfW_Lw2C6/s320/83298358_10157792010987095_3387188677674270720_n.jpg" width="320" /><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgne0ouxxIDSjdUnVjuixxqQ0bjgnnz3-30TJYjGgVTvkwAwt01vsRmvjebRvlei4JZTrP0azWB2ScXVV3N9RWlUfFO5eUX8jVl8KXaweQVbgDVn5TqtPeF0brdLkgGzvVJI_1t9WaieQ7v/s320/81463727_10157792011397095_2374761403065040896_n.jpg" width="320" /></span></div>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com0tag:blogger.com,1999:blog-3182418827140543846.post-90880458311147892922019-10-12T23:40:00.001-07:002019-10-12T23:45:44.329-07:00Adaptation of the Timbre & Crossfade from the Music Easel<h2>
Version 1</h2>
Original circuit by Don Buchla (used with his kind permission); adapted by Aaron Lanterman. This is based on the timbre circuit on Board 9 and the single-vactrol "waveshape" crossfade circuit on Borad 8 of the Music Easel. You should spend some time studying the original schematics. <b>Warning:</b> This board is designed to be highly flexible; it can be configured in many different ways. Please read the notes below carefully and decide what options you want before building.<br />
<h2>
Demo</h2>
Note this video is of Version 0, so pay no attention to any mention I make of errors on the PCB; those comments are not relevant to Revision 1.<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/Pi3H1M555-M/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/Pi3H1M555-M?feature=player_embedded" width="320"></iframe></div>
<h2>
Schematics & layout</h2>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2BM33qNy5bWK1x3rxaeChyEzsWYwvXDiAMs7iqvmHnJhlZgj0SGkvR0oLlIN-4JS7VnSoysdEqbBE7emXxQVuSQZymxetKvLiiLmlOy3Xx16UtnKSNgfaAXlbCHBQUp8TikGPL-UO68_i/s1600/mea_timbre_rev1_schem.png" imageanchor="1"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2BM33qNy5bWK1x3rxaeChyEzsWYwvXDiAMs7iqvmHnJhlZgj0SGkvR0oLlIN-4JS7VnSoysdEqbBE7emXxQVuSQZymxetKvLiiLmlOy3Xx16UtnKSNgfaAXlbCHBQUp8TikGPL-UO68_i/s320/mea_timbre_rev1_schem.png" width="320" /></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjruvOCwQws6Zd7p-rwrR9eQieLXu1urdQ1ungFyKr8Yby0sdBsmiGSwmsbookYEAAL9XMBMOOGjsxnrc-TK_TbHKeQIar0vgrwhWuY63twCxNASoVTzbopf4r66FWpKHhpgIlBtWWRVSW6/s1600/mea_timbre_rev1_pcball.png" imageanchor="1"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjruvOCwQws6Zd7p-rwrR9eQieLXu1urdQ1ungFyKr8Yby0sdBsmiGSwmsbookYEAAL9XMBMOOGjsxnrc-TK_TbHKeQIar0vgrwhWuY63twCxNASoVTzbopf4r66FWpKHhpgIlBtWWRVSW6/s320/mea_timbre_rev1_pcball.png" width="320" /></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-mSbd98cxQedWqRI_i3EtTLuSe-vSJh9eISJL6cshW6rZYLBQhknISayzaFu_ZXaRyO6W6PNyAg7WuY54wmXGz-yGmnUqpPjSIcB6AiJx5Zo1cWyo_x5q9SWxmOBmTqkDYF51U1TgWI5T/s1600/mea_timbre_rev1_silkscreen.png" imageanchor="1"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-mSbd98cxQedWqRI_i3EtTLuSe-vSJh9eISJL6cshW6rZYLBQhknISayzaFu_ZXaRyO6W6PNyAg7WuY54wmXGz-yGmnUqpPjSIcB6AiJx5Zo1cWyo_x5q9SWxmOBmTqkDYF51U1TgWI5T/s320/mea_timbre_rev1_silkscreen.png" width="320" /></a></div>
<h2>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFNbBeMRPnGW6v1SN_ml-Gqr7ZVy9PdAXuDfVOdPoi-lVavHFlVgtsg-o_BrOQFZgcv2PFwQUKh8bJ8kMldr7iCLXn1ax_-WW65blDWh3psr8jmsPqXfThXVW6Wx44qbEopm-1Kn8HG-EF/s1600/mea_timbre_rev1_bottomcopper.png" imageanchor="1"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFNbBeMRPnGW6v1SN_ml-Gqr7ZVy9PdAXuDfVOdPoi-lVavHFlVgtsg-o_BrOQFZgcv2PFwQUKh8bJ8kMldr7iCLXn1ax_-WW65blDWh3psr8jmsPqXfThXVW6Wx44qbEopm-1Kn8HG-EF/s320/mea_timbre_rev1_bottomcopper.png" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsPvhNSze406Ike80H5ZnCgLeS43ip_Ig7BDYlaDVkVQ2GwlDrhXpfM7_z55GxzTpWP6_7yEneY2Zgl_My9zrxYvVoV31EvSMXduGX0DzI65NkGuqxb7vkl8v2HL3tlH2NLgDydMh6fl5N/s1600/mea_timbre_rev1_topcopper.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsPvhNSze406Ike80H5ZnCgLeS43ip_Ig7BDYlaDVkVQ2GwlDrhXpfM7_z55GxzTpWP6_7yEneY2Zgl_My9zrxYvVoV31EvSMXduGX0DzI65NkGuqxb7vkl8v2HL3tlH2NLgDydMh6fl5N/s320/mea_timbre_rev1_topcopper.png" width="320" /></a></h2>
<div>
<h2>
Notes</h2>
</div>
<ul>
<li><b>I am convinced that the 50K sliders marked on the original schematics (and this version of the board) should actually be 10K linear.</b> The 120K input and shaping resistors (R102, R103, R104, R105, R108, R109, R110, and R110) are off-board in the original Easel, but included on-board in this adaptation.</li>
<li>The original Easel has a 13.5 V supply, created using an op amp and a transistor buffer. If you have such a supply, you may hook it to the two +13.5 pins and omit R100, R101, R106, and R107. Otherwise, leave the +13.5 pins unconnected and use R100, R101, R106, and R107, which create "soft" +13.5 V supplies (via voltage dividers made by R100 with R101, and R106 with R107.) To counteract loading I found that <b>lowering R100 and R106 from 10K to 1K is a good idea, so I marked these as 1K on the PCB</b>. You may want to experiment with other values. </li>
<li>The Q6 JFET is used as a variable resistor. It is specified as a 2N4341 in the original, but it appears to be out of production. I picked the J201 since it happened to come with the preinstalled Eagle libraries. I've tried a MPF102 here too, and didn't notice a difference. R21 is marked as 6.8K on the original Buchla schematic. I had to raise this value quite a lot in order to not get too much gain through the VCA with the offset knob at the lowest setting. <b>I used 330K instead of 6.8K and marked R21 as such on the PCB</b>. I recommend that as a starting point if you're using a J201 or MPF102 for Q6 (I tried both and didn't notice any difference). Your mileage may vary. Different values of R21 (even instances of the same JFET model type) may be appropriate for different choices of Q6.</li>
<li>I specified Q5 as a 2N3906 since I happen to have of them and it also came preinstalled in the Eagle libraries. In the original Music Easel schematic, it is specified as a 2N4248, which seems to be out of production. You might want to try other transistors here.</li>
<li>The circuit has been tested with RC4558s, which was deemed to be electrically similar to the original RC4136s used in the Easel. Other op amps will probably work (many will probably work better!), but they have not been tried.</li>
<li>D3 is a 1N457. I suspect a 1N4148s or a 1N914 will work, but I have not tested them.</li>
<li>D1 and D2 are not specified in the original schematic; I used 1N457s here, but my suspicions in the previous bullet point apply here too.</li>
</ul>
<h2>
Connections</h2>
Front panel connections usually have a square and round pad together in a white box. The round pad is the signal, and the square pad provides a convenient ground.<br />
<ul>
<li>TAI - Timbre Audio Input</li>
<li>TAO - Timbre Audio Output</li>
<li>TCVI - Timbre CV input; amount of influence is controlled by setting of TCV pot</li>
<li>WCVI - "Waveshape" crossfader CV input; amount of influence is controlled by setting of WCV pot</li>
<li>A1I - Alternate input 1; buffered and appears at A1B</li>
<li>A1B - Buffered version of A1I input; may be used connected to A1C, or not used at all, or connected to a switch</li>
<li>A1C - Corresponds to pin 10 of Board 8 of the original Easel schematics. It corresponds to what you get by turning the waveshape control counterclockwise. If you want to set this up like an original Easel, connect B9P4 or TOP directly A1C, so turning the waveshape control counterclockwise corresponds to the timbre circuit. If you want to always use the "waveshape" crossfader as a stand alone crossfader, you can directly hook A1B to A1C. If you'd like to switch between both options, hook A1C to the common terminal of a on-none-on SPDT switch, and hook TOP or B9P4 to one "on" terminal and A1B to another "on" terminal. (The issue of whether to use TOP or B9P4 is complex and depends on how you set the resistors OR119, OR120, OR1A, and OR47A; see below.)</li>
<li>TOP - Timbre Output Pin - connected to A1C, or to a switch, or not used (see options listed under the A1C description above). This is the timbre output after the gain provided by IC5B (if gain is used).</li>
<li>B9P4 - Corresponds to Pin 4 of Board 9 of the original Music Easel - connected to A1C, or to a switch, or not used (see options listed under the A1C description above). This is the timbre output before the gain provided by IC5B (assuming gain is used).</li>
<li>A2I - "Alternate" input 2; buffered and appears at B8P; used if creating a stand-alone module. This corresponds to what you get when turning the waveshape control clockwise.</li>
<li>B8P - Input to the Vactrol side of the "waveshape" crossfader. If you are using the A2I input, you won't need to use the B8P pad. If you are trying to build an complete Easel, B8P corresponds to pin 12 of IC 4 on the <i>original</i> Easel Board 8 schematic. This is the pulse, square, or triangle shape signal that you'd get by turning the waveshape control clockwise. If you hook a signal directly to B8P, you should omit IC7, R112, R113, R114, R115 (notice this also takes out the A1I, A1B functionality, but that's probably OK since you'll probably be directly hooked the timbre output to A1C anyway). Most users building stand-alone modules will probably not need to use B8P.</li>
<li>MXO - Mixed Output of the "waveshape" crossfader</li>
<li>CSW1, CSW2 - there's a capacitor that provides some filtering action on the timbre output. You can put a switch between CSW and CSW2 and experiment with switching this cap in and out. If you want it to act like an original Easel, just short CSW1 and CSW2.</li>
</ul>
<h2>
Resistor options</h2>
<ul>
<li>If you are using an op amp with some build in short-circuit protection, like the specified RC4558s, then you can use the 220R resistors OR121 and OR48A, and use wires instead of 1K resistors for OR115 and OR122. If, on the other hand, you are using a different op amp capable of creating much bigger currents, I recommend using wires instead of 220R resistors for OR121 and OR48A, and installing actual 1K protection resistors in the OR115 and OR122 spots.</li>
<li>OK, here is where things get really complicated. OR1A and OR47A are specified as 15K and 75K; this is as things are in the original Easel. This gives the raw timbre signal at B8P4 and whatever it is mixed with at B8P a gain of 6. IC5B, OR119, OR120, OR121, and OR122 are not present in the original Easel; this is a copy of the circuitry around IC6B to give that gain of 6 at the TAO output. If you'd like your external signal input at A2I to be subject to the same gain, then you can use 15K and 75K in the OR1A and OR47A spots, respectively. However, you may prefer to take the timbre output to mixer from the TOP pin, so it already has the gain, in which case you can omit OR1A altogether, and use a wire for OR47A, which turns IC6B into a unity gain buffer; in this case, IC5B boosts the timbre output up to the level of typical signals, and will then be on an even footing with most external signals, and IC6B won't provide additional undesired gain. Think carefully about your particular desired gain structure.</li>
</ul>
<h2>
Potentiometers</h2>
<ul>
<li>WOS - "Waveshape" croassfader Offset </li>
<li>WCV - "Waveshape" crossfader CV; controls amount of influence of the WCVI input </li>
<li>TOS - Timbre Offset </li>
<li>TCV - Timbre CV; controls amount of influence of the TCVI input </li>
</ul>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; caret-color: rgb(0, 0, 0); color: black; font-family: -webkit-standard; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-decoration: none; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
</div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; caret-color: rgb(0, 0, 0); color: black; font-family: -webkit-standard; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-decoration: none; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
</div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; caret-color: rgb(0, 0, 0); color: black; font-family: -webkit-standard; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-decoration: none; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
</div>
<h2>
Disclaimer</h2>
<div class="separator" style="clear: both;">
</div>
<ul>
<li>These should be considered advanced projects, and should only be attempted by people with extensive knowledge and experience in electronics, particularly in terms of practical construction and debugging techniques. The boards are dense and the documentation is sparse. If you are just getting started with Synth DIY, I recommend starting with kits.</li>
<li>If you try to build one of these projects, you must assume that you will be on your own, and be confident enough to tackle the project under those circumstances. I am interested in learning about people's experiences in building the boards, and will try to answer questions over e-mail, but I don't have time to do any hand holding.</li>
<li>Any PCBs made available to the public are provided as-is, with no guarantees or warranties whatsoever. Similarly, no guarantees or warranties are made about the correctness or usefulness of the information on these webpages.</li>
<li>Any electronic project may present a risk of injury or death, particularly when dealing with mains voltages. It is important to follow appropriate safety practices. The author of this post, Aaron Lanterman, disclaims any liability for injury, death, or other damage caused in using the PCBs or any of the information contained on these webpages.</li>
</ul>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com0tag:blogger.com,1999:blog-3182418827140543846.post-41264544471859331112019-10-12T22:51:00.004-07:002019-10-12T23:13:21.418-07:00Adaptation of the Pulser & Inverter from the Music Easel<h2>
Revision 1</h2>
Original circuit by Don Buchla (used with his kind permission); adapted by Aaron Lanterman.<br />
This is based on the pulser & inverter circuits on Board of the Music Easel. You should spend some time studying the original schematics.<br />
<h2>
Demo</h2>
<div>
<div>
Note this video is of Version 0, so pay no attention to any mention I make of errors on the PCB; those comments are not relevant to Revision 1.</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/TJ0VuxR63E8/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/TJ0VuxR63E8?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2>
Schematic & layout</h2>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyHuOlcvhH8SjAYvQYjLUA2GoSkHwhcqss2XTYIZOyAciLAIoSjw8KRXSTr8J3a5XfgM43amlxQeYkVxuvecPlfLmp1qFJwzlhDzyvkhtPuszJbblPiYBN2u5rEQXEeeALZuVZVM8j0UvV/s1600/mea_pulser_rev1_schem.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyHuOlcvhH8SjAYvQYjLUA2GoSkHwhcqss2XTYIZOyAciLAIoSjw8KRXSTr8J3a5XfgM43amlxQeYkVxuvecPlfLmp1qFJwzlhDzyvkhtPuszJbblPiYBN2u5rEQXEeeALZuVZVM8j0UvV/s400/mea_pulser_rev1_schem.png" /></a></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5i4NlYYe5pHdJi8H_ic5FJo_Vda3hZzteAw3JFdhPbXGOimfjKVgvoxHWFKuceCxFO6lN1c2RpFY0rFk8Js9qpW-cU6eUBJ7aLBl3bhn6AV9A2XSsSJodw92s5pP9FVlLuyZTkFa_JTBW/s1600/mea_pulser_rev1_pcball.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5i4NlYYe5pHdJi8H_ic5FJo_Vda3hZzteAw3JFdhPbXGOimfjKVgvoxHWFKuceCxFO6lN1c2RpFY0rFk8Js9qpW-cU6eUBJ7aLBl3bhn6AV9A2XSsSJodw92s5pP9FVlLuyZTkFa_JTBW/s400/mea_pulser_rev1_pcball.png" /></a></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrNLHJl00eUy2rNJ2Qz9UgfcdfjW96EtaOotV-SJo1hGkSul83RGwzpW-BxxHIQUbnMbfDKjlkuqU5uXHUj-3IX5WyFfYMlsQqTQQTx71iuJ5IUb3pJ-A4hqAhtoFOaSWlDjFjMXU1qo_4/s1600/mea_pulser_rev1_silkscreen.png" imageanchor="1"></a><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrNLHJl00eUy2rNJ2Qz9UgfcdfjW96EtaOotV-SJo1hGkSul83RGwzpW-BxxHIQUbnMbfDKjlkuqU5uXHUj-3IX5WyFfYMlsQqTQQTx71iuJ5IUb3pJ-A4hqAhtoFOaSWlDjFjMXU1qo_4/s400/mea_pulser_rev1_silkscreen.png" /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUFOr1OkEs3wAgh2wNUykzrzGwU5UNro_OW-4sIhJs5eEdkjDCew98btwO0YoIzQsMXCWw8poY4oSuMOEgb7HLSdBWP0Y6AkHGuXHM9X-SLDt8G9GleAoNClnpD3XYmWtibc3BU2CfA4Od/s1600/mea_pulser_rev1_bottomcopper.png" imageanchor="1"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr1KLmxVeY3USUSpIzo7KjyNPNZS1OOxW5HMeHDQ29VVNul3H9YnxwsoiqWpn9zhW0Fqvret7UUP4EYV-MxbGzrhbgfBA_NUpPPWhyphenhyphenuR7wfTJ5cM1KSDxaExafA5_qDo_s0oyrLpUyoQVd/s1600/mea_pulser_rev1_topcopper.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr1KLmxVeY3USUSpIzo7KjyNPNZS1OOxW5HMeHDQ29VVNul3H9YnxwsoiqWpn9zhW0Fqvret7UUP4EYV-MxbGzrhbgfBA_NUpPPWhyphenhyphenuR7wfTJ5cM1KSDxaExafA5_qDo_s0oyrLpUyoQVd/s400/mea_pulser_rev1_topcopper.png" /></a><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUFOr1OkEs3wAgh2wNUykzrzGwU5UNro_OW-4sIhJs5eEdkjDCew98btwO0YoIzQsMXCWw8poY4oSuMOEgb7HLSdBWP0Y6AkHGuXHM9X-SLDt8G9GleAoNClnpD3XYmWtibc3BU2CfA4Od/s400/mea_pulser_rev1_bottomcopper.png" /></div>
<h2>
Errors</h2>
<div>
<div>
<ul>
<li>There are some errors in the schematic and the silkscreen. Fortunately these only involve incorrect names and values; addressing these issues does not require any trace cutting or jumpering. First note that the "R11" and "R22" labels on the PCB are accidentally swapped; the parts themselves are in the correct place. The resistor closer to the 2N1711 transistor should be labled "R22" and the one closer to the MC14016s should be labeled "R11." Thanks to Dave Brown for catching this error.</li>
<li>If you look on my Eagle schematic around the 2N1711, you'll see R21, R22, and R28 are 6K8. This is a copy-and-paste error in the resistor values, since only one of them should be 6K8. R21 should be 6.8K, but R22 should be 2.2K (I think - it's hard to tell on the original Buchla schematic, it looks like it might be 22K?), and R28 should be 100R. Thanks to Dave Brown for catching these error; I never tried hooking an LED or light bulb up, so I never noticed this error before. Dave also noted that the 100R values for R28 may be specific to using an incandescent bulb.</li>
</ul>
</div>
</div>
<h2>
Notes</h2>
<ul>
<li><b>I am convinced that the 50K sliders marked on the original schematics should actually be 10K linear.</b> The 120K input and shaping resistors (R105, R106, R107, and R108) are off-board in the original Easel, but included on-board in this adaptation.</li>
<li>The original Easel has a 13.5 V supply, created using an op amp and a transistor. If you have such a supply, you may hook it to the +13.5 pin and omit R103 and R104. Otherwise, leave the +13.5 pins unconnected and use R103 and R104, which create a "soft" +13.5 V supply. <b>I found it important to lower R103 to something like 3.3K to counteract loading, so I marked R103 as 3.3K on the PCB.</b> You may want to experiment with other values.</li>
<li>The circuit has been tested with RC4558s, which was deemed to be electrically similar to the original RC4136s used in the Easel. Other op amps will probably work (many will probably work better!), but they have not been tried.</li>
<li>D3-D6 are 1N457s. I suspect a 1N4148s or a 1N914 will work, but I have not tested them.</li>
</ul>
<div>
<h2>
Connections</h2>
</div>
<div class="separator" style="clear: both; text-align: left;">
Front panel connections usually have a square and round pad together in a white box. The round pad is the signal, and the square pad provides a convenient ground.PIC, PIO, FB - Pulse Input Common, Pulse Input One-Shot, and Feedback. You want to try to find a single-pole on-off-(on) switch, where the (on) indicates momentary operation. Hook PIC to the common switch terminal, hook PIO to the (on) terminal, and hook FB to the regular on terminal. This will let you do just one "pulse," or if you switch to the feedback mode quickly after doing one pulse, the pulser will drive itself and you will get repeated pulses. The middle position turns off the pulsing. If need be, you could just use a regular on-off-on switch here.</div>
<ul>
<li>PCVA, PCVB - Pulser CV outputs A and B. A is active when AEN is set high; B is active when BEN is set high.</li>
<li>PPA, PPB - Pulser pulse outputs A and B. A is active when AEN is set high; B is active when BEN is set high.</li>
<li>Y1, Y2 - terminal of an electronic switch; connection made when BEN is set high (untested).</li>
<li>Z1, Z2 - terminals of an electronic switch; connection made when BEN is set high (untested).</li>
<li>ANOT, BNOT - logical "not" of AEN and BEN</li>
<li>AEN, BEN - A and B enables; see other connection instructions for details of what they enable. I plan to connect these to a switch that will let be switch between automatically-on (connect to +15 V) and connect to an external input. Most users will probably just want to tie AEN to +15 so the A outputs are always enabled. Some users may want to just ignore the B outputs entirely. Some might want to only use the "B" part of the circuit to control the Z1,Z2 and Y1,Y2 electronic switches, and ignore the pulser B outputs. Do whatever makes you happy.</li>
<li>INVI, INVO - inverter input and output; takes 0-10 V CV and outputs 10-0 V CV. The inverter is independent of the rest of the pulser, so you can invert whatever CV signals you want.</li>
<li>LED - on the Easel schematics, this is actually called "LAMP" and is shown going through a lamp-looking symbol to a +12 V supply. I haven't tried doing anything with this, since it's a low priority for me, but if someone can get something to light up I'd love to hear about it.</li>
</ul>
<h2>
Potentiometers</h2>
<div class="separator" style="clear: both;">
</div>
<ul>
<li>LOS - Level (pulser rate) Offset</li>
<li>LCV - Level (pulser rate) CV; controls amount of influence of the LIN input</li>
<li>TRIM - Trims the pulser rate - set to personal taste</li>
</ul>
<h2>
Disclaimer</h2>
<div class="separator" style="clear: both;">
</div>
<ul>
<li>These should be considered advanced projects, and should only be attempted by people with extensive knowledge and experience in electronics, particularly in terms of practical construction and debugging techniques. The boards are dense and the documentation is sparse. If you are just getting started with Synth DIY, I recommend starting with kits.</li>
<li>If you try to build one of these projects, you must assume that you will be on your own, and be confident enough to tackle the project under those circumstances. I am interested in learning about people's experiences in building the boards, and will try to answer questions over e-mail, but I don't have time to do any hand holding.</li>
<li>Any PCBs made available to the public are provided as-is, with no guarantees or warranties whatsoever. Similarly, no guarantees or warranties are made about the correctness or usefulness of the information on these webpages.</li>
<li>Any electronic project may present a risk of injury or death, particularly when dealing with mains voltages. It is important to follow appropriate safety practices. The author of this post, Aaron Lanterman, disclaims any liability for injury, death, or other damage caused in using the PCBs or any of the information contained on these webpages.</li>
</ul>
<br />
<div>
<br /></div>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com0tag:blogger.com,1999:blog-3182418827140543846.post-13556408203988821422019-10-12T22:09:00.001-07:002019-10-12T22:13:30.577-07:00Adaptation of the Low Pass Gate from the Music Easel<h2>
Revision 1</h2>
Original circuit by Don Buchla (used with his kind permission); adapted by Aaron Lanterman<br />
This is based on the lowpass gate circuit on Board 10 and Board 11 of the Music Easel, which contains two identical LPG circuits. You should spend some time studying the original schematics.<br />
<h2>
Schematic & Layouts</h2>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu2gi52UIrJeGlVsxwaQu-qJFlyMF9dxgZZb5JhaClhuoBzffIP3NK_WSV7s_-jFhF9SL01ho83G2EzgRSeGubYdya7QB1ch2Vq3924aE6YKte8J4_0afBQBO03H8l0hqQMGmui5q_o5EI/s1600/mea_lpg_rev1_schem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu2gi52UIrJeGlVsxwaQu-qJFlyMF9dxgZZb5JhaClhuoBzffIP3NK_WSV7s_-jFhF9SL01ho83G2EzgRSeGubYdya7QB1ch2Vq3924aE6YKte8J4_0afBQBO03H8l0hqQMGmui5q_o5EI/s320/mea_lpg_rev1_schem.png" width="320" /></a><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQR0-2n4YPiGiTt8G6KPRSL77LZU9aO3y2Egks-0BHL5sMNs33X44QlTy6FYWBbnr52g8qX9OHfnoY60BD7SIKJNhUJlcH47XldiLp5dK7tr6ZiVQlq8HgxeGeB13DpgJxa3fxaY4Qo6Rw/s1600/mea_lpg_rev1_pcball.png" imageanchor="1"><img border="0" height="174" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQR0-2n4YPiGiTt8G6KPRSL77LZU9aO3y2Egks-0BHL5sMNs33X44QlTy6FYWBbnr52g8qX9OHfnoY60BD7SIKJNhUJlcH47XldiLp5dK7tr6ZiVQlq8HgxeGeB13DpgJxa3fxaY4Qo6Rw/s320/mea_lpg_rev1_pcball.png" width="320" /></a><br />
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpOE5zJ9Pb-CZGlPdIDf2_T1Dua-2RWhpLHSp6R7k2Tjssl58dNXRCdHgKZ0rjdijsa80bFfFwqNaKuFFLHxYfMEqkccJqsGmSWau3Iz6Hx04Pp1D2U8c_-ctANsSjE-2s2AXEdjE8Z7n8/s1600/mea_lpg_rev1_silkscreen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="174" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpOE5zJ9Pb-CZGlPdIDf2_T1Dua-2RWhpLHSp6R7k2Tjssl58dNXRCdHgKZ0rjdijsa80bFfFwqNaKuFFLHxYfMEqkccJqsGmSWau3Iz6Hx04Pp1D2U8c_-ctANsSjE-2s2AXEdjE8Z7n8/s320/mea_lpg_rev1_silkscreen.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ7RTALxW5Q-uBhqzbx7GnzPUIB79ludth7QDoOAxqQvHR0-sdTt6868V08TL8GhhW_vX05RCQOn3Nh1DMzdY8di0H7CE6Yrl4zPR-F7R0NcZktZ-on-Ds9TMdfR8bN3l5xxMEmRNmUWfS/s1600/mea_lpg_rev1_bottomcopper.png" imageanchor="1"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ7RTALxW5Q-uBhqzbx7GnzPUIB79ludth7QDoOAxqQvHR0-sdTt6868V08TL8GhhW_vX05RCQOn3Nh1DMzdY8di0H7CE6Yrl4zPR-F7R0NcZktZ-on-Ds9TMdfR8bN3l5xxMEmRNmUWfS/s320/mea_lpg_rev1_bottomcopper.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh63G0D_p3ZSzPsSV7EO55IPkv7CyjGUrbhqQv5Ty2bL1RNgRqyIanFsGOXQB0GuBtxm_tq5-4dOKJotzBTAAOBQHbOm1bCqQE7Vtmoc88kS3TlyHWij_cf_Y9FAhfU0WhmDH4FiziWN4BO/s1600/mea_lpg_rev1_topcopper.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh63G0D_p3ZSzPsSV7EO55IPkv7CyjGUrbhqQv5Ty2bL1RNgRqyIanFsGOXQB0GuBtxm_tq5-4dOKJotzBTAAOBQHbOm1bCqQE7Vtmoc88kS3TlyHWij_cf_Y9FAhfU0WhmDH4FiziWN4BO/s320/mea_lpg_rev1_topcopper.png" width="320" /></a></div>
<h2>
Notes</h2>
</div>
<div>
<ul>
<li>The holes and traces on the Revision 1 PCBs are the same as on Version 0. The only changes I made were to the silkscreen. I forgot to put a "Rev 1" marking on the board. You can tell it is a "Rev 1" board if it says "BEAD" in the spots near the power connector; the older version said "2R2." </li>
<li><b>I have not been able to get the LED to light. I do not know why.</b> (It appears that one of my beta testers has gotten an LED to light, though.)</li>
<li><b>I am convinced that the 50K sliders marked on the original schematics should actually be 10K linear.</b> The 120K input and shaping resistors (R105, R106, R107, and R108) are off-board in the original Easel, but included on-board in this adaptation.</li>
<li>The original Easel has a 13.5 V supply, created using an op amp and a transistor. If you have such a supply, you may hook it to the +13.5 pin and omit R103 and R104. Otherwise, leave the +13.5 pin unconnected and use R103 and R104, which create a "soft" +13.5 V supply. In testing, this was found to droop to between 9 V and 11 V depending on pot settings, resulting in me being unable to open up the filter all the way using just the LOS pot. <b>I lowered R103 to 3.3K, and found that this helped counteract the droop and I got a reasonable full-range control, so I marked R103 as 3.3K on the board.</b> You may want to experiment with other values for R103. An alternative would be to keep the R103/R104 ratio the same but lower the overall values, such as reducing R103 to 1K and R104 to 9.1K. However, I have not tried this.</li>
<li><b>The area around the vactrols is tight; be sure to install R42 and R41 before installing the vactrols.</b> Also, the 910 pf silver mica caps are pretty big; to get them installed I had to leave them kind of floating above most of the other parts.</li>
<li>Q2, the buffer JFET, is a 2N4340 in the original. I picked the J201 since it happened to come with the preinstalled Eagle libraries. I used an actual J201 in my build and it worked fine. Any JFET you have previously successfully used as an audio buffer should work fine here.</li>
<li>The need for R100, the 68K input resistor, was gleaned by studying other parts of the original Easel schematics.</li>
<li>The circuit has been tested with RC4558s. Other op amps will probably work (many will probably work better!), but they have not been tried.</li>
<li>The regular diode in the original is a 1N457. I suspect a 1N4148s or a 1N914 will work, but I have not tested them.</li>
<li>Dr. Mabuse has run into a problem with excessive current draw cooking parts - <a href="file:///Users/lanterma/Downloads/lanterma/buchla/boards/mea_lpg/excessive_current.html">read about the problem and his solution here.</a> I personally haven't been able to reproduce whatever the problem is. I would be very interested to see if other people do (or don't) run into this problem.</li>
<li>Dr. Mabuse reports that a 0.001 uf cap (i.e. 1 nf) works fine in place of the 910 pf cap around the LED-driving 2N1711 transistor; this lets you save 910 pf micas for more critical audio path applications.</li>
<li>Dr. Mabuse writes: "Another sub that I decided against but still yielded useful and interesting results was swapping a single VTL5C3/2 for two VTL5C3s. It works both as a filter and as a VCA but the response curve is noticeably different (not as even and smooth) and the VCA mode didn't attenuate quite as much. In a pinch it think it could be used though."</li>
</ul>
</div>
<div>
<div>
<h2>
Connections</h2>
</div>
<div>
Front panel connections usually have a square and round pad together in a white box. The round pad is the signal, and the square pad provides a convenient ground.<br />
<br />
<ul>
<li>LIN - Level CV Input; amount of influnce controlled by setting of LCV pot</li>
<li>AIN - Audio input</li>
<li>AO - Audio output</li>
<li>LED - Hooks to the cathode (straight line part of symbol, shorter leg of actual device) of an LED; the anode (triangle part of symbol, longer leg of actual device) of the LED is hooked to +5 V.</li>
<li>SWV, SWC, and SWL - Connections for the mode switch. Use a SPDT on-off-on switch. Connect SWC to the common connection, SWV to the lower connection, and SWL to the upper connection. Switching to connect SWC to SWL puts the filter in lowpass mode; switching to connect SWC to SWV puts it in VCA mode, and switching it to the "off" position puts it in "combo" mode.</li>
<li>CIN - Control input. CV input for mode control; amount of influence is controlled by the CCV pot. If +13.5 V is input here, then the resistance of CCV corresponds to the resistor setting on an Easel programming card, but you can put in all sorts of varying voltages here. I have not tried to puzzle out exactly what effect this has, i.e. how many volts at a given pot setting is required to change modes, etc., but I have made it switch modes. This input piles "on top of" the switch setting, so its influence will change with switch settings.</li>
<li>B10P1 - Analogous to Pin 1 on Board 10; maybe useful if you are using this to replace an original Easel board. Most users will not need this.</li>
<li>B10P9 - Analogous to Pin 9 on Board 10; maybe useful if you are using this to replace an original Easel board. Most users will not need this.</li>
</ul>
<br />
<h2>
Potentiometers</h2>
</div>
</div>
<div>
<div>
<ul>
<li>LOS - Level Offset</li>
<li>LCV - Level CV; controls amount of influence of the LIN input</li>
<li>CCV - Control CV; controls amount of influence of CCV. I specified 300K here, but I largely pulled that number out of a hat. I would suggest a linear pot, but I'm really not sure if a log or linear pot would be best. If +13.5 V is put into CIN, then CCV corresponds to the resistor setting on an Easel programming card, but you can put in all sorts of changing voltages for CIN.</li>
</ul>
</div>
</div>
<h2>
Disclaimer</h2>
<div>
<ul>
<li>These should be considered advanced projects, and should only be attempted by people with extensive knowledge and experience in electronics, particularly in terms of practical construction and debugging techniques. The boards are dense and the documentation is sparse. If you are just getting started with Synth DIY, I recommend starting with kits.</li>
<li>If you try to build one of these projects, you must assume that you will be on your own, and be confident enough to tackle the project under those circumstances. I am interested in learning about people's experiences in building the boards, and will try to answer questions over e-mail, but I don't have time to do any hand holding.</li>
<li>Any PCBs made available to the public are provided as-is, with no guarantees or warranties whatsoever. Similarly, no guarantees or warranties are made about the correctness or usefulness of the information on these webpages.</li>
<li>Any electronic project may present a risk of injury or death, particularly when dealing with mains voltages. It is important to follow appropriate safety practices. The author of this post, Aaron Lanterman, disclaims any liability for injury, death, or other damage caused in using the PCBs or any of the information contained on these webpages.</li>
</ul>
</div>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com0tag:blogger.com,1999:blog-3182418827140543846.post-26793973686045037672019-08-27T23:53:00.001-07:002019-08-27T23:53:26.421-07:00Adaptation of the Balanced Modulator from the Music Easel<h2>
Revision 2</h2>
Original circuit by Don Buchla (used with his kind permission); adapted by Aaron Lanterman. This is based on the balanced modulator circuit on Board 5 of the Music Easel. You should spend some time studying the original schematics. <b>Warning: </b>This board is designed to be highly flexible; it can be configured in many different ways. Please read the notes below carefully and decide what options you want before building.<br />
<h2>
Demos</h2>
Note this is a demo of Version 0. Revision 2 doesn't require all of those horrible kludges seen in the video.<br />
<div class="separator" style="clear: both; text-align: left;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/UKisZpQu2Dk/0.jpg" src="https://www.youtube.com/embed/UKisZpQu2Dk?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<div class="separator" style="clear: both; text-align: left;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/v0InHm5aHvE/0.jpg" src="https://www.youtube.com/embed/v0InHm5aHvE?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
<h2>
Schematic & layouts</h2>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB1wOYnAhyzRF9KJEpITjtGtNz8nHXLU1cnC0dUV_7Ey6QkcFhdVD_FvNMZefESt5wRnP9DXkYG8aRfaSUfvdihZWV11AK04V4TkVrKWiKhn46bREeA_T_oZTMEBN1dQn92kHMe5Bn9200/s1600/mea_balmod_rev2_schem.png" imageanchor="1"><img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB1wOYnAhyzRF9KJEpITjtGtNz8nHXLU1cnC0dUV_7Ey6QkcFhdVD_FvNMZefESt5wRnP9DXkYG8aRfaSUfvdihZWV11AK04V4TkVrKWiKhn46bREeA_T_oZTMEBN1dQn92kHMe5Bn9200/s320/mea_balmod_rev2_schem.png" width="320" /></a></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBKEZjhh4UV1H3rbjZtYJSoV9ANARIvmxV-EFaw-F2a_zoFdYeOHOz9CfksZA24ilQi2nFatmjn3N25MGOTAd3epNIkGNekgFlTxjndcKdRnpkSuUfarxNS5q3PBRwOvaJiDqWJXsyQlQA/s1600/mea_balmod_rev2_pcball.png" imageanchor="1"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBKEZjhh4UV1H3rbjZtYJSoV9ANARIvmxV-EFaw-F2a_zoFdYeOHOz9CfksZA24ilQi2nFatmjn3N25MGOTAd3epNIkGNekgFlTxjndcKdRnpkSuUfarxNS5q3PBRwOvaJiDqWJXsyQlQA/s320/mea_balmod_rev2_pcball.png" width="320" /></a></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpPRKlTRqGEkOI1pHIn-BM3uDEu_kUii2RwD376K4FrY7XE3ldXp1sRIOP1Oh3Pphh5gH690q7Vb0vCVus8vGZDCPZEBiWuedooTUJf9VFMgSsZx3ZmCgHJkxpmqnTe1OmfGKjoHelGNl6/s1600/mea_balmod_rev2_silkscreen.png" imageanchor="1"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpPRKlTRqGEkOI1pHIn-BM3uDEu_kUii2RwD376K4FrY7XE3ldXp1sRIOP1Oh3Pphh5gH690q7Vb0vCVus8vGZDCPZEBiWuedooTUJf9VFMgSsZx3ZmCgHJkxpmqnTe1OmfGKjoHelGNl6/s320/mea_balmod_rev2_silkscreen.png" width="320" /></a></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1RAQ8uuPdl2sYW2D0pGvMt9IjfMUap8oYOgjG-O3G04lOa3Lq56eYFBEFAzLrAgLUzIcoFOTM8eYzZa765D9AASMKEdn1MNqm4N0H2a4dUbPVGMYijvBKDqcgdPmJWegIDKrSGKgustmr/s1600/mea_balmod_rev2_bottomcopper.png" imageanchor="1"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1RAQ8uuPdl2sYW2D0pGvMt9IjfMUap8oYOgjG-O3G04lOa3Lq56eYFBEFAzLrAgLUzIcoFOTM8eYzZa765D9AASMKEdn1MNqm4N0H2a4dUbPVGMYijvBKDqcgdPmJWegIDKrSGKgustmr/s320/mea_balmod_rev2_bottomcopper.png" width="320" /></a></div>
<h2>
Notes</h2>
<div>
<div>
<ul>
<li><b>I am convinced that the 50K sliders marked on the original schematics should actually be 10K linear. </b>The 120K input and shaping resistors (R117, R118, R119, R120) are off-board in the original Easel, but included on-board in this adaptation.</li>
<li>The original Easel has a 13.5 V supply, created using an op amp and a transistor. If you have such a supply, you may hook it to the +13.5 pin and omit R115 and R116. Otherwise, leave the +13.5 pins unconnected and use R115 and R116, which create a "soft" +13.5 V supply. You may want to experiment with changing these settings a bit, for instance lowering R115 and R116, to counteract loading. I found that<b> lowering R115 from 10K to 3.3K is seemed to work well.</b></li>
<li>If you want to use the FO fuzz output, <b>you should add a 0.1 microfarad DC blocking cap, like the FOA and FOB outputs have. </b>It should be pretty easy to add this somewhere on the way between the board and the FO jack.</li>
<li>The circuit has been tested with RC4558s. Other op amps will probably work (many will probably work better!), but they have not been tried.</li>
</ul>
</div>
</div>
<div>
<h2>
Connections</h2>
<div>
<ul>
<li>Front panel connections usually have a square and round pad together in a white box. The round pad is the signal, and the square pad provides a convenient ground.</li>
<li>MI - Modulation Input</li>
<li>SI - Signal Input</li>
<li>EW, ED - External Wet, External Dry - the balanced modulator has a crossfader that lets the user fade between the "dry" signal input and the "wet" full ring mod signal. These inputs let the user put in alternative "wet" and "dry" signals, so the crossfader may be used as a stand-alone submodule separate from the ring mod.</li>
<li>MIXO - Mixed Output of the crossfader - this is the actual output of the "real Easel" balanced modulator</li>
<li>RMO - Ring Modulator Output - this is the pure ring mod signal.</li>
<li>FO, FOA, and FOB - fuzz outputs - various highly distorted versions of the modulation input signal. These taps were suggested by Grant Richter (who had many helpful suggestions on this particular project.)</li>
<li>CVIN - crossfader CV input; amount of influence is controlled by setting of CV pot</li>
<li>WSC, WSE, WSW - switch to select what goes in the "wet" side of the crossfader, if you want this facility. Hook WSC to the common of an on-none-on single pole switch, and connect WSE ("external wet" select) and WSW (full ring mod select) to the poles. If you don't want this facility, and want it to act like an original Easel, i.e. the crossfader is dedicated to the ring mod, then simply hook WSW to WSC.</li>
<li>DSC, DSE, DSW - switch to select what goes in the "dry" side of the crossfader, if you want this facility. Hook DSC to the common of an on-(none)-on single pole switch, and connect DSE ("external dry" select) and DSW (signal input select) to the poles. If you don't want this facility, and want it to act like an original Easel, i.e. the crossfader is dedicated to the ring mod, then simply hook DSD to DSC.</li>
<li>Note that if you take the "act like an original Easel" approach in the last two bullet points, you may omit IC5 and R104, R105, R106, R107, R108, and R109. Also note that when external inputs are being used, the terms "wet" and "dry" just denote different inputs - those external inputs can be whatever you want.)</li>
<li>B5IC2P8, BIC2P2, BIC5P10 - these correspond to various points on the original Easel schematic, if desired. The ICXPY notation refers to IC X (on the original Easel schematic), pin Y (original Easel IC pins). They might be useful to someone trying to clone a full Easel, but most users will not need to use these.</li>
<li>VI - "variant input" - OK, this may get confusing (uhm, even more confusing, I mean.) On the Easel, the control circuitry for the vactrols in the crossfader for the ringmod drives an additional vactrol, which sort of forms a VCA for the FM input for the principle oscillator. Here, I've set it up as a stand-alone VCA that you can do whatever you want with.</li>
<li>VO - "variant output" - output of the VCA described above</li>
<li>VSC, VCE, VSM - switch to select what to send to the "variant" VCA. Connect VSC to the common of an on-none-on single-pole switch, and connect VCE to VSM to the poles. When switched to VCE, it will send the VI signal to the VCA. When switched to VSM, it will send the modulation input (MI) to the VCA (this is the "real Easel") behavior. Of course, you can omit the switch and just tie VSC directly to VSM or VCE, if you want to do such a thing.</li>
</ul>
</div>
<h2>
Resistor options</h2>
<div>
<ul>
<li>If you are using an op amp with some build in short-circuit protection, like the specified RC4558s, then you can use the 220R resistors OR122, OR123, and OR124, and use wires instead of 1K resistors for OR112, OR113, OR114. If, on the other hand, you are using a different op amp capable of creating much bigger currents, I recommend using wires instead of 220R resistors for OR122, OR123, and OR124, and installing actual 1K protection resistors in the OR112, OR113, OR114, spots.</li>
</ul>
</div>
<h2>
Potentiometers</h2>
<div>
<ul>
<li>offset - crossfader offset (original Easel schematics say 50K, but I believe that is an error; I recommend 10K linear)</li>
<li>CV - crossfader CV; controls amount of influence of the WCVI input (original Easel schematics say 50K, but I believe that is an error; I recommend 10K linear)</li>
<li>SYMTR - I found the easiest way to trim this is to modulate an audio signal with an LFO, and trim it until you get similar amplitude beats.</li>
</ul>
</div>
<div>
<h2>
Disclaimer</h2>
<div>
<ul>
<li>These should be considered advanced projects, and should only be attempted by people with extensive knowledge and experience in electronics, particularly in terms of practical construction and debugging techniques. The boards are dense and the documentation is sparse. If you are just getting started with Synth DIY, I recommend starting with kits.</li>
<li>If you try to build one of these projects, you must assume that you will be on your own, and be confident enough to tackle the project under those circumstances. I am interested in learning about people's experiences in building the boards, and will try to answer questions over e-mail, but I don't have time to do any hand holding.</li>
<li>Any PCBs made available to the public are provided as-is, with no guarantees or warranties whatsoever. Similarly, no guarantees or warranties are made about the correctness or usefulness of the information on these webpages.</li>
<li>Any electronic project may present a risk of injury or death, particularly when dealing with mains voltages. It is important to follow appropriate safety practices. The author of this post, Aaron Lanterman, disclaims any liability for injury, death, or other damage caused in using the PCBs or any of the information contained on these webpages.</li>
</ul>
</div>
</div>
</div>
<br />Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com1tag:blogger.com,1999:blog-3182418827140543846.post-42119532704833722662019-08-27T23:22:00.001-07:002019-08-27T23:22:23.883-07:00Adaptation of the Envelope Generator from the Music Easel<h2>
Revision 1</h2>
Original circuit by Don Buchla (used with his kind permission); adapted by Aaron Lanterman. This is based on the envelope generator circuit of Board 3 of the Music Easel. You should spend some time studying the original schematics.<br />
<h2>
Demo</h2>
<div class="separator" style="clear: both; text-align: left;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/BBpSuDe31xM/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/BBpSuDe31xM?feature=player_embedded" width="320"></iframe></div>
<h2>
Schematic & layouts</h2>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2sJsYpvQVQicmGLYhe4LJ4N16KG7y9RqIouWzOLoO3-d1LN7pqVn5GHk3BMSHQrytfjeCKXFHsYY7CM05dAleXDGAoGi77gyIt_I8YnrOCJK-OT87-6fmlHOnM8JQ0sOS9dojeNgq9Rxb/s1600/mea_envgen_rev1_schem.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2sJsYpvQVQicmGLYhe4LJ4N16KG7y9RqIouWzOLoO3-d1LN7pqVn5GHk3BMSHQrytfjeCKXFHsYY7CM05dAleXDGAoGi77gyIt_I8YnrOCJK-OT87-6fmlHOnM8JQ0sOS9dojeNgq9Rxb/s320/mea_envgen_rev1_schem.png" width="306" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4j45wFZZnVxNQjUEX-h4kDGZx4lx952l7qAQeU_bihxPVflF3JI6DKjgTm_R37cLXWWaqzLz1O39XnnYk5wQHciABI3dwYC3g3XTCY_zMTAOVNINSyOaRXukzt9gLlvdp9T_nsf6dFYsz/s1600/mea_envgen_rev1_pcball.png" imageanchor="1"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4j45wFZZnVxNQjUEX-h4kDGZx4lx952l7qAQeU_bihxPVflF3JI6DKjgTm_R37cLXWWaqzLz1O39XnnYk5wQHciABI3dwYC3g3XTCY_zMTAOVNINSyOaRXukzt9gLlvdp9T_nsf6dFYsz/s320/mea_envgen_rev1_pcball.png" width="320" /></a></div>
<h2>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJWJ6w4AJNACwth_Qy9vNMuMBnrhZ_Mzh4J8Z0_U8H-ziKy1f2jOEi6Uvm4myTgqlBfGSFdWo4uz-2qCFo0aQdzkgd4FI3j1lnVJ56F2Bdv4qH5PR0Rb_JBYEvIBlANCLa-nNfb6o4fLwJ/s1600/mea_envgen_rev1_silkscreen.png" imageanchor="1"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJWJ6w4AJNACwth_Qy9vNMuMBnrhZ_Mzh4J8Z0_U8H-ziKy1f2jOEi6Uvm4myTgqlBfGSFdWo4uz-2qCFo0aQdzkgd4FI3j1lnVJ56F2Bdv4qH5PR0Rb_JBYEvIBlANCLa-nNfb6o4fLwJ/s320/mea_envgen_rev1_silkscreen.png" width="320" /></a></h2>
<h2>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcqCcIxseWVLcMiObZSuN65uUPiY_4YlvBX0S2yy0CjZGAp_dT_ZpLA5SIuzTBRTXboxrHroED1h0WdwjJkwTvLTL1Ux8yWLIqyQqe5M0ENPtZgEOFZUOGJQn6EcHvNUM2qO6nb3ecYF7F/s1600/mea_envgen_bottomcopper.png" imageanchor="1"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcqCcIxseWVLcMiObZSuN65uUPiY_4YlvBX0S2yy0CjZGAp_dT_ZpLA5SIuzTBRTXboxrHroED1h0WdwjJkwTvLTL1Ux8yWLIqyQqe5M0ENPtZgEOFZUOGJQn6EcHvNUM2qO6nb3ecYF7F/s320/mea_envgen_bottomcopper.png" width="320" /></a></h2>
<h2>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEmNV2GgXu_ij2mlm0jV6Z9HXU5D-Zuek255FNk1-liLMRuXsWuacEvQhr4w9PA88Pcnhn2jA3u3wILFLErtfuJ0q2sgkpUU87WfjTB2UylMxvidQQT-hO9PyDqaH61PPpbUkid0BGvMd1/s1600/mea_envgen_rev1_bottomcopper.png" imageanchor="1"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEmNV2GgXu_ij2mlm0jV6Z9HXU5D-Zuek255FNk1-liLMRuXsWuacEvQhr4w9PA88Pcnhn2jA3u3wILFLErtfuJ0q2sgkpUU87WfjTB2UylMxvidQQT-hO9PyDqaH61PPpbUkid0BGvMd1/s320/mea_envgen_rev1_bottomcopper.png" style="cursor: move;" width="320" /></a></h2>
<h2>
Notes</h2>
<div>
<ul>
<li>The holes and traces on the Revision 1 PCBs are the same as on Version 0. The only changes I made were to the silkscreen.</li>
<li><b>I am convinced that the 50K sliders marked on the original schematics should actually be 10K linear. </b>The 120K input and shaping resistors (R117 through R128) are off-board in the original Easel, but included on-board in this adaptation.</li>
<li>The circuit has been tested with RC4558s, which was deemed to be electrically similar to the original RC4136s used in the Easel. Other op amps will probably work (many will probably work better!), but they have not been tried.</li>
<li>Buchla went to the effort to specify 1N457 in one instance and 1N457A in another instance, so I'd be nervious about changing what dioes are used. I'd be curious if to know if other diodes, such as 1N4148s or 1N914s, will work.</li>
<li>Bjorn wrote: "I am not sure whether a solution to get the transient function of the envelope generator with a regular gate signal has been proposed yet. Anyways, I have been able to get this functionality by replacing R101 with a 10nf cap."</li>
</ul>
<div>
<h2>
Connections</h2>
<div>
<ul>
<li><span style="caret-color: rgb(0, 0, 0); font-family: -webkit-standard; text-size-adjust: auto;">Front panel connections usually have a square and round pad together in a white box. The round pad is the signal, and the square pad provides a convenient ground.</span></li>
<li>ATIN, DURIN, DECIN - attack, duration, and decay CV inputs; influence is controlled by ATCV, DURCV, and DECCV settings, respectively</li>
<li>PIN - pulse input</li>
<li>B3P6 - corresponds to original Easel Board 3, Pin 6</li>
<li>TRAN, SUS - connect TRANS and SUS to the extremes of a single-pole on-none-on switch, and connect B3P6 to the common terminal of this switch. This lets the user switch been "transient" and "sustained" modes. (Note I only tested the transient functionality.)</li>
<li>POUT - pulse output</li>
<li>ENVOUT - envelope output</li>
<li>LED - on the Easel schematics, this is actually called "LAMP" and is shown going through a lamp-looking symbol to a +12 V supply. I haven't tried doing anything with this, since it's a low priority for me, but if someone can get something to light up I'd love to hear about it.</li>
<li>+13.5 V - a supply created using a buffer op amp (most users will not need this)</li>
</ul>
<h2>
<span style="font-family: -webkit-standard;">Potentiometers</span></h2>
</div>
</div>
</div>
<div>
<ul>
<li><span style="caret-color: rgb(0, 0, 0); font-family: -webkit-standard; text-size-adjust: auto;">ATOS, DUROS, DECOS - attack, duration, and decay offsets</span></li>
<li>ATCV, DURCV, DECCV - attack, duration, and decay CV controls; control influence of ATIN, DURIN, and DECIN inputs, respectively</li>
</ul>
<h2>
Disclaimer</h2>
</div>
<div>
<div>
<ul>
<li>These should be considered advanced projects, and should only be attempted by people with extensive knowledge and experience in electronics, particularly in terms of practical construction and debugging techniques. The boards are dense and the documentation is sparse. If you are just getting started with Synth DIY, I recommend starting with kits.</li>
<li>If you try to build one of these projects, you must assume that you will be on your own, and be confident enough to tackle the project under those circumstances. I am interested in learning about people's experiences in building the boards, and will try to answer questions over e-mail, but I don't have time to do any hand holding.</li>
<li>Any PCBs made available to the public are provided as-is, with no guarantees or warranties whatsoever. Similarly, no guarantees or warranties are made about the correctness or usefulness of the information on these webpages.</li>
<li>Any electronic project may present a risk of injury or death, particularly when dealing with mains voltages. It is important to follow appropriate safety practices. The author of this post, Aaron Lanterman, disclaims any liability for injury, death, or other damage caused in using the PCBs or any of the information contained on these webpages.</li>
</ul>
</div>
</div>
<div>
<br /></div>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com0tag:blogger.com,1999:blog-3182418827140543846.post-44364038192930258782019-08-24T23:01:00.002-07:002019-08-24T23:01:49.152-07:00Demo of a Korg Delta VCF adaptation my students made<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: white; caret-color: rgb(29, 33, 41); color: #1d2129; font-family: system-ui, -apple-system, BlinkMacSystemFont, ".SFNSText-Regular", sans-serif; font-size: 14px;">While sorting through e-mail, I came across this link to a video that some of my Analog Circuits for Music Synthesis students made demoing their final project.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/WhfRX3rTmtk/0.jpg" src="https://www.youtube.com/embed/WhfRX3rTmtk?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com0tag:blogger.com,1999:blog-3182418827140543846.post-61148384936419145622019-07-22T01:50:00.003-07:002019-07-22T01:53:56.442-07:00Customizing the Lit Shader in Unity's Lightweight Render Pipeline<span style="font-family: inherit;">Unity used to have a "Surface Shader" system by which you could write a function that would specify certain material properties based on various textures, slider settings, etc., and then Unity would compile the numerous shaders needed to support various functions like shadows, deferred rendering, etc. without you having to manually write each one. It also let you write custom lighting functions for that Surface Shader framework.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Surface Shaders were part of the original Unity built-in render pipeline. But, the new Scriptable Render Pipelines, namely the High Definition RP and the Lightweight RP, don't have Surface Shaders. They do have a graphical node-based shader programming facility called Shader Graph. Besides the usual problems with graphical programming paradigms (namely, a few lines of textual code can into verbose visual spaghetti code, with confusing lines connecting many blocks spread out over multiple screens), Shader Graph restricts you to the particular lighting models Unity provides in the form of Master Nodes. Some have tried to work around this by doing lighting calculations in the blocks and feeding the final result into the "emission" input of a master node; however, getting lighting info into the Shader Graph is tough. Another options is to save the HLSL generated by the Shader Graph compiler and modify that; unfortunately, the compiler assigns the links between nodes arbitrary variable name that look like license plate numbers, making the generated HLSL difficult to follow.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">These problems with Shader Graph lead to the sad conclusion that if you want to create your own lighting models, you need to copy and modify one of Unity's hand-crafted ubershaders, even if that means duplicating a lot of effort in different shader passes. </span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">If you want to implement a custom lighting model, you'll be spending a lot of time trying to understand Lighting.hlsl. It contains LightweightFragmentPBR (used by Lit shader) and LightweightFragmentBlinnPhong (used by Simple Lit shader). Lighting.hlsl imports from Common.hlsl, EntityLighting.hlsl, ImageBasedLighting.hlsl, Core.hlsl, and Shadows.hlsl.</span><br />
<br />
We'll also talk explore dynamic vertex and texture coordinate modifications. These are easily implemented with Shader Graph, but we might as well address them while we're here.<br />
<br />
<h2>
<span style="font-family: inherit;">LWRP Lit Shader Passes</span></h2>
<span style="font-family: inherit;">Lit.shader consists of four passes: ForwardLit, ShadowCaster, DepthOnly, and Meta; they import LitForwardPass.hlsl, ShadowCasterPass.hlsl, DepthOnlyPass.hlsl, and LitMetaPass.hlsl, respectively. All four passes import from LitInput.hlsl.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><b>Forward Lit Pass: </b>The forward lit pass vertex shader is LitPassVertex and its fragment shader is LitPassFragment. These are defined in LitForwardPass.html, which imports from Lighting.hlsl. LitPassFragment calls InitializeStandardLitSurfaceData (defined in LitInput.hlsl), InitializeInputData (defined in LitForwardPass.hlsl), MixFog (defined in Core.hlsl), and LightweightFragmentPBR (defined in Lighting.hlsl).</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><b>Shadow Caster Pass: </b>The shadow caster pass vertex shader is ShadowPassVertex and its fragment shader is ShadowPassFragment. These are defined in ShadowCasterPass.hlsl, which imports from Core.hlsl and Shadows.hlsl. ShadowPassFragment calls SampleAlbedoAlpha and Alpha (defined in SurfaceInput.hlsl). The Alpha function contains a clip command; it looks like ShadowCasterPass uses BaseMap only to the extent that it provides alpha clipping. ShadowPassFragment returns 0, so it doesn't really do anything else interesting.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><b>Depth Only Pass: </b>The depth only pass vertex shader is DepthOnlyVertex, and its fragment shader is DepthOnlyFragment. These are defined in DepthOnlyPass.hlsl, which imports Core.hlsl. DepthOnlyFragment calls SampleAlbedoAlpha and Alpha, which are defined in SurfaceInput.hlsl. The Alpha contains a clip command; it looks like DepthOnlyPass uses BaseMap only to the extent that it provides alpha clipping. (This was the case with ShadowCasterPass). DepthOnlyFragment returns 0, so it doesn't really do anything else interesting.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><b>Meta Pass: </b>The meta pass vertex shader is LightweightVertexMeta, and its fragment shader is LightweightFragmentMeta. These are defined in LitMetaPass.hlsl, which imports MetaInput.hlsl. LightweightVertexMeta calls MetaVertexPosition, which is defined in MetaInput.hlsl. LightweightFragmentMeta calls MetaFragment (defined in MetaInput.hlsl), InitializeStandardLitSurfaceData (defined in LitInput.hlsl), and InitializeBRDFData (defined in Lighting.hlsl).</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">If unity_MetaFragmentControl.x is true, it returns a (possibly tweaked) albedo value. If unity_MetaFragmentControl.y is true, it returns an emission value. This is confusing because the comments at the top say "y = return normal" and I don't see where it's</span><br />
<span style="font-family: inherit;">computing or storing a normal.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<h2>
<span style="font-family: inherit;">Passes for Other LWRP Shaders</span></h2>
<span style="font-family: inherit;">SimpleLit.shader consists the same four passes: ForwardLit, ShadowCaster, DepthOnly, and Meta; they import SimpleLitForwardPass.hlsl, ShadowCasterPass.hlsl, DepthOnlyPass.hlsl, and SimpleLitMetaPass.hlsl, respectively. Note that the ShadowCaster and DepthOnly passes import the same hlsl files as the Lit shader, whereas the ForwardLit and Meta passes import hlsl files specialized for the SimpleLit shader. All four passes import from SimpleLitInput.hlsl instead of LitInput.hlsl. The SimpleLit specialized versions of files lack the additional fields and functions needed for a full PBR model. It invokes LightweightFragmentBlinnPhong (in Lighting.hlsl) instead of LightweightFragmentPBR, which is used by Lit.shader.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">BakedLit.shader only has three passes: BakedLit, DepthOnly, and Meta.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Unlit.shader only has three passes: Unlit, DepthOnly, and Meta.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">I won't explore BakedLit or Unlit shaders further here. I also won't explore the hey have even less functionality; I will not explore the ParticlesLit, ParticlesSimpleLit, ParticlesUnlit, or Terrain shaders.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<h2>
<span style="font-family: inherit;">Dynamic Vertex Modification</span></h2>
<span style="font-family: inherit;"><b>Forward Lit Pass:</b> You could insert your vertex, normal, and tangent modification code</span><br />
<span style="font-family: inherit;">just before these lines in LitVertexPass (in LitForwardPass.hlsl), modifying the</span><br />
<span style="font-family: inherit;">positionOS, normalOS, and tangentOS fields in the "input" Attributes structure as desired:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">VertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS, input.tangentOS);</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">VertexPositionInputs and VertexNormalInputs are defined in Core.hlsl as:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">struct VertexPositionInputs {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> float3 positionWS; // World space position</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> float3 positionVS; // View space position</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> float4 positionCS; // Homogeneous clip space position</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> float4 positionNDC;// Homogeneous normalized device coordinates</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">};</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">struct VertexNormalInputs {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> real3 tangentWS;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> real3 bitangentWS;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> float3 normalWS;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">};</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">The associated functions are defined as (note VertexNormalInputs is overloaded):</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">VertexPositionInputs GetVertexPositionInputs(float3 positionOS) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> VertexPositionInputs input;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> input.positionWS = TransformObjectToWorld(positionOS);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> input.positionVS = TransformWorldToView(input.positionWS);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> input.positionCS = TransformWorldToHClip(input.positionWS);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> float4 ndc = input.positionCS * 0.5f;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> input.positionNDC.xy = float2(ndc.x, ndc.y * _ProjectionParams.x) + ndc.w;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> input.positionNDC.zw = input.positionCS.zw;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return input;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">VertexNormalInputs GetVertexNormalInputs(float3 normalOS) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> VertexNormalInputs tbn;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> tbn.tangentWS = real3(1.0, 0.0, 0.0);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> tbn.bitangentWS = real3(0.0, 1.0, 0.0);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> tbn.normalWS = TransformObjectToWorldNormal(normalOS);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return tbn;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">VertexNormalInputs GetVertexNormalInputs(float3 normalOS, float4 tangentOS) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> VertexNormalInputs tbn;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> // mikkts space compliant. only normalize when extracting normal at frag.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> real sign = tangentOS.w * GetOddNegativeScale();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> tbn.normalWS = TransformObjectToWorldNormal(normalOS);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> tbn.tangentWS = TransformObjectToWorldDir(tangentOS.xyz);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> tbn.bitangentWS = cross(tbn.normalWS, tbn.tangentWS) * sign;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return tbn;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><b>Shadow Caster Pass: </b>There's two places you could insert your vertex and normal modification code. One possible hack would be to put your code at top of GetShadowPostionHClip (in ShadowCasterPass.hlsl), before the lines:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">float3 positionWS = TransformObjectToWorld(input.positionOS.xyz);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">float3 normalWS = TransformObjectToWorldNormal(input.normalOS);</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">A more elegant and clearer approach would be to modify the positionOS ad normalOS fields in the "input" Attributes structure just before this line in ShadowPassVertex:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">output.positionCS = GetShadowPositionHClip(input);</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><b>Depth Only Pass: </b>You could insert your vertex modification code in DepthOnlyVertex (in DepthOnlyPass.hlsl) just before the line</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">output.positionCS = TransformObjectToHClip(input.position.xyz);</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">For clarity, I'd probably write something like:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">float3 modifiedPosition = SomeModificationOf(input.position.xyz);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">output.positionCS = TransformObjectToHClip(modifiedPosition);</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">The stock depth only pass doesn't contain incorporate normals, which are often useful in creating interesting vertex deformations. Perhaps you could just add a "float3 normal : NORMAL;" line to the Attributes structure. I haven't tried this, though.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><b>Meta Pass: </b>You shouldn't need to touch the meta pass, since by definition meta passes are only invoked by the lightmapper, and hence are only useful on static geometry.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<h2>
<span style="font-family: inherit;">Dynamic Texture Coordinate Modification</span></h2>
<span style="font-family: inherit;"><b>Forward Lit Pass: </b>The best place to modify texture lookups will depend on your particular goals. LitPassFragment has the line:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">InitializeStandardLitSurfaceData(input.uv, surfaceData);</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">You could potentially modify the input.uv argument there, and that would more or less modify every texture lookup accordingly. For more fine-grained control, you could</span><br />
<span style="font-family: inherit;">modify InitializeStandardLitSurfaceData (in LitInput.hlsl), and modify the uv argument</span><br />
<span style="font-family: inherit;">inputs, as desired, in lines like:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">half4 albedoAlpha = SampleAlbedoAlpha(uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap));</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">half4 specGloss = SampleMetallicSpecGloss(uv, albedoAlpha.a);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">outSurfaceData.normalTS = SampleNormal(uv, TEXTURE2D_ARGS(_BumpMap, sampler_BumpMap), _BumpScale);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">outSurfaceData.occlusion = SampleOcclusion(uv);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">outSurfaceData.emission = SampleEmission(uv, _EmissionColor.rgb, TEXTURE2D_ARGS(_EmissionMap, sampler_EmissionMap));</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">SampleOcclusion and SampleMetallicSpecGloss are defined in LitInput.hlsl. SampleAlbedoAlpha, SampleNormal, and SampleEmission are defined in SurfaceInput.hlsl.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><b>Shadow Caster Pass and Depth Only Pass:</b> ShadowPassFragment (in ShadowCasterPass.html) and DepthOnlyFragment (in DepthOnlyPass.html) both the line:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Alpha(SampleAlbedoAlpha(input.uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap)).a, _BaseColor, _Cutoff);</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">You could modify the input.uv argument as desired. You would only need to do this if</span><br />
<span style="font-family: inherit;">you are using a clip test with the alpha channel and want to animate it.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><b>Meta Pass: </b>You shouldn't need to touch the meta pass, since by definition meta passes are only invoked by the lightmapper, and hence are only useful on static geometry.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<h2>
<span style="font-family: inherit;">Getting Ready to Customize the Lighting Model</span></h2>
<span style="font-family: inherit;">Basically, you'll need to make your own variation of LightweightFragmentPBR, and variations of the macros and functions is calls, if needed.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Make a new "Shader" folder inside your main Assets folder if you haven't done so already.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Via dragging and dropping, copy Packages/Lightweight RP/Shaders/Lit.shader into your new "Shader" folder. Rename your copy of Lit.shader and change the Shader "Lightweight Render Pipeline/Lit" line at the top of the file as desired; I changed it to MyLit.hlsl and Shader "My Custom/My Lit" -- but you can use whatever names you want.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Sadly, the copying will break a bunch of filename include references. Search on #include in MyLit.hlsl, and change the four instances of the lines #include "LitInput.hlsl" to</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">#include "Packages/com.unity.render-pipelines.lightweight/Shaders/LitInput.hlsl"</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Change the instance of #include "DepthOnlyPass.hlsl" to</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">#include "Packages/com.unity.render-pipelines.lightweight/Shaders/DepthOnlyPass.hlsl"</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Change the instance of #include "ShadowCasterPass.hlsl" to</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">#include "Packages/com.unity.render-pipelines.lightweight/Shaders/ShadowCasterPass.hlsl"</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Change the instance of #include "LitMetaPass.hlsl" to</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">#include "Packages/com.unity.render-pipelines.lightweight/Shaders/LitMetaPass.hlsl"</span><br />
<span style="font-family: inherit;"> </span><br />
<span style="font-family: inherit;">Via dragging and dropping, copy Packages/Lightweight RP/Shaders/LitForwardPass.hlsl into your new "Shader" folder. Rename your copy of LitForwardPass.hlsl. I changed it to MyLitForwardPass.hlsl -- but you can use whatever name you want.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">In MyLit.shader, change #include "LitForwardPass.hlsl" to #include "MyLitForwardPass.hlsl"</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">The above assumes that you're not doing any dynamic vertex modification. If you are, you'll need to create a custom MyDepthOnlyPass.hlsl and MyShadowCasterPass.hlsl and change the various #includes appropriately. The above also assumes you're not doing any dynamic texture modifications that includes alpha clip tests; these will also necessitate custom MyDepthOnlyPass.hlsl and MyShadowCasterPass.hlsl files.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">At this point, you should be able to take a material with the original LWRP Lit shader, switch it to your custom shader, and it should maintain all of its various textures and parameter settings and perform identically.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">There's a couple of minor tweaks you may want to make before doing some major shader hacking:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">1) To keep the vertex and fragment shader naming conventions consistent, in MyLit.shader, I'd recommend changing</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">#pragma vertex ShadowPassVertex</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#pragma fragment ShadowPassFragment</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">to something like</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">#pragma vertex MyShadowPassVertex</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#pragma fragment MyShadowPassFragment</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">2) If you want to modify the custom material inspector, make a new "Editor" folder inside your main Assets folder if you haven't done so already. Copy (via drag and drop) Packages/Lightweight RP/Editor/ShaderGUI/Shaders/LitShader.cs and Packages/Lightweight RP/Editor/ShaderGUI/ShadingModels/LitGUI.cs. Change the names of the files to MyLitShader.cs and MyLitGUI.cs (or whatever else you'd like).</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">In MyLitShader.cs and MyLitGUI.cs, change all the instances of LitGUI to MyLitGUI. In MyLitShader.cs, and LitShader in the class declaration to MyLitShader.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">At the bottom of MyLit.shader, change the CustomEditor line to read</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">CustomEditor "UnityEditor.Rendering.LWRP.ShaderGUI.MyLitShader"</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Coming up with a custom material inspector from scratch would be extremely painful, but it's not too taxing to make minor tweaks to an already working custom inspector.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<h2>
<span style="font-family: inherit;">Actually Customizing the Lighting Model</span></h2>
<span style="font-family: inherit;">I recommend leaving the original Lighting.hlsl file, as well as the files it includes, intact. You can copy structures, functions, macros, etc. from those files, paste them into your MyLitForwardPass.hlsl, change the names, and then make your modifications; it seems easiest to have everything in one spot. If you wind up developing a lot of different shaders that share various bits of custom lighting code, you might want to break those out into a separate MyLighting.hlsl include file, or something like that.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Digging into MyLitPassFragment in MyLitForwardPass.hlsl, you'll want to drill down into InitializeStandardLitSurfaceData (defined in LitInput.hlsl), InitializeInputData (defined in MyLitForwardPass.hlsl), MixFog (defined in Core.hlsl), and LightweightFragmentPBR (defined in Lighting.hlsl).</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">MixFog (defined in Core.hlsl) is a one-line function that calls MixFogColor. It interpolates between the color computed by the shader and unity_FogColor.rgb according to fogFactor and some defines (FOG_LINEAR, FOG_EXP, FOD_EXP2). If you want to inject more complicated fog models, this would be the place to do it; otherwise, you probably don't need to change this. (That all said: I can't figure out where to turn on fog in the LWRP anyway! I will save that for another day).</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">InitializeStandardLitSurfaceData reads from various textures to populate a SurfaceData structure. If you want dynamic texture coordinate modifications that are particular to each texture, this would be a good place to do it. If you want to apply the same texture coordinate modification to everything, you might want to do it in the call to InitializeStandardLitSurfaceData (in MyLitPassFragment) instead, and leave the InitializeStandardLitSurfaceData function itself alone.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">SurfaceData is defined in SurfaceInput.hlsl as:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">struct SurfaceData {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 albedo;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 specular;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half metallic;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half smoothness;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 normalTS;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 emission;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half occlusion;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half alpha;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">};</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">This definition is preceded has the comment "Must match Lightweight ShaderGraph master node." This is interesting, because it represents a connection point between the LWRP ShaderGraph framework and the primary hand-optimized, heavy-on-the-multicompile LWRP Lit shader. SurfaceData is quite reminiscent of the SurfaceOutput, SurfaceOutputStandard, and SurfaceOutputStandardSpecular structures of the Unity's old text-based Surface Shader system, which would make InitializeStandardLitSurfaceData analogous to the Surface Shader's surface functions.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">InitializeInputData populates an InputData structure (defined in Input.hlsl) containing various quantities needed for lighting calculations:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">struct InputData {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> float3 positionWS;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 normalWS;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 viewDirectionWS;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> float4 shadowCoord;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half fogCoord;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 vertexLighting;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 bakedGI;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">};</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<br />
<h3>
<span style="font-family: inherit;">LightweightFragmentPBR</span></h3>
<span style="font-family: inherit;">Now we're at the main guts of MyLitPassFragment, namely the call to LightweightFragmentPBR, which is found in lighting.hlsl. It first calls InitializeBRDFData (in Lighting.hlsl), which pre-computes a bunch of values and stores them </span><span style="font-family: inherit;">in a BRDFData struct:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">struct BRDFData </span><span style="font-family: "courier new" , "courier" , monospace;">{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 diffuse;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 specular;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half perceptualRoughness;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half roughness;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half roughness2;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half grazingTerm;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> // We save some light invariant BRDF terms so we don't have to recompute</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> // them in the light loop. Take a look at DirectBRDF function for detailed explaination.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half normalizationTerm; // roughness * 4.0 + 2.0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half roughness2MinusOne; // roughness² - 1.0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">};</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">InitializeBRDFData sets the grazingTerm to saturate(smoothness + reflectivity); I confess I have no idea where that comes from.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">The lighting calculation goes through four steps:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">1) It adds the effect of global illumination (via a call to GlobalIllumination, found in Lighting.hlsl) and the effect of the "main light" (via a call to LightingPhysicallyBased, also found in Lighting.hlsl). In the process, it calls MixRealTimeAndBakedGI, which calls SubtractDirectMainLightFromLightmap (both defined in Lighting.hlsl); this implements an interesting but really complicated hack that I'm not going to explore further here.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">2) It loops through the remaining lights, calling LightingPhysicallyBased on each one.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">3) Unity's LWRP and built-in pipeline have a fairly complicated light hierarchy, in which up to four "unimportant lights" can be calculated with per-vertex lighting. It adds the results of those unimportant lights via a vertexLighting field in the inputData structure. This is assigned by the line</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">inputData.vertexLighting = input.fogFactorAndVertexLight.yzw;</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">in InitializeInputData (found in MyLitForwardPass.hlsl).</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">fogFactorAndVertexLight, which is part of the Varying structure that connects the vertex shader and the fragment shader through interpolation, is assigned in MyLitPassVertex, which calls VertexLighting, which in turn calls LightingLambert (both are defined in Lighting.hlsl).</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">4) It adds the emissive color.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<h3>
<span style="font-family: inherit;">Global Illumination</span></h3>
<span style="font-family: inherit;">The GlobalIlumination function is short enough that I'll include the code here:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">half3 GlobalIllumination(BRDFData brdfData, half3 bakedGI, half occlusion, half3 normalWS, half3 viewDirectionWS) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 reflectVector = reflect(-viewDirectionWS, normalWS);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half fresnelTerm = Pow4(1.0 - saturate(dot(normalWS, viewDirectionWS)));</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> half3 indirectDiffuse = bakedGI * occlusion;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 indirectSpecular = GlossyEnvironmentReflection(reflectVector, brdfData.perceptualRoughness, occlusion);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> return EnvironmentBRDF(brdfData, indirectDiffuse, indirectSpecular, fresnelTerm);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Here, the fresnelTerm uses dot(normalWS, viewDirectionWS), which is what is customary for indirect light, in contrast with direct light, which dot products the half vector with the view vector, or equivalently, the half vector with the light vector.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">GlobalIllumination is called from this line in LightweightFragmentPBR (in Lighting.hlsl):</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">half3 color = GlobalIllumination(brdfData, inputData.bakedGI, occlusion, inputData.normalWS, inputData.viewDirectionWS);</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">In InitializeInputData (in MyLitForwardPass.hlsl), we find the line:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">inputData.bakedGI = SAMPLE_GI(input.lightmapUV, input.vertexSH, inputData.normalWS);</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">SAMPLE_GI is a macro that invokes SampleLightmap on objects with lightmaps and SampleSHPixel (for spherical harmonic lighting) on objects without lightmaps.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">GlossyEnvironmentReflection does a lookup into a cube map, choosing a mip level appropriate with to the roughness.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">EnvironmentBRDF is short enough that I will include it here:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">half3 EnvironmentBRDF(BRDFData brdfData, half3 indirectDiffuse, half3 indirectSpecular, half fresnelTerm) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 c = indirectDiffuse * brdfData.diffuse;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> float surfaceReduction = 1.0 / (brdfData.roughness2 + 1.0);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> c += surfaceReduction * indirectSpecular * lerp(brdfData.specular, brdfData.grazingTerm, fresnelTerm);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return c;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">I have no idea where the surfaceReduction term comes from.</span><br />
<span style="font-family: inherit;"><br /></span>
<h3>
<span style="font-family: inherit;">Direct Illumination</span></h3>
<span style="font-family: inherit;">LightingPhysicallyBased (in Lighting.hlsl) has two overloaded variations:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">half3 LightingPhysicallyBased(BRDFData brdfData, half3 lightColor, half3 lightDirectionWS, half lightAttenuation, half3 normalWS, half3 viewDirectionWS) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half NdotL = saturate(dot(normalWS, lightDirectionWS));</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> half3 radiance = lightColor * (lightAttenuation * NdotL);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return DirectBDRF(brdfData, normalWS, lightDirectionWS, viewDirectionWS) * radiance;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">half3 LightingPhysicallyBased(BRDFData brdfData, Light light, half3 normalWS, half3 viewDirectionWS) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return LightingPhysicallyBased(brdfData, light.color, light.direction, light.distanceAttenuation * light.shadowAttenuation, normalWS, viewDirectionWS);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">It looks like most of the work is done in the curiously misspelled DirectBDRF (it should be DirectBRDF), which implements an approximate Cook-Torrance model.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<h2>
<span style="font-family: inherit;">Where to Start Putting In a Custom Lighting Model</span></h2>
<span style="font-family: inherit;">LightingPhysicallyBased handles direct lights; that's the easiest place to put in modified diffuse models (Oren-Nayer, Minnaert, Disney Diffuse, etc.), modified specular models, or completely weird lighting models. A good exercise would be to replace the optimized-for-mobile LWRP Lit model and replace it with as much as you can of the HDRP Lit model.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Weird lighting models are less likely to make sense with any of the global illumination facilities like lightmaps, reflection probes, and light probes. But it's possible that you could partially incorporate modified diffuse and modified specular models. Unity's lightmappers are largely black boxes, so it would be difficult to calculate lightmaps under anything except for the usual Lambertian light assumption. Similarly, Unity computes the convolved mipmaps for reflection probes using its particular specular BDRF assumptions. One could potentially explore ImageBasedLighting.hlsl and try creating convolved mipmaps for other functions, but I except that it would be a ton of work, and few people would be able to tell the difference for most conventional specular models. </span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">One could try replacing the use of the spherical harmonic light probes with reflection probes with mipmaps crafted for diffuse lighting instead of specular lighting. If you set Texture Shape in the texture inspector to Cube, a Convolute Type dropdown menu appears with the options Specular (Glossy Reflections) and Diffuse (Irradiance). The Diffuse option results in much more blurring per mipmap level, as expected. Interestingly, that option doesn't seem to be used anywhere in stock Unity.</span>Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com1tag:blogger.com,1999:blog-3182418827140543846.post-82581023967948910792019-01-21T01:21:00.001-08:002019-01-21T01:40:25.387-08:00Running CodeWarrior for Playstation Net Yaroze via SheepShaverThe <a href="https://www.vice.com/en_us/article/mvxbky/doing-it-together-remembering-playstations-net-yaroze-console-935">Net Yaroze</a> was a special version of the original Sony Playstation that let consumers write their own games. To prevent <a href="https://www.gamasutra.com/view/feature/169245/15_years_later_how_sonys_net_.php?print=1">Net Yaroze</a> games from competing with official Playstation releases created by licensed companies with professional development kits, a <a href="https://www.eurogamer.net/articles/2013-07-16-the-story-of-yaroze-sonys-first-indie-push">Net Yaroze</a> game couldn't access the CD drive, and it could <i>usually</i> only be played by people who had a <a href="https://killscreen.com/articles/glory-net-yaroze-game-creators-there">Net Yaroze</a> system. (Occasionally, Sony would put <a href="http://www.breck-mckye.com/blog/2016/11/net-yaroze">Net Yaroze</a> games on demo CDs that came with magazines).<br />
<br />
I bought a Net Yaroze system from eBay over decade ago, and in that time have been looking for students that would be interested in experimenting with it, with no success. Now, a decade later, I finally found some students on my <a href="http://www.vip.gatech.edu/teams/retrofuturistic-hardware-music-gaming-and-computing">Retrofuturistic Hardware</a> <a href="http://consortium.vip.gatech.edu/">Vertically Integrated Project</a> (VIP) team interested in taking it on. Before handing it off, I thought I'd take a crack at getting the development environment running.<br />
<br />
My Net Yaroze came with a CD labeled "Metrowerks Codewarrior for Net Yaroze," containing both Windows and Mac versions. I can't seem to find that particular CD at the moment, but I believe it corresponds to <a href="https://assemblergames.com/threads/metrowerks-codewarrior-for-net-yaroze-r2.38162/">this disk image</a>. It came out in 1996, which puts in in the zone of Windows 95 and Classic Mac OS System 7. As expected, the installer programs didn't seem to want run on my Windows 10 desktop machine from 2014 or my Mac OS X laptop from 2015.<br />
<br />
<a href="https://sheepshaver.cebix.net/">SheepShaver</a> emulates PowerPC-based Macintoshes. I presumed that Mac software that works on System 7 will likely work on System 9, so I installed System 9. <a href="https://www.youtube.com/watch?v=XQAf7GII9NY">This video by AlexElectronics</a> was particularly helpful in getting SheepShaver up and running. I went with the "New World PPC ROM" and the "Mac OS 9 Boot Image" available from <a href="https://www.redundantrobot.com/index.html">this page by Redundant Robot</a>.<br />
<br />
Click on the images to see the full-size screenshots. We're up and running:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGS2q8-okuRDz9_76M5syUoCZfeoUlfK3Qk5k3fvvjqYy1KzGEenn8zF_pCSk8Hwj1tIq199ROfvD4Pph-x-gdPFyVBIx_NqwvrxZFR3fPoJDH6UESJbxaYbIFWeNLyL4xRpImsq1EUAVW/s1600/first_ny_macos9_ready.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1004" data-original-width="1280" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGS2q8-okuRDz9_76M5syUoCZfeoUlfK3Qk5k3fvvjqYy1KzGEenn8zF_pCSk8Hwj1tIq199ROfvD4Pph-x-gdPFyVBIx_NqwvrxZFR3fPoJDH6UESJbxaYbIFWeNLyL4xRpImsq1EUAVW/s400/first_ny_macos9_ready.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Let's first install Adobe Acrobat Reader, which is conveniently available on the install CD:</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkPD7v-HMo1Z1zU6WCSLBhJ8pMk9Gyhh0c2AczX8Pg-d7_vOXEBtw0fVj6rfIKW2bWNPXqbJO-Lusm0GvRnscc3K1cfWprFanvLYCOWACoUVNrgop0Lx7oyGcQA7QExWpXNyQpYLZ9dMLD/s1600/ny_acrobat8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="682" data-original-width="1600" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkPD7v-HMo1Z1zU6WCSLBhJ8pMk9Gyhh0c2AczX8Pg-d7_vOXEBtw0fVj6rfIKW2bWNPXqbJO-Lusm0GvRnscc3K1cfWprFanvLYCOWACoUVNrgop0Lx7oyGcQA7QExWpXNyQpYLZ9dMLD/s400/ny_acrobat8.png" width="400" /></a></div>
<span id="goog_987170171"></span><span id="goog_987170172"></span><br />
Now let's run the installer!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmCtDCUGqtDIYy5JF80TMlflTx4vdx9gSekr-hyBPlnceIbQiuQM7ec3NGijzfByKevbNE7HI_Gc4_yrgTe5ujAzTZphjE62C79dbOnvg74eM8ah7JfhFd7wxdN1eqnW5ypM4CVT-ur8Vm/s1600/ny_codewarrior_installer2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1004" data-original-width="1280" height="311" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmCtDCUGqtDIYy5JF80TMlflTx4vdx9gSekr-hyBPlnceIbQiuQM7ec3NGijzfByKevbNE7HI_Gc4_yrgTe5ujAzTZphjE62C79dbOnvg74eM8ah7JfhFd7wxdN1eqnW5ypM4CVT-ur8Vm/s400/ny_codewarrior_installer2.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij-TXTCjFQMfbblPpDQD5BA0FMkEwQy4ydFJuN-G5yG6TT-1BpX4oLHVG_9eW7JTxuwSni68KouwADYtK2UXeO7H5dTIY2K1GiaxL61VHr-hdn2d0ZXTab_lkVoFLq7So8YPcpNousfC75/s1600/ny_welcome3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1004" data-original-width="1280" height="311" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij-TXTCjFQMfbblPpDQD5BA0FMkEwQy4ydFJuN-G5yG6TT-1BpX4oLHVG_9eW7JTxuwSni68KouwADYtK2UXeO7H5dTIY2K1GiaxL61VHr-hdn2d0ZXTab_lkVoFLq7So8YPcpNousfC75/s400/ny_welcome3.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6AsNYBAdLd-CHnjzhVk-Li1rGyy8zw_uG68M7Mtgu6LnlasPOvxu0EHGUBcsBJ3zYltm-DINozLYXrTypcTIeaGPEXliIwC6u1nwpF276RiAbK25TzPcfekPlmB9KnGMcfeO9ppFzwwsa/s1600/ny_choose_install5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1004" data-original-width="1280" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6AsNYBAdLd-CHnjzhVk-Li1rGyy8zw_uG68M7Mtgu6LnlasPOvxu0EHGUBcsBJ3zYltm-DINozLYXrTypcTIeaGPEXliIwC6u1nwpF276RiAbK25TzPcfekPlmB9KnGMcfeO9ppFzwwsa/s400/ny_choose_install5.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7Ldx24679FqoPiXAuyg5YUVWTkm3CEjRY13nzanM_tCe42wjzUuBZ3GNvkkffxJibrVYEG2m98Dy_7gQCUN9fqRO3a3m_OIdiLuup_NleB_SfFQ1L5fW7A3SWiw8eCwRRIZsu8MNNkmxy/s1600/ny_success6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1004" data-original-width="1280" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7Ldx24679FqoPiXAuyg5YUVWTkm3CEjRY13nzanM_tCe42wjzUuBZ3GNvkkffxJibrVYEG2m98Dy_7gQCUN9fqRO3a3m_OIdiLuup_NleB_SfFQ1L5fW7A3SWiw8eCwRRIZsu8MNNkmxy/s400/ny_success6.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
OK, let's run CodeWarrior:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6zi8VyFn4exUtKl7EA_gDrbvcFVeE1jHf9NMR_22hEVrqymW9ZaOfmHfrRlcNP1zhsZG7YtcWjCEMGjuI6BrIeZle47ae4iyfdRGt7DWk-TU76L4KRalU_rVNbwjoY-r5RYjyJAF37nTz/s1600/ny_codewarrior_logo7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1004" data-original-width="1280" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6zi8VyFn4exUtKl7EA_gDrbvcFVeE1jHf9NMR_22hEVrqymW9ZaOfmHfrRlcNP1zhsZG7YtcWjCEMGjuI6BrIeZle47ae4iyfdRGt7DWk-TU76L4KRalU_rVNbwjoY-r5RYjyJAF37nTz/s400/ny_codewarrior_logo7.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Let's try to compile this Hello World program:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg37FnOSPqZBjk79aucF3gpZb5FxPIZ6JFMl8iyB5np4ZCYDXzwgZoOiTmeOOPd_fcjuD2v2USOR1Ehrz8CoZNUa39Zi0JD3n7UJuR5Lj_mEqF2VWm1BRXoPLKaGz-UJZ7Co6tWQlLnF3nj/s1600/ny_hello_world10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1235" data-original-width="1600" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg37FnOSPqZBjk79aucF3gpZb5FxPIZ6JFMl8iyB5np4ZCYDXzwgZoOiTmeOOPd_fcjuD2v2USOR1Ehrz8CoZNUa39Zi0JD3n7UJuR5Lj_mEqF2VWm1BRXoPLKaGz-UJZ7Co6tWQlLnF3nj/s400/ny_hello_world10.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZQ5eAFhVAMh4n3X-2HCHG2gs4d4c9kMmY4wkPWZpQ_ZZoB7QG6Ip73hHWZUXHtbNvWKsYJvtuMoDi0JGiOYk4KFWMpwIUMY-hjhoAEpoVWSf8moRZltE5QHhu2TCG8THsF4E9hyphenhyphenWm0n28/s1600/ny_cannot_be_opened11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="704" data-original-width="952" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZQ5eAFhVAMh4n3X-2HCHG2gs4d4c9kMmY4wkPWZpQ_ZZoB7QG6Ip73hHWZUXHtbNvWKsYJvtuMoDi0JGiOYk4KFWMpwIUMY-hjhoAEpoVWSf8moRZltE5QHhu2TCG8THsF4E9hyphenhyphenWm0n28/s400/ny_cannot_be_opened11.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
We got some errors, but I'll save looking into those for another day.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
At this point, I noticed there were folders on the CD labeled "Unsupported Software" and "Misc Goodies" that weren't copied over as part of the installation procedure, so I copied those over manually.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXpCgsen2E_zDTmQ3urI1MH-ijl1Qb0UYkdlFaxhX-Y27PJ4oC0JTxowBplvMmKXgDf2Qnj3hj7ZM-lW1PZrTJmbYl50xplG1MOxehIRvqiEBLe-l9oylCn7OctGou37zcaW6iygvkJM7z/s1600/ny_additional_goodies12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="926" data-original-width="1388" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXpCgsen2E_zDTmQ3urI1MH-ijl1Qb0UYkdlFaxhX-Y27PJ4oC0JTxowBplvMmKXgDf2Qnj3hj7ZM-lW1PZrTJmbYl50xplG1MOxehIRvqiEBLe-l9oylCn7OctGou37zcaW6iygvkJM7z/s400/ny_additional_goodies12.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I didn't have the Net Yaroze on me at the time of doing these experiments, but I thought it would be fun to try running PSComUtil, the app that connects to the Net Yaroze.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzhH-5poE7Qf3-eJpFWaG4itajTjN2UBENuVq6jDSzsfssfqSgHKb8k_O1XnHSsMgKK7glLToy2qDpPIj98egklN7EQs26MQ87CaAIC6OIpQ21pAzKq9hJ3ihi1T05QZ5csHfQ-af2XATs/s1600/ny_pscomutil13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1235" data-original-width="1600" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzhH-5poE7Qf3-eJpFWaG4itajTjN2UBENuVq6jDSzsfssfqSgHKb8k_O1XnHSsMgKK7glLToy2qDpPIj98egklN7EQs26MQ87CaAIC6OIpQ21pAzKq9hJ3ihi1T05QZ5csHfQ-af2XATs/s400/ny_pscomutil13.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBgXnxa_oo0ha7B6gJBAmvlSVQD_IyB3zPkA5fmw_6ba62jTDnkBwTMeYGXQe84vwKRpjib2vqrLXwCcMXHGZDgL0jtE0MIo1JL1ALFwpZ_fnIygHHMhU8wnv652dy6hnLHSvC1ClR_pCr/s1600/ny_connection_failed14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="895" data-original-width="1282" height="278" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBgXnxa_oo0ha7B6gJBAmvlSVQD_IyB3zPkA5fmw_6ba62jTDnkBwTMeYGXQe84vwKRpjib2vqrLXwCcMXHGZDgL0jtE0MIo1JL1ALFwpZ_fnIygHHMhU8wnv652dy6hnLHSvC1ClR_pCr/s400/ny_connection_failed14.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Unsurprisingly, I got some errors.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Net Yaroze connects to its host computer via a DB9 RS232 serial port, so to even try to connect my 2015 MacBook Pro would require a USB-to-RS232 adapter. I'm also not sure too what extent SheepShaver supports serial communication through such an adapter.</div>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com0tag:blogger.com,1999:blog-3182418827140543846.post-23316008444545052592018-01-05T22:11:00.003-08:002018-01-05T22:27:35.283-08:00Fix your car's AC with 3 zip ties and save $900<div>
Last summer, it seemed like the AC in my 2003 Nissan Sentra stopped working. I would turn up the fan, and I would hear the fan become louder, but air no additional air (of any temperature) came out. Atlanta in the Summer without AC is a markedly unpleasant experience. For a while I just rolled the windows down, but that has limited utility once July rolls around. </div>
<div>
<br /></div>
<div>
I took my car in for repair. I had thought that maybe a hose had come loose and the CA (conditioned air, being the thing created by the air conditioning) was being dumped into the engine compartment, and hoped that would be a relatively inexpensive fix. The Nissan folks told me that the entire HVAC "computer unit" would need replaced, for a cost of $900. They then came back and said that they couldn't do the repair anyway since they couldn't order the part from Nissan, who had discontinued manufacturing that unit. They told me that if I managed to acquire such a unit, they could install it and just charge me for the install.</div>
<div>
<br /></div>
<div>
While I was looking at eBay and other sources to see how cheaply I could acquire the unit, I noticed that air was coming out of the defrost vents -- cold air, if I had the AC on. I realized that the core AC and fan components were working fine, but the knob that controls where the air comes out had stopped functioning and stuck on defrost regardless of where the knob was set. A bit of web searching discovered that this was not an uncommon problem, so I dived in. </div>
<div>
<br /></div>
<div>
Alas, the lighting conditions for these photographs were suboptimal; I had to perform the procedure at night so I wouldn't be sweltering.<br />
<br />
First, snap off the big plastic bit that covers the lower control panels:</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhng_q6Gkic-XBv2H1Rm6RDy2L26kAKRFgIKe8HiWnFRgED6nyWf_KWPPticiE0uW-X3v7HpKFitW1OH_uKINDhTWHoxaTXGhjkwaxzdJ-bEkDRorsxqF5LzcXLk4IklWBHzTXqDfNaufit/s1600/car_ac_1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="136" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhng_q6Gkic-XBv2H1Rm6RDy2L26kAKRFgIKe8HiWnFRgED6nyWf_KWPPticiE0uW-X3v7HpKFitW1OH_uKINDhTWHoxaTXGhjkwaxzdJ-bEkDRorsxqF5LzcXLk4IklWBHzTXqDfNaufit/s200/car_ac_1.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
Second, you need to remove two screws to remove the HVAC's bezel:<br />
<br />
<table><tbody>
<tr><td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH_d2tbTmFoilUfdRP0Xt09FFhNRiHXBj2IFvfFa0UiPs4FSqsC_f7euF4pQFMwU6OibpRJSxoH_2B9Vcu7yLIsLHXayBMxhrMaFeodKM_4b3awjGfEKHrBx0JTePYx05_oLLF9YZn6pr2/s1600/car_ac_2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="122" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH_d2tbTmFoilUfdRP0Xt09FFhNRiHXBj2IFvfFa0UiPs4FSqsC_f7euF4pQFMwU6OibpRJSxoH_2B9Vcu7yLIsLHXayBMxhrMaFeodKM_4b3awjGfEKHrBx0JTePYx05_oLLF9YZn6pr2/s200/car_ac_2.jpg" width="200" /></a><br />
<br />
<br /></td><td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSaoEvrnhmnGscebCHnwafb9yMj28e9OBAYEkw3VC7OsUBR3e5u_yDrUQVRdLYWY5KOYwa5SbMCUKij4M53rMapovqkMxidjusCwju-IvMWbWIzJNhXJRxBsTwAVVGqsgZPsnuoYQRo7pa/s1600/car_ac_3.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSaoEvrnhmnGscebCHnwafb9yMj28e9OBAYEkw3VC7OsUBR3e5u_yDrUQVRdLYWY5KOYwa5SbMCUKij4M53rMapovqkMxidjusCwju-IvMWbWIzJNhXJRxBsTwAVVGqsgZPsnuoYQRo7pa/s200/car_ac_3.jpg" width="200" /></a></td><td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicQbHhMAi2NuLqAMHt6uyD1VTPdPd2PYE4eq3jyqusz4rVOcga6-N1HVKr2rTGAlpRDSQz1bOAFp6solHHAS3dOfFavS8qAgB3czfN2XdePJKR3UwnOe7r9fDaZugBS_PmMJw044NDe6Du/s1600/car_ac_4.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicQbHhMAi2NuLqAMHt6uyD1VTPdPd2PYE4eq3jyqusz4rVOcga6-N1HVKr2rTGAlpRDSQz1bOAFp6solHHAS3dOfFavS8qAgB3czfN2XdePJKR3UwnOe7r9fDaZugBS_PmMJw044NDe6Du/s200/car_ac_4.jpg" width="200" /></a></td></tr>
</tbody></table>
<div>
Third, you need to remove the plastic covering the middle vents:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuOv3B0-BnsN1QuL2mU_hcfPGt-7_PudD4EoM5tS5ikKUZ0Gay_1PHQM47aP0xRS24T08melSBQPlTKDGLI1zWwnBU-50GAFw8YOIYl1u8UQSRwrSsKV5EG8YtSAGCFhFJs4FXkBy2j9RR/s1600/car_ac_5.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="157" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuOv3B0-BnsN1QuL2mU_hcfPGt-7_PudD4EoM5tS5ikKUZ0Gay_1PHQM47aP0xRS24T08melSBQPlTKDGLI1zWwnBU-50GAFw8YOIYl1u8UQSRwrSsKV5EG8YtSAGCFhFJs4FXkBy2j9RR/s200/car_ac_5.jpg" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Vwno_G8uCTyH3Qn1UrZ_4JoJzwEwVAF739HYXxzfdcN4RbJopHtY8hY3-SU8qxYM2ChpxedM1okoq5YdnZQedsF6X0ggFhq6A0bZAHLkNR0lWLa_ftBEzhA89gyTyoSYrQmoRiK34Q27/s1600/car_ac_6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Vwno_G8uCTyH3Qn1UrZ_4JoJzwEwVAF739HYXxzfdcN4RbJopHtY8hY3-SU8qxYM2ChpxedM1okoq5YdnZQedsF6X0ggFhq6A0bZAHLkNR0lWLa_ftBEzhA89gyTyoSYrQmoRiK34Q27/s200/car_ac_6.jpg" width="200" /></a></div>
<br />
<br />
<br />
I had to unplug the radio to be able to maneuver:<br />
<table style="-webkit-text-stroke-width: 0px; font-family: -webkit-standard; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><tbody>
<tr><td><div style="margin: 0px;">
</div>
<div style="margin: 0px;">
<br /></div>
<div style="margin: 0px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIwwA0RnxxSJP7DJkIrjvrgoy0_Uoc3jzj43uuS3mCEyAHHNaaeWQEqRhIFeUuxuJtOF8D7m7JVDJLlD0sx5xm0X2k1qkDRSQE8T9TkWt7phG2fLmV24EDMWbtAjkcaW6eGxnxO0mtmMDa/s1600/car_ac_7.jpg" imageanchor="1"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIwwA0RnxxSJP7DJkIrjvrgoy0_Uoc3jzj43uuS3mCEyAHHNaaeWQEqRhIFeUuxuJtOF8D7m7JVDJLlD0sx5xm0X2k1qkDRSQE8T9TkWt7phG2fLmV24EDMWbtAjkcaW6eGxnxO0mtmMDa/s200/car_ac_7.jpg" width="200" /></a></div>
<div style="margin: 0px;">
<br /></div>
<div style="margin: 0px;">
<br /></div>
</td><td><div style="margin: 0px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSaoEvrnhmnGscebCHnwafb9yMj28e9OBAYEkw3VC7OsUBR3e5u_yDrUQVRdLYWY5KOYwa5SbMCUKij4M53rMapovqkMxidjusCwju-IvMWbWIzJNhXJRxBsTwAVVGqsgZPsnuoYQRo7pa/s1600/car_ac_3.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-wz1X_7nfbWH5y2d0J76bnvHheth9-xm5u2X4adN131xAyhbz6z-ZEAByP6EvmD4YAyCJAlLvaPkhF9DKr_bk1sEztlBnNShIzBHHKNvbbwiD12K502qEoi05Uzivxo_CjwhpbPoT_X1U/s1600/car_ac_8.jpg" imageanchor="1"><img border="0" height="111" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-wz1X_7nfbWH5y2d0J76bnvHheth9-xm5u2X4adN131xAyhbz6z-ZEAByP6EvmD4YAyCJAlLvaPkhF9DKr_bk1sEztlBnNShIzBHHKNvbbwiD12K502qEoi05Uzivxo_CjwhpbPoT_X1U/s200/car_ac_8.jpg" width="200" /></a></div>
</td><td><div style="margin: 0px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicQbHhMAi2NuLqAMHt6uyD1VTPdPd2PYE4eq3jyqusz4rVOcga6-N1HVKr2rTGAlpRDSQz1bOAFp6solHHAS3dOfFavS8qAgB3czfN2XdePJKR3UwnOe7r9fDaZugBS_PmMJw044NDe6Du/s1600/car_ac_4.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFvy2qi5tWKoUEzQlHTiYtQGlqnfOttRRVfu1-8vV9z5jHLXIdv75DkU6aVrmv3ToIaGaaj_LLRfON0ijCPXSNpOvoFCx6HpFsC6W1xINQnpmnZjAq2YGXxb8_Qg3ICrPaQ8UAEt89FwPr/s1600/car_ac_9.jpg" imageanchor="1"><img border="0" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFvy2qi5tWKoUEzQlHTiYtQGlqnfOttRRVfu1-8vV9z5jHLXIdv75DkU6aVrmv3ToIaGaaj_LLRfON0ijCPXSNpOvoFCx6HpFsC6W1xINQnpmnZjAq2YGXxb8_Qg3ICrPaQ8UAEt89FwPr/s200/car_ac_9.jpg" width="200" /></a></div>
</td></tr>
</tbody></table>
</div>
<div>
Now we can see the culprit. The rear of the vent selector knob is the big chunk of white plastic, with a metal rod that slides in and out of the black sheath with the shiny end. In the defrost setting, the big chunk of white plastic moves far enough to activate the microswitch on the lower right of the photo. There's supposed to be a clip that holds the shiny end of the black sheath in place. You can see it's broken off, with the result that turning the knob makes the metal rod push and pull the black sheath instead of sliding in and out of it, so the actual setting stays the same:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9MSRisoB1u0wQzTu5Q5lPNTB-EcmUBFZ-1UKSBIdOAQtyKRoFh18uCXkY4AaQ17GfPAUBrRxWHbXfSwuuDDgyWYDQJB3CcUCB0UtnJLY9zqatCG-nRfndVN6CQ3EdICCNETTbsP4zKU3S/s1600/car_ac_10.jpg" imageanchor="1"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9MSRisoB1u0wQzTu5Q5lPNTB-EcmUBFZ-1UKSBIdOAQtyKRoFh18uCXkY4AaQ17GfPAUBrRxWHbXfSwuuDDgyWYDQJB3CcUCB0UtnJLY9zqatCG-nRfndVN6CQ3EdICCNETTbsP4zKU3S/s320/car_ac_10.jpg" width="320" /></a><br />
<br />
I used three zip ties and some epoxy/glue/sticky-something (I don't remember exactly what) to keep the shiny end in its place:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPxHzVgjS4W9PaMNWk2DjPn7WukneEgU7OoC3lFyNlMAJF6LkUC9huK5_i8MSFh6ape9m5rdvSVVkhQQctmevXHsgp8THr-pMV7hIMKj-nVtTOCdeluPjKLUvAe0v96CJeVXCeKWVE2R_D/s1600/car_ac_11.jpg" imageanchor="1"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPxHzVgjS4W9PaMNWk2DjPn7WukneEgU7OoC3lFyNlMAJF6LkUC9huK5_i8MSFh6ape9m5rdvSVVkhQQctmevXHsgp8THr-pMV7hIMKj-nVtTOCdeluPjKLUvAe0v96CJeVXCeKWVE2R_D/s320/car_ac_11.jpg" width="320" /></a> </div>
<div>
<br />
Unfortunately, at some point in this process I accidentally broke the clip that holds the corresponding black sheath for the temperature setting in place:<br />
<br />
<img border="0" height="311" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJBQPaZ2f95h4TqBKgRdA4_8-R56F6xQ2XoMztC0l1bRsWYv6jWJHVSnYvqEFSGS4RfR2yg0wjSbXtrH90rk9vTCWRm24T4qq0YTrfuIqiC89j4PbvpKl2uK5RuVLNVEF5jI0XdvXCK7kq/s320/car_ac_12.jpg" width="320" /><br />
<br />
The clip was still in place, it just wasn't snapped on all the way, so I was able to use the temperature control as normal for about six months -- I just tried to avoid turning it unless I absolutely had to, and I turned it slowly when I did. It finally broke a couple days ago and is now stuck on the full heat setting. Luckily this isn't too terrible since it's freezing out and I generally want the heat on anyway, but when Spring comes around I'll need to dig back in there again and fix it.<br />
<br />
There was another problem. When I plugged the radio back in and started to screw it back into place, I got disturbing sparks between the radio chassis and the car chassis. (Yes, I should have disconnected the car battery before beginning my expedition). I got out my multimeter and measured an 8 volt difference between the radio chassis and the car chassis. Needless to say, this was a BAD THING. The rest of the car appeared to be in working order, so I presumed the fault was in the radio. It had been working fine that day; I have no idea what went wrong. I took this opportunity to replace the radio (whose CD player had died years ago) with an aftermarket radio with an aux input jack and USB and SD card readers that I got from Fry's on clearance for around $8 -- but that is the topic for another blog post.<br />
<br />
Here is the radio that bit the dust:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl90a0jsOtqzvHiA_wUPoVo8QIEVC7PPEe5G1H8Et6X1lpVbUZDnfbIDNDuv3oqLkYM4Pr_2fwtIj5ftDYlYO9x-N0HjrFLA6xBxrBetHIOfyJUQQ6Csr2uNwA-arofwaQQTnPWLn_EGkr/s1600/car_ac_radio.jpg" imageanchor="1"><img border="0" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl90a0jsOtqzvHiA_wUPoVo8QIEVC7PPEe5G1H8Et6X1lpVbUZDnfbIDNDuv3oqLkYM4Pr_2fwtIj5ftDYlYO9x-N0HjrFLA6xBxrBetHIOfyJUQQ6Csr2uNwA-arofwaQQTnPWLn_EGkr/s320/car_ac_radio.jpg" width="320" /></a></div>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com1tag:blogger.com,1999:blog-3182418827140543846.post-73431551695345428022017-09-17T22:05:00.003-07:002017-09-17T22:22:29.481-07:00Running Energia on Mac OS X<a href="http://energia.nu/">Energia</a> is a programming environment for the Texas Instruments <a href="http://www.ti.com/lsds/ti/tools-software/launchpads/faq/faq.page">LaunchPads</a>, based on the <a href="http://wiring.org.co/">Wiring</a> and <a href="https://www.arduino.cc/">Arduino</a> frameworks. It took a bit of effort to get it working on my Mac. I'm running OS X 10.11.6, <a href="https://support.apple.com/en-us/HT206886">El Capitan</a>; hopefully these instructions will work for the more recent OS X 10.12, <a href="https://support.apple.com/en-us/HT201475">Sierra</a>.<br />
<br />
1) The most obvious thing is to go to <a href="http://energia.nu/guide/guide_macosx">energia.nu/guide/guide_macosx</a> instead of the windows page.<br />
<div>
<br /></div>
2) After starting <b>Energia</b>, go to the <b>Tools -> Board -> Board Manager</b> menu item and choose your target board. You should see a list of boards. For instance, you can choose<br />
<br />
Energia MSP432 boards by Energia<br />
Boards included in this package:<br />
MSP_EXP432P401R<br />
<br />
Clink Install for the entry corresponding to your target board. (I believe the entry listed above is for the black MSP432 Launchpad. If you have a red board, you should probably install the "MSP432 EMT Red boards" instead -- just a guess.)<br />
<br />
3) Now quit Energia, since we'll need to implement an annoying workaround. When I first tried compiling a program, I got a dialog box with this error:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">To use the "java" command-line tool you need to install a JDK.</span><br />
<br />
Some discussion about this error may be found <a href="http://anas.pk/2015/09/02/solution-no-java-runtime-present-mac-yosemite">here</a>. After doing a lot of google searching and hitting my head against the table a lot, I came up with a somewhat annoying but not utterly dreadful workaround.<br />
<br />
If you open up a Terminal and type <span style="font-family: "courier new" , "courier" , monospace;">which java</span>, it will tell you: <span style="font-family: "courier new" , "courier" , monospace;">/usr/bin/java</span><br />
<br />
If you type <span style="font-family: "courier new" , "courier" , monospace;">java -version</span>, it will tell you: <span style="font-family: "courier new" , "courier" , monospace;">No Java runtime present, requesting install.</span><br />
<br />
Based on <a href="http://anas.pk/2015/09/02/solution-no-java-runtime-present-mac-yosemite">this webpage</a>, I discovered <span style="font-family: "courier new" , "courier" , monospace;">/usr/bin/java</span> is a link to<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java</span><br />
<br />
Instead, it should be a link to<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "courier new" , "courier" , monospace;">/Library/Internet Plug-Ins/JavaAppletPlugin.p</span><span style="font-family: "courier new" , "courier" , monospace;">lugin/Con</span><span style="font-family: "courier new" , "courier" , monospace;">tents/Home/bin/java</span></span><br />
<br />
You can't readily change the <span style="font-family: "courier new" , "courier" , monospace;">/usr/bin/java</span> link without <a href="https://www.howtogeek.com/230424/how-to-disable-system-integrity-protection-on-a-mac-and-why-you-shouldnt/">disabling something called System Integrity Protection (SIP)</a>, which isn't really something I wanted to do.<br />
<br />
So, here's my hack:<br />
<br />
3A) In the Terminal, type<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">sudo ln -s "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java” /usr/local/bin/java</span><br />
<br />
That puts a link in <span style="font-family: "courier new" , "courier" , monospace;">/usr/local/bin</span>, which SIP doesn't complain about.<br />
<br />
3B) We need to get into the "package" of <span style="font-family: "courier new" , "courier" , monospace;">Energia.app</span>. (I'm assuming you put it in your main <span style="font-family: "courier new" , "courier" , monospace;">Applications</span> folder.) In the Terminal, type<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">cd /Applications/Energia.app/Contents/MacOS</span><br />
<br />
In that folder, you'll find a file called <span style="font-family: "courier new" , "courier" , monospace;">Energia</span>, which starts up the program. Let's rename it something else that we can call from our own <span style="font-family: Courier New, Courier, monospace;">Energia</span> script. Type:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">mv Energia Energia_main</span><br />
<br />
3C) Then create a text file called <span style="font-family: Courier New, Courier, monospace;">Energia</span> that contains these three lines:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">#!/bin/bash</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">export PATH=/usr/local/bin:$PATH</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">./Applications/Energia.app/Contents/MacOS/Energia_main</span><br />
<br />
Now, when you double-click on the <b>Energia</b> icon, it will change your path to put <span style="font-family: "courier new" , "courier" , monospace;">/usr/local/bin</span> before <span style="font-family: "courier new" , "courier" , monospace;">/usr/bin </span>so Energia will find the correct java command line program. This path change is restricted to this running of Energia, so hopefully this won't mess up any other program that for whatever reason really should have <span style="font-family: "courier new" , "courier" , monospace;">/usr/bin</span> before <span style="font-family: "courier new" , "courier" , monospace;">/usr/local/bin</span> in the path.<br />
<br />
Usual caveats apply; your mileage may vary. Use the above information at your own risk (although I don't think I'm suggesting that you do anything particularly risky.)Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com2tag:blogger.com,1999:blog-3182418827140543846.post-4883930738544622452017-09-16T22:23:00.001-07:002017-09-17T01:06:17.426-07:00Teardown of SNES and Genesis USB Gamepads<div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPIgu-svJeMI-tUD3bUU_9XZeztpERCihsH5ZLUVaRsP09hhUjqzL_fosXpZNZoA1OiWxmWu8TktdkW4vre9e79PdTLg1qMvGpq2qWAUeG2kIbDNHHVKU7rE5Qpm5Jb9jrFvI7L1C0Lv2L/s1600/snes_genesis_assembled.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPIgu-svJeMI-tUD3bUU_9XZeztpERCihsH5ZLUVaRsP09hhUjqzL_fosXpZNZoA1OiWxmWu8TktdkW4vre9e79PdTLg1qMvGpq2qWAUeG2kIbDNHHVKU7rE5Qpm5Jb9jrFvI7L1C0Lv2L/s200/snes_genesis_assembled.jpg" width="195" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: start;">I picked up these incredibly cheap USB gamepads on eBay: Two SNES-style for $8.90 total, and two Genesis style for $15.24 total. They work reasonably well.</span></td></tr>
</tbody></table>
</div>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3-5stdoyCwDS9o4cDUqKAVbAqTX4Eqjzjyn308gZsZxLkjPEQTKQO7VUAhOawzlwr7ksG-cHdksLwLq_lOAW1mRZPxOJyVhyphenhyphen3xFCYSFjxkoakGOmsw3u0BPUHDJY6eGp3s4tnzIIPfeE-/s1600/snes_pcb_boring_side.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3-5stdoyCwDS9o4cDUqKAVbAqTX4Eqjzjyn308gZsZxLkjPEQTKQO7VUAhOawzlwr7ksG-cHdksLwLq_lOAW1mRZPxOJyVhyphenhyphen3xFCYSFjxkoakGOmsw3u0BPUHDJY6eGp3s4tnzIIPfeE-/s200/snes_pcb_boring_side.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: start;">Let's take them apart, starting with the SNES-style controller. Removing the screws from the back reveals the boring side of the PCB, showing the crystal and the four standard USB wires.</span></td></tr>
</tbody></table>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8LYrZOYCEMx22alKrroB2hcPg7GKInKevuzqDnLdtmGQF4NjlcLx1uP56gyL9Y3i9I4UeLOhQ6DAUus70pXaGudnWLuNB1QjOPZKfkD1rKoLN8OosQNuVm-ZdBQFmuR2qkA5wH34w-07q/s1600/snes_pcb_contact_side.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8LYrZOYCEMx22alKrroB2hcPg7GKInKevuzqDnLdtmGQF4NjlcLx1uP56gyL9Y3i9I4UeLOhQ6DAUus70pXaGudnWLuNB1QjOPZKfkD1rKoLN8OosQNuVm-ZdBQFmuR2qkA5wH34w-07q/s640/snes_pcb_contact_side.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: start;">Flipping over the board reveals a glop top and ten nice pads and two through-hole connections for the shoulder buttons that you could solder to, giving you twelve inputs if you wanted to use the PCB as general button-like-thing-to-USB converter.</span></td></tr>
</tbody></table>
<div>
<br /></div>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYjMv9SO-dsgQq8_mbziAQkAjRJRj4li-4UmtSqQGLmQBpaftR4vy-Oaml1iztuCdnriftmM9h5zoD4Kajx3_u14CM3q1mQPZVQEP-SCnLIDBhBSELRqAtvFtundCaNLauBRgoOrh4noAj/s1600/snes_buttons_and_dpad.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYjMv9SO-dsgQq8_mbziAQkAjRJRj4li-4UmtSqQGLmQBpaftR4vy-Oaml1iztuCdnriftmM9h5zoD4Kajx3_u14CM3q1mQPZVQEP-SCnLIDBhBSELRqAtvFtundCaNLauBRgoOrh4noAj/s200/snes_buttons_and_dpad.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: start;">Here's what the SNES-style controller looks like with the buttons and D-pad removed.</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNc1L4q0EnfpcBHgPnTtG9cVXZF1ONE9aopHdRvWPzvY6qNJDA57OIgEouASuTLSUQ4XJSCS3QkgOsWB1cU3LuU3berq1VuYtFx3zjOGkQA6ynAQVMHJsIKK0_cm8-lWud4DmyR4DkTJct/s1600/genesis_pcb_boring_side.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="116" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNc1L4q0EnfpcBHgPnTtG9cVXZF1ONE9aopHdRvWPzvY6qNJDA57OIgEouASuTLSUQ4XJSCS3QkgOsWB1cU3LuU3berq1VuYtFx3zjOGkQA6ynAQVMHJsIKK0_cm8-lWud4DmyR4DkTJct/s200/genesis_pcb_boring_side.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: start;">Now let's take look at the Genesis-style controller. Removing the screws from the back once again reveals a crystal and the four standard USB wires. Also note that the shoulder buttons are tactile switches.</span></td></tr>
</tbody></table>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl_ndS3546v4WZCF_5is3sPmq4p4TJgOOOZvTPZc_C3Csh6aegJYX9ub02r1l85EeslakiItwuuoFGJOOsd5AjOevTzwEO8WVMjfKfZV8BbcMFCBhTXtB9Sqec3lE5vd_LJxpUXNeA_bNx/s1600/genesis_pcb_contact_side.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl_ndS3546v4WZCF_5is3sPmq4p4TJgOOOZvTPZc_C3Csh6aegJYX9ub02r1l85EeslakiItwuuoFGJOOsd5AjOevTzwEO8WVMjfKfZV8BbcMFCBhTXtB9Sqec3lE5vd_LJxpUXNeA_bNx/s640/genesis_pcb_contact_side.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: start;">Flipping over the board reveals a glop top, eleven nice pads and two through-hole connections for the shoulder buttons that you could solder to, giving you thirteen inputs if you wanted to use the PCB as general button-like-thing-to-USB converter.</span></td></tr>
</tbody></table>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHNAmVJYAezKB5HgCB2pJpzjJQP_OWJpQ8VZ8K_Shp2kVc5pd8sxQC2HVI-iU3tiCFo1_l2CnRceBqu4hMxFyZFIZcB85BmZL3VUJLZEtsrmEPWKTTtnvp9OPIN9eb10ZuAR1ou35z0I4C/s1600/genesis_button_dpad_placement.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="136" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHNAmVJYAezKB5HgCB2pJpzjJQP_OWJpQ8VZ8K_Shp2kVc5pd8sxQC2HVI-iU3tiCFo1_l2CnRceBqu4hMxFyZFIZcB85BmZL3VUJLZEtsrmEPWKTTtnvp9OPIN9eb10ZuAR1ou35z0I4C/s200/genesis_button_dpad_placement.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: start;">Here's what it looks like with the rubber membranes removed.</span></td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: left;">
For completeness, here's what the individual buttons look like, along with the inside of the back of the controller: </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfqbE5qysXid5_3kVo2ZqCe1TANZ3iCSGZ952eXI_A6S8hTJN5g3XYv_FiK_Ita6ka2tYUSyzdHNis1fDcqXAQgZr7IdCnsN-0nVu88NJPe2fT2j0A2SkR0GF6XCcqU8LAfD5jCkacOcg6/s1600/genesis_buttons.jpg" imageanchor="1"><img border="0" height="259" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfqbE5qysXid5_3kVo2ZqCe1TANZ3iCSGZ952eXI_A6S8hTJN5g3XYv_FiK_Ita6ka2tYUSyzdHNis1fDcqXAQgZr7IdCnsN-0nVu88NJPe2fT2j0A2SkR0GF6XCcqU8LAfD5jCkacOcg6/s320/genesis_buttons.jpg" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0WX16cDq8SMWyHWB8x1rZSovhzhWLYdO334jyhSP0J1LTOvdIwSAQCk0jv1kyFGyy9x6nJFPjjPyFzcYmnkaVNIo0nCtkLi6Rifa0SZEtVmhLdD1yNhm6nFuQ6ILs0XqD7u-QiLBTL79q/s1600/genesis_shoulder_start_buttons.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0WX16cDq8SMWyHWB8x1rZSovhzhWLYdO334jyhSP0J1LTOvdIwSAQCk0jv1kyFGyy9x6nJFPjjPyFzcYmnkaVNIo0nCtkLi6Rifa0SZEtVmhLdD1yNhm6nFuQ6ILs0XqD7u-QiLBTL79q/s320/genesis_shoulder_start_buttons.jpg" width="159" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1ixW7nczmWSUOD05aLOcT_mdwUTgAIfWyBISSbyarYx-Cpc-idtj43VZSz2Ze_fUg215On0f-PbdQB_ssir3Xo_pxcOk2RoF4yAw1YdwejelX8W1AXVPALBQoWjxRcOYPD3ziyxYJUl3n/s1600/genesis_back_of_case.jpg" imageanchor="1"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1ixW7nczmWSUOD05aLOcT_mdwUTgAIfWyBISSbyarYx-Cpc-idtj43VZSz2Ze_fUg215On0f-PbdQB_ssir3Xo_pxcOk2RoF4yAw1YdwejelX8W1AXVPALBQoWjxRcOYPD3ziyxYJUl3n/s320/genesis_back_of_case.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com0tag:blogger.com,1999:blog-3182418827140543846.post-47523207610945214002017-09-12T19:46:00.000-07:002017-09-12T20:24:24.006-07:00Let's put those electrons to work!I'm Aaron Lanterman, a Professor of Electrical and Computer Engineering at Georgia Tech.* This is my blog on DIY electronics**, with an aesthetic bent towards the retrofuristic: steampunk, dieselpunk, and games such as Bioshock and Fallout. Over the next few months, we'll design and construct a custom bass guitar pedal and a R2-D2 hat that bleeps and blinks. We'll hack together some custom game controllers and portable gaming consoles. We'll play around with analog circuits for music synthesis. We'll fix some old tube radios. We'll fix a car's air conditioning using three zip ties and install a new car stereo.<br />
<div>
<br />
<div>
Along the way, we'll do some reverse engineering, and experiment with "single-board computers" like the Raspberry Pi and "microcontroller boards" like Arduinos and the Texas Instruments Launchpads.<br />
<br />
I have another blog, focused on education: <a href="https://edupocalypsenow.wordpress.com/">Edupocalypse Now: Education and Innovation in the End Times</a>.<br />
<br />
Like everyone else in 2006, I had a <a href="http://abovenyquist.livejournal.com/">Livejournal where I posted political rants and personal life observations</a>. (I technically still have it, although I don't post much there nowadays.)</div>
</div>
<div>
<br /></div>
<div>
*Opinions expressed here are my own, and not those of my employer. I may at times provide commentary on equipment that was donated to me or Georgia Tech; I will disclose such situations in the interest of fairness (although I believe I can offer unbiased advise).</div>
<div>
<br /></div>
<div>
**Any electronic project may present a risk of injury or death, particularly when dealing with mains voltages. It is important to follow appropriate safety practices. The author of these pages, Aaron Lanterman, disclaims any liability for injury, death, or other damage caused in using any of the information contained on these webpages.</div>
Aaron Lantermanhttp://www.blogger.com/profile/17076287997254561145noreply@blogger.com0