<html><span class="arrow-icon">↫</span></html> Take me back to the [[Gallery]]\n\n<html>\n<center>\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/teleoperational_aspecting.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/erosion_channels.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/bitmap_restoration.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/hostiae.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/theatre_of_magic.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/flawed_perspective.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/image_alchemy.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/replica_of_a_replica.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/super_vga_camouflage.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/exploded_solitaire.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/mikrosopht_sms_transmission.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/reality_duality.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/mirror_wake.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/holographic_fate.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.datacorruption.org/img/phone_arts/productivity_graph.png"><br />\n</center>\n</html>
<html>\n<img class="zone-image dropshadow" src="img/conservatory.gif">\n</html>WELCOME TO THE CONSERVATORY\n\nFor those seeking blood taken straight from memory shortly after waking. Non-threatening interior design, concealing a violent network of audio data. Never stop broadcasting these traumatic renders and failed attempts to communicate. Wildly disconnect your soul. Meatspace market research ray tracing the existence of sorrow and algorithmically caching phantom anxieties. Fog juice cleanse in a hotel room with a strobe light.\n\n█▓▒░ PERFORMANCE VIDEOS >>\n[[Brooklyn, NY • August 23, 2014|NorthAmericaPerformance]]\n[[Melbourne, Australia • August 23, 2012|AustraliaPerformance]]\n[[Tokyo, Japan • October 23, 2011|AsiaPerformance]]\n[[Aalborg, Denmark • July 24, 2009|EuropePerformance]]\n\n█▓▒░ TECHNICAL DOCUMENTATION >>\n[[NSF Playback Cartridge Guide|NSFGuide]]\n[[MCK/MML Beginners Guide|MCKGuide]].\n\n
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Conservatory]]\n\n<html>\n<pre>\n////////////////////////////////////////////////////////\n//// MCK/MML BEGINNERS GUIDE ///////////////////////////\n//// by nullsleep ////////// product of 8bitpeoples ////\n//// version 1.0 /////////// Research & Development ////\n////////////////////////////////////////////////////////\n\n\n*******************************************************************************\n** OBJECTIVE ******************************************************************\n*******************************************************************************\n\nThis document is aimed at providing the reader with everything that is needed \nin order to begin programming NES tunes with MCK/MML. It outlines all the steps\nrequired in the process, the initial organization of the MCK/MML workspace, the\nconventions in programming each of the sound channels of the NES including \nsome of the most common and useful MML commands and effects, and finally \ngenerating an NSF file and troubleshooting any problems that might come up \nduring this process.\n\nThanks: Izumi, Manbow-J, Norix, Virt, Memblers, and everyone at MCK 2ch.\n\n*******************************************************************************\n** MCK/MML WORKSPACE SETUP ****************************************************\n*******************************************************************************\n\nDownload Necessary Files\n-------------------------------------------------------------------------------\nmck_0228.zip\nmckc025.zip\ndmcconv005.zip\nmckc-e.txt\n- currently available from:\nhttp://www.geocities.co.jp/Playtown-Denei/9628/\n\nmkit251_dos.zip\n- currently available from:\nhttp://www.magicengine.com/mkit/download.html\n\n\nOrganize MCK/MML Workspace\n-------------------------------------------------------------------------------\nCreate a folder called 'workspace' and unzip all the files contained in \nmck_0228.zip into this folder. Next, extract all files from mckc025.zip into \nthis same folder. Now extract ONLY nesasm.exe from the mkit251_dos.zip into \nthe 'workspace' folder. None of the other magickit files will be needed. The \n'source' folder that was extracted from the mckc zip into the 'workspace' may \nalso be deleted. Finally, create a new folder inside 'workspace' called \n'DMCconv' and extract the files from dmcconv005.zip into this folder.\n\n\nCreate and Modify Files\n-------------------------------------------------------------------------------\nCreate a new text file, call it songdata.mml and place it in your 'workspace' \nfolder. This is the text file where you will use MML (music macro language) to \nprogram your tune. But first, there are some other things that must be setup. \nOpen make_nsf.txt and scroll to the end of the file where there will be a \nnumber of .include statements. After the last one, add this line to the file:\n\n .include "songdata.h"\n\nalso look for these lines in make_nsf.txt:\n\n .org $800E\n db "Song Name"\n db $00\n .org $802E\n db "Artist"\n db $00\n .org $804E\n db "Maker"\n db $00\n\nThis is the part of the NSF header that identifies the tune. It should be \nobvious from the hex values of the org statements that there is only a limited \namount of space for each of the fields, the max length being 31 characters. You\nshould modify these header fields appropriately as seen below, keeping in mind \nthe 31 character limit:\n\n .org $800E\n db "My First NES Chip"\n db $00\n .org $802E\n db "Nullsleep"\n db $00\n .org $804E\n db "2003 Jeremiah Johnson"\n db $00\n\n\n*******************************************************************************\n** GENERATING THE NSF FILE ****************************************************\n*******************************************************************************\n\nCreate another new text file, open it up and type the following:\n\nmckc_e songdata.mml\ndel nesmusic.nsf\nnesasm -raw make_nsf.txt\nren make_nsf.nes nesmusic.nsf\n\nSave the file, close it, and rename it build.bat, this is a simple batch file \nthat will run all of the commands to generate an NSF file from the MML data. \nFirst it uses mckc to convert songdata.mml into a chunk of data in songdata.h \nthat nesasm will then compile along with the MCK sound driver code into an NSF \nfile. By this point everything should be setup properly, so now you can get \nstarted on programming MML.\n\n\n*******************************************************************************\n** BASIC SONG SETUP ***********************************************************\n*******************************************************************************\n\nHeader Credits\n-------------------------------------------------------------------------------\nAfter opening up songdata.mml in your preferred text editor, the first thing \nyou should do is add the header lines to the top of the file to identify \nyourself as the composer and note the title of the song. For example:\n\n#TITLE My First NES Chip\n#COMPOSER Nullsleep\n#PROGRAMER 2003 Jeremiah Johnson\n\nThis is an optional step, however it is highly recommended, especially if the \nMML files will be released publicly. On a side note, the incorrect spelling of \n#PROGRAMER is a typo within MCK itself, and therefore must be used.\n\nChannel Layout\n-------------------------------------------------------------------------------\nThe NES has 5 channels to work with, and they are defined in MML as follows:\n\nA this is the first pulse channel\nB this is the second pulse channel\nC this is the triangle channel\nD this is the noise channel\nE this is the dpcm channel\n\nThis guide will cover the programming conventions for each of these channels, \nwith A+B being covered together since their operation is identical.\n\n\nTempo Settings\n-------------------------------------------------------------------------------\nTempo can be set individually for each channel, however its likely that you \nwill usually want all channels to be playing at the same speed to keep \neverything in sync. The tempo for all channels can be set simultaneously like \nthis:\n\nABCDE t150\n\nIn MML notation this is saying, for channels A, B, C, D, and E set the tempo \nto 150 beats per minute. The valid range of values for tempo is 1 to 255.\n\n\nVolume Settings\n-------------------------------------------------------------------------------\nThe pulse wave channels (A+B) and the noise channel (D) of the NES have volume \ncontrol, while the triangle wave channel (C) and the DPCM channel (E) can only \nbe turned ON or OFF. For the pulse and noise channels, there are two options \nfor setting volume. The first is to just set a constant volume level, by doing \nsomething like this:\n\nA v15\n\nWhich would set the volume level for channel A to 15, which is the highest \nvolume level available. However, in most cases using a volume envelope is \nprobably a much better choice than setting a constant volume.\n\nSetting up a basic volume envelopes is simple. If neither a constant volume nor\na volume envelope is defined for the pulse channels (A+B) or the noise channel \n(D), you will not hear any sound output on these channels. Here is a simple \nvolume envelope example:\n\n@v0 = { 10 9 8 7 6 5 4 3 2 }\n\nThe volume envelope takes values between 0 and 15. The highest volume being 15,\nand 0 being silence. This volume envelope starts off at a high volume and \nquickly decays down to a low volume, this last value will be held until another\nnote is played. You can easily modify the volume envelope or setup more, \nfurther examples will be given, including setting loop points within the \nenvelope.\n\n\n*******************************************************************************\n** PULSE WAVE CHANNELS (A+B) **************************************************\n*******************************************************************************\n\nInitialization\n-------------------------------------------------------------------------------\nThe next step is setting up each channel individually with the properties it \nrequires, such as note length, octave, duty cycle (for the pulse channels), and\nvolume envelope. Here is a possible setup for one of the pulse wave channels:\n\nA l8 o4 @01 @v0\n\nWhich translates to, for channel A set the default note length to eighth notes,\nset the octave to the 4th octave, set the duty cycle setting to 01 (25% duty \ncycle), and use volume envelope 0 (which was defined above). A quick \nexplanation of the duty cycle setting follows.\n\n\nDuty Cycle Explanation\n-------------------------------------------------------------------------------\nYou can think of a pulse wave as a square wave with a variable width. In a \nsquare wave the width is fixed at 50% (half up and half down), but pulse waves \nhave more flexibility. This flexibility is referred to as the duty cycle (or \nsometimes the timbre) of the pulse wave. Below are the 4 possible duty cycle \nsettings for the pulse wave channels on the NES.\n\n _\n00 | | | 12.5% thin raspy sound\n | |_____________|\n ___\n01 | | | 25% thick fat sound\n | |___________|\n _______\n02 | | | 50% smooth clear sound\n | |_______|\n ___________\n03 | | | 75% same as 25% but phase-inverted\n | |___|\n\n\nProgramming the Pulse Channel\n-------------------------------------------------------------------------------\nNow that the pulse channel (A) should be completely setup, here is a little \nnote sequence that can be programmed on it.\n\nA c d e f g4 a16 b16 >c c d e f g4 a16 b16 >c<<\n\nIf you know standard music notation most of what you see should look atleast \nsomewhat familiar. Additionally, the use of sharps and flats is accomplished by\nadding either a + or - (respectively) after the note value. Making the notes in\nan octave:\n\n c+ d+ f+ g+ a+\n | # # | # # # | additionally:\n | # # | # # # | r = rest\n | # # | # # # | w = wait (rest without silencing the previous note)\n |__|__|__|__|__|__|__|\n c d e f g a b \n\nSince the default note length for channel A was set to eighth notes, the above \nmelody is playing c d e f notes for an eighth length each, then the g4 which \nplays g for a quarter length, followed by a16 b16 which play an a note and b \nnote for a sixteenth length each. Next is the > symbol, this switches an octave\nUP (so now we are in the 5th octave) and then a 5th octave c eighth note is \nplayed. Now the scale is repeated again, before finally switching back down 2 \noctaves (to the original 4th octave we set for the channel). Additionally, in \nreference to note duration it is possible to use dotted notes, which should \nagain be familiar to those with knowledge of standard music notation. Dotting \na note increases the duration of that note by half of its value. These examples\nshould help illustrate this:\n\nc8. = c note played for an eighth plus a sixteenth\nd4. = d note played for a quarter plus an eighth\ne4.. = e note played for a quarter plus an eighth plus a sixteenth\nf2.. = f note played for a half plus a quarter plus an eighth\n\nNow, getting back to the above example programmed on the first pulse wave\nchannel (A), notice that this sequence will only play once. The full sequence \nor small portions of it can be looped using brackets followed by a loop count \nas shown below:\n\nA [c d e f g4 a16 b16 >c c d e f g4 a16 b16 >c<<]2\n\nThis will loop the entire sequence twice. This can be handy for keeping your \nMML code clean and saving you some unnecessary typing. To give this sequence a \nlittle more of a dynamic feel another volume envelope can be setup and the two \ncan be switched back and forth. Ending up with something like this:\n\n#TITLE My First NES Chip\n#COMPOSER Nullsleep\n#PROGRAMER 2003 Jeremiah Johnson\n\n@v0 = { 10 9 8 7 6 5 4 3 2 }\n@v1 = { 15 15 14 14 13 13 12 12 11 11 10 10 9 9 8 8 7 7 6 6 }\n\nABCDE t150\n\nA l8 o4 @01 @v0\nA [c d e f @v1 g4 @v0 a16 b16 >c c d e f @v1 g4 @v0 a16 b16 >c<<]2\n\nThis volume envelope switching will put a slight emphasis on the quarter notes \nbecause of the higher initial volume setting of the new volume envelope and its\nslower decay rate. All of this can be applied identically to the second pulse \nchannel (B) as well.\n\n\n*******************************************************************************\n** TRIANGLE WAVE CHANNEL (C) **************************************************\n*******************************************************************************\n\nInitialization\n-------------------------------------------------------------------------------\nThe operation of the triangle wave channel (C) is similar to the pulse wave \nchannels with the exception of volume envelope and duty cycle parameters. The \ntriangle channel has no volume control, it is either ON or OFF and therefore \nvolume envelopes can not be used. Likewise, duty cycle settings only apply to \nthe pulse channels and can be disregarded when using the triangle channel. \nTaking these things into consideration, the initial setup of the triangle \nchannel is fairly straightforward:\n\nC l4 o3 q6\n\nWhich translates to, for channel C set the default note length to quarter \nnotes, set the octave to the 3rd octave, and finally set q6. This setting might\nbe confusing, but what it does is cuts the notes played back on this channel \nslightly. The q stands for quantize and it can take values from 1 to 8. Notes \nare divided into 8 equal parts and what this value determines is how many \neighths of the note to play before cutting it. For example, the q6 setting we \nused will cut the note after 6/8ths of it has played. This will help give \nbasslines a bit of a snappier rhythm than if the notes were just allowed to \nsound continuously.\n\n\nProgramming the Triangle Channel\n-------------------------------------------------------------------------------\nHere is a little example of a bassline sequence on the triangle channel:\n\nC c e g8 g8 a16 b16 >c8 c e g8 g8 a16 b16 >c8<<\n\nAdd this into the MML covered so far, and loop it 4 times. This way its first \nheard along with whats playing on the pulse wave channel (A) and then it can be\nheard alone.\n\n#TITLE My First NES Chip\n#COMPOSER Nullsleep\n#PROGRAMER 2003 Jeremiah Johnson\n\n@v0 = { 10 9 8 7 6 5 4 3 2 }\n@v1 = { 15 15 14 14 13 13 12 12 11 11 10 10 9 9 8 8 7 7 6 6 }\n\nABCDE t150\n\nA l8 o4 @01 @v0\nA [c d e f @v1 g4 @v0 a16 b16 >c c d e f @v1 g4 @v0 a16 b16 >c<<]2\n\nC l4 o3 q6\nC [c e g8 g8 a16 b16 >c8 c e g8 g8 a16 b16 >c8<<]4\n\n\n*******************************************************************************\n** NOISE CHANNEL (D) **********************************************************\n*******************************************************************************\n\nNoise Channel Explanation\n-------------------------------------------------------------------------------\nThe noise channel (D) can be a fairly versatile instrument with a bit of work. \nWaves crashing on a beach, rocket engines roaring, dark fiery dungeon sounds, \nand supplemental percussion to enhance your drum samples are a few possible \napplications. Like the pulse wave channels, volume envelopes are used by the \nnoise channel and are an important part of getting good sounds out of it. \nAdditionally it has 2 modes of operation: normal and looped noise. The looped \nnoise setting can be used to generate interesting, somewhat metallic sounds. \nThe pitch range of the noise channel is very limited and loops every octave, \nmaking octave changing unnecessary. The c note seems to be the high pitch, with\nthe pitch moving slightly downwards over e, f, g, a, and finally to the b note \nwhich seems to be the lowest pitched. \n\n\nInitialization\n-------------------------------------------------------------------------------\nHere are a couple of simple volume envelopes that can be used for some basic \npercussion on the noise channel:\n\n@v2 = { 15 12 10 8 6 3 2 1 0 }\n@v3 = { 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 }\n\nAfter setting up the volume envelopes the channel should be initialized:\n\nD l4 o1 @0 @v2\n\nWhich translates to, for channel D set the default note length to quarter \nnotes, set the octave to the 1st octave, set the noise mode to normal (@1 would\nbe used to turn on looped noise), and use volume envelope 2.\n\n\nProgramming the Noise Channel\n-------------------------------------------------------------------------------\nHere is a little sequence of simple noise drums:\n\nD @v2 b @v3 e @v2 b @v3 e @v2 b @v3 e @v2 b @v3 e8 @v2 b8\n\nAdd this into the MML covered so far, and loop it 4 times.\n\n#TITLE My First NES Chip\n#COMPOSER Nullsleep\n#PROGRAMER 2003 Jeremiah Johnson\n\n@v0 = { 10 9 8 7 6 5 4 3 2 }\n@v1 = { 15 15 14 14 13 13 12 12 11 11 10 10 9 9 8 8 7 7 6 6 }\n@v2 = { 15 12 10 8 6 3 2 1 0 }\n@v3 = { 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 }\n\nABCDE t150\n\nA l8 o4 @01 @v0\nA [c d e f @v1 g4 @v0 a16 b16 >c c d e f @v1 g4 @v0 a16 b16 >c<<]2\n\nC l4 o3 q6\nC [c e g8 g8 a16 b16 >c8 c e g8 g8 a16 b16 >c8<<]4\n\nD l4 o1 @0 @v2\nD [@v2 b @v3 e @v2 b @v3 e @v2 b @v3 e @v2 b @v3 e8 @v2 b8]4\n\n\n*******************************************************************************\n** DPCM CHANNEL (E) ***********************************************************\n*******************************************************************************\n\nDPCM Channel Explanation\n-------------------------------------------------------------------------------\nThe DPCM channel, or delta modulation channel (DMC) as it is also sometimes \nreferred to, is used for sample playback on the NES. This can be useful for \nprogramming drums, sampled basslines, or even vocal samples. Its operation is \nsimple and fairly straightforward, with very few parameters that must be set. \nLike the triangle wave channel there is no volume control, the DPCM channel is \neither ON or OFF. Additionally, the NES uses its own 1-bit sample format, which\n you will have to convert your samples to before doing anything else. This \nprocess is described in the next section.\n\n\nCreating DPCM Samples\n-------------------------------------------------------------------------------\nDMCconv is the program that will be used to convert your samples from .wav to \n.bin for use with MCK. The documentation for DMCconv is not in english, \nhowever its operation is simple enough so that this should not be a problem. \nBelow is the description of its usage:\n\nUsage: DMCconv wavefile outfile \n Options\n -r? DMC Sampling rate(0-F) (Default:F 33.14KHz)\n 0: 4.18KHz 1: 4.71KHz 2: 5.26KHz 3: 5.59KHz\n 4: 6.26KHz 5: 7.05KHz 6: 7.92KHz 7: 8.36KHz\n 8: 9.42KHz 9:11.18KHz A:12.60KHz B:13.98KHz\n C:16.88KHz D:21.30KHz E:24.86KHz F:33.14KHz\n -v? Volume(Default:100)\n -n Volume not adjust(Default:Adjust)\n -b Bank size padding(Default:No padding)\n\nFor example: DMCconv kick.wav kick.dmc\nwould convert a kick.wav file into a kickdrum sample useable by the NES with \nall of the default settings. \n\n\nInitialization and Programming the DPCM Channel\n-------------------------------------------------------------------------------\nOnce all desired samples are converted, create a directory called 'samples' \nwithin the 'workspace' folder and include the samples and initialize the \nchannel in the mml as follows:\n\n@DPCM0 = { "samples\sskick.dmc",15 }\n@DPCM2 = { "samples\sssnare.dmc",15 }\n\nE o0 l4\n\nThe first sample, kick.dmc, will be mapped to @DPCM0 which corresponds to the \nc note on octave 0. You will then notice that the second sample, snare.dmc, is \nmapped @DPCM2 which corresponds to the d note ... @DPCM1 is skipped over to \navoid mapping samples to sharps/flats in order to keep the MML more readable. \nFor example, which of the following is easier to recognize as alternating kick \nand snare drumbeats?\n\nE c d c d c d c d8 c8\n\nor \n\nE c c+ c c+ c c+ c c+8 c8 \n\nIt should be apparent that the first one is more recognizeable, and this \nincreased readability will be further appreciated when programming more complex\nor lengthy drum sequences. Looping this and adding it to the MML programmed so \nfar gives us something like:\n\n#TITLE My First NES Chip\n#COMPOSER Nullsleep\n#PROGRAMER 2003 Jeremiah Johnson\n\n@v0 = { 10 9 8 7 6 5 4 3 2 }\n@v1 = { 15 15 14 14 13 13 12 12 11 11 10 10 9 9 8 8 7 7 6 6 }\n@v2 = { 15 12 10 8 6 3 2 1 0 }\n@v3 = { 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 }\n\n@DPCM0 = { "samples\sskick.dmc",15 }\n@DPCM2 = { "samples\sssnare.dmc",15 }\n\nABCDE t150\n\nA l8 o4 @01 @v0\nA [c d e f @v1 g4 @v0 a16 b16 >c c d e f @v1 g4 @v0 a16 b16 >c<<]2\n\nC l4 o3 q6\nC [c e g8 g8 a16 b16 >c8 c e g8 g8 a16 b16 >c8<<]4\n\nD l4 o1 @0 @v2\nD [@v2 b @v3 e @v2 b @v3 e @v2 b @v3 e @v2 b @v3 e8 @v2 b8]4\n\nE o0 l4\nE [c d c d c d c d8 c8]4\n\n\n*******************************************************************************\n** ADDITIONAL MACROS **********************************************************\n*******************************************************************************\n\nThis section will cover a few useful macros that can be used to add more depth \nand complexity to your tunes. The syntax for the macros will first be given, \nfollowed by the valid range of values that can be used, concluding with \nexamples and explanations. For a comprehensive listing of MML commands, please \nsee the mckc-e.txt file by Virt that is mentioned at the beginning of this \ndocument.\n\n\nVolume Macro @v[num] = { }\n-------------------------------------------------------------------------------\nValid range of values for num: 0 to 127\nValid range of values for parameters: 0 to 15\n\n@v0 = { 10 8 6 5 4 3 2 | 3 4 5 6 5 4 }\nA @v0 c d e f g a b >c<\nB @v0 c d e f g a b >c<\nD @v0 c d e f g a b >c<\n\nThe volume envelope macro has been covered extensively already, useable by both\nthe pulse wave channels (A+B) and the noise channel (D). However this example \nillustrates a loop point within the macro. Notice the | following the 2, this \nis the loop point. All values after this point will loop indefinitely. So for \nthis example, the channel begins playing at volume 10 down to 8, 6, 5, 4, 3, \nand 2 and then increases again to 3, 4, 5, peaking at 6, then back down to \n5, 4, and looping back to 3 stepping through the values again. Loop points in \nvolume macros can be very useful for things such as simulating delay/echo \neffects.\n\n\nTimbre Macro @[num] = { }\n-------------------------------------------------------------------------------\nValid range of values for num: 0 to 127\nValid range of values for parameters: 0 to 3\n\n@0 = { | 2 2 2 2 1 1 1 1 0 0 0 0 1 1 1 1 }\nA @@0 c d e f g a b >c<\nB @@0 c d e f g a b >c<\n\nThe timbre macro is useable only on the pulse wave channels (A+B) in order to \nrapidly switch the duty cycles of the pulse waves. The above example sets a \nloop point immediately following the opening bracket, meaning all values will \nbe looped. A 50% duty cycle is played for 4 frames, followed by a 25% duty \ncycle for 4 frames, followed by a 12.5% duty cycle for 4 frames, followed \nagain by a 25% duty cycle for another 4 frames, and finally looping back to \nthe beginning with the 50% duty cycle. Timbre macros can be used to make the \npulse wave channels sound much more interesting. Use a looping timbre macro \nlike the one above to thicken your tune up a bit. Or use a non-looping macro to\nsimply give instruments a sense of being plucked.\n\n\nArpeggio/Note Macro @EN[num] = { }\n-------------------------------------------------------------------------------\nValid range of values for num: 0 to 127\nValid range of values for parameters: -127 to 126\n\n@EN0 = { 0 0 | 4 0 3 0 -7 0 }\nA EN0 c f g >c< ENOF\nB EN0 c f g >c< ENOF \nD EN0 c f g >c< ENOF \n\nThe arpeggio (or note) macro is used to step through a series of notes very \nrapidly, useable on the pulse wave channels (A+B) and the noise channel (D). \nThe most common use of this technique is probably for simulating chords on a \nsingle channel. The parameters for the macro are not absolute, but instead \nrelative to the current note. So, going through the above example, first the \nbase note is played for 2 frames indicated by the two 0s, next the loop point \nis set, following the loop point the note is increased by 4 semitones (so if \nthe base note is c this will now play e), then followed by a 0 to hold this \nnew note for a second frame, then this new note is increased by 3 semitones \n(bringing it from e to g if we assume c as the base note), followed by a 0 to \nhold this new note for a second frame, then finally decreased by 7 semitones \nback to the base note and held for a second frame by the following 0 before \njumping back to the loop point. This example is simulating a major chord. The \nmacro is turned on by issuing the EN[num] command on the channel, and turned \noff using ENOF.\n\n\nPitch Macro @EP[num] = { }\n-------------------------------------------------------------------------------\nValid range of values for num: 0 to 127\nValid range of values for parameters: -127 to 126\n\n@EP0 = { 8 }\n@EP1 = { -64 }\nA EP0 c EPOF r EP1 c EPOF\nB EP0 c EPOF r EP1 c EPOF \nC EP0 c EPOF r EP1 c EPOF\nD EP0 c EPOF r EP1 c EPOF\n\nThe pitch macro, useable on all channels except for the DPCM channel (E), \nfunctions by sliding the frequency of a note with a speed and direction based \nupon the given parameters. When the number(s) within the brackets is positive, \nthe frequency will slide up in pitch. Likewise, when the number(s) within the \nbrackets is negative, the frequency of the note will slide downwards in pitch. \nThe farther the value is from 0 (in either direction) the faster the frequency \nwill sweep. In the above example, two pitch macros are setup, EP0 to give a \nslow upward pitch bend and EP1 to give a very extreme pitch bend down. In this \nsecond instance, the pitch is swept downward so quickly and so far that it \nwraps around, generating an interesting effect. Both examples use a single \nvalue within the brackets, but it is possible to use multiple values and set a \nloop point as in the above arpeggio macro example. Like the arpeggio/note \nmacro, the pitch macro will remain ON when in use on a channel until it is \nissued the EPOF command for turning it off.\n\n\nVibrato Macro @MP[num] = { [delay] [speed] [depth] }\n-------------------------------------------------------------------------------\nValid range of values for num: 0 to 63\nValid range of values for delay parameter: 0 to 255\nValid range of values for speed parameter: 1 to 255\nValid range of values for depth parameter: 0 to 255\n\n@MP0 = { 8 2 6 }\nA MP0 c1 d1 e1 f1 g1 a1 b1 >c1< MPOF\nB MP0 c1 d1 e1 f1 g1 a1 b1 >c1< MPOF\nC MP0 c1 d1 e1 f1 g1 a1 b1 >c1< MPOF\nD MP0 c1 d1 e1 f1 g1 a1 b1 >c1< MPOF\n\nThe vibrato (or pitch modulation) macro is useable on all channels except for \nthe DPCM channel (E). There are 3 parameters that must be set within the \nbrackets: delay, speed, and depth. Pitch modulation works by sliding the \nfrequency of a note in a sine wave pattern. The delay parameter determines how \nlong to wait before activating the vibrato, a value of 0 activating it \nimmediately. The speed parameter determines the period of the sine wave, the \nlarger the value the slower the pitch will change. The final parameter is \ndepth, which determines the amplitude of the sine wave, the larger the value \nthe greater the pitch range. Like the arpeggio/note macro and the pitch macro, \nthe vibrato will remain ON when in use on a channel until it is issued the \nMPOF command for turning it off.\n\n\n*******************************************************************************\n** TROUBLESHOOTING ************************************************************\n*******************************************************************************\n\nDPCM Sample Problems\n-------------------------------------------------------------------------------\nThe DPCM samples can sometimes cause pops in your tunes, little clicks that are\naudible before and/or after the samples play. This cannot always be completely \neliminated, but there are some things that you can do to minimize the problem. \nFirst off, 16bit 44100KHz Mono .wav files are recommended for use with DMCconv,\nand make sure to check in your sound editor that the samples have a starting \nand ending level of 0. Once this is verified, convert the samples with DMCconv \nand open the converted samples in a hex editor. If the size of the file is not \na multiple of 16, it should be padded with $AA or $55 until it is.\n\n\nBank Overflows\n-------------------------------------------------------------------------------\nWhen working on long tunes or using particularly complex MML, you may encounter\nthe following error output from nesasm:\n\nBank overflow, offset > $1FFF!\n\nNesasm code must be organized in a way such that it uses 8K banks. If your \nsongdata takes up too much space, you will encounter this bank overflow problem\nat compilation time. Fortunately, there is an MML command for bankswitching \nthat will effectively give you more space for your songdata. Its usage is as \nfollows:\n\n#BANK-CHANGE [num]\n\nWhere the valid range of values for num is 1 to 14, each corresponding to a \ntrack in your MML code (1=A, 2=B, 3=C, ... ). If the command is not successful \nin eliminating the bank overflow the first time you use it, try bankswitching \ndifferent tracks. There is also an alternative usage of this command below:\n\n#BANK-CHANGE [num1],[num2]\n\nWhere the valid values for num1 are 0 to 2 which denotes the bank number, and \nfor num2 they are again 1 to 14 corresponding to a track number. If you are \nusing the DPCM channel, num1 should be set to 0 to avoid problems since DPCM \nsamples are stored in banks 1 and 2.\n\n- EOF -------------------------------------------------------------------------\n\n../Nullsleep\n../www.8bitpeoples.com\n../www.nullsleep.com\n\nIf you find any errors in this document or have any suggestions or requests for\nadditions, please contact me: nullsleep@8bitpeoples.com\n\n</pre>\n</html>
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Gallery]]\n\n<html>\n<center>\n<table border=0 align=center valign=middle cellspacing=0>\n<COLGROUP> \n <COL WIDTH="259"> \n <COL WIDTH="20"> \n <COL WIDTH="259"> \n <COL WIDTH="20"> \n <COL WIDTH="259"> \n</COLGROUP> \n<tr>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/01/canvas02.gif" class="dropshadow" /></td>\n<td></td>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/01/canvas04.gif" class="dropshadow" /></td>\n<td></td>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/01/canvas01.gif" class="dropshadow" /></td>\n</tr></table>\n\n<BR><BR><BR><BR><BR>\n\n<table border=0 height=100% align=center valign=middle cellspacing=0>\n<tr>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/02/canvas05.gif" class="dropshadow" /></td>\n</tr></table>\n\n<BR><BR><BR><BR><BR>\n\n<table border=0 align=center valign=middle cellspacing=0>\n<COLGROUP> \n <COL WIDTH="259"> \n <COL WIDTH="20"> \n <COL WIDTH="259"> \n <COL WIDTH="20"> \n <COL WIDTH="259"> \n</COLGROUP>\n<tr>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/03/canvas03.gif" class="dropshadow" /></td>\n<td></td>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/03/canvas07.gif" class="dropshadow" /></td>\n<td></td>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/03/canvas06.gif" class="dropshadow" /></td>\n</tr></table>\n\n<BR><BR><BR><BR><BR>\n\n<table border=0 align=center valign=middle cellspacing=0>\n<COLGROUP> \n <COL WIDTH="259"> \n <COL WIDTH="20"> \n <COL WIDTH="259"> \n <COL WIDTH="20"> \n <COL WIDTH="259"> \n</COLGROUP>\n<tr>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/04/canvas08-1.gif" class="dropshadow" /></td>\n<td></td>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/04/canvas08-2.gif" class="dropshadow" /></td>\n<td></td>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/04/canvas08-3.gif" class="dropshadow" /></td>\n</tr></table>\n\n<BR><BR><BR><BR><BR>\n\n<table border=0 height=100% align=center valign=middle cellspacing=0>\n<tr>\n<td><div class="pattern9-container dropshadow"><img src="http://www.nullsleep.com/_/_patt_rNs/05/canvas09-1.gif" /></div></td>\n</tr></table>\n\n<BR><BR><BR><BR><BR>\n\n<table border=0 align=center valign=middle cellspacing=0>\n<COLGROUP> \n <COL WIDTH="259"> \n <COL WIDTH="20"> \n <COL WIDTH="259"> \n <COL WIDTH="20"> \n <COL WIDTH="259"> \n</COLGROUP>\n<tr>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/06/canvas14A.gif" class="dropshadow" /></td>\n<td></td>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/06/canvas14C.gif" class="dropshadow" /></td>\n<td></td>\n<td><img src="http://www.nullsleep.com/_/_patt_rNs/06/canvas14B.gif" class="dropshadow" /></td>\n</tr></table>\n</center>\n</html>
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Conservatory]]\n\n<html>\n<iframe class="dropshadow" width="560" height="315" src="http://www.youtube.com/embed/b5uqBOQ93ZE" frameborder="0" allowfullscreen></iframe><br />\n<br />\nMelbourne, Australia • August 23, 2014<br />\nVisuals by <a href="http://www.batslyadams.com" target=_blank>Batsly Adams</a>\n</html>\n
<html>\n<div class="glitch">\n<img class="zone-image dropshadow" src="img/visitor-center.gif">\n</div>\n</html>WELCOME TO THE VISITOR CENTER\n\nBeloved, I am drenched with tears while writing to you. A few days ago I was notified of a complication in my human mechanism. God directed me to randomly pick someone and my spirit chooses you. I am in a hospital typing this to you with my laptop. \n\n█▓▒░ ABOUT ME >>\nI am a computer musician and artist based in New York City. My performances involve the use of <html><a href="http://en.wikipedia.org/wiki/Game_Boy" target=_blank>obsolete</a> <a href="http://www.vintagesynth.com/yamaha/su10.php" target=_blank>consumer<a/></html> <html><a href="http://en.wikipedia.org/wiki/Commodore_64" target=_blank>electronics</a> and <a href="http://en.wikipedia.org/wiki/Modular_synthesizer" target=_blank>modular synthesizers</a></html> to craft visceral, aggressive dance music. The inherent limitations and failures of tec▀╟ ▌⁄┘logy are an integral part of my sound design process. \n\nIn 1999 I founded <html><a href="http://www.8bitpeoples.com" target=_blank>8bitpeoples</a></html>, a collective of artists interested in the audio-visual aesthetics of early home computers and video game consoles. I tour extensively, and have performed over 200 shows throughout North and South America, Europe, Asia, and Australia.\n\n█▓▒░ RESEARCH INTERESTS >>\nModular synthesizers, ASCII art, drones, interactive fiction, virtual reality, countersurveillance, disinformation, tactical semiotics, hypnagogic computing, Internet cults and religions. \n\nDo not feel sorry for me as you read this because, I believe everyone will die someday.
<html>\n<div class="glitch">\n<img class="zone-image dropshadow" src="img/start.gif">\n</div>\n</html>You have traveled across a vast network to reach me. Glimpses of your physical body rendered in a black sea of cloud daemons, infinite timelines derived from comprehensive documentation on YouTube. From here you can go through a god machine to the [[Visitor Center]], subtle preparations have been made.\n\nOn destroying the utility of your tympanic membrane, an uplink to the [[Conservatory]] has been established. Should you choose to take advantage of this rare opportunity to sync your VR rig with the heart of chaos, there exists a traumatic vision of the Apple II at eternal dusk. A deconstruction of the territory, a total subversion of velocity. An attempt to take itself offline in da club.\n\nI'm going to ruin the surprise, you will be replaced with an oversized prosthetic. A lossless copy of man. Not sure if I see you when I stare at you. You're one Internet sigil away from the [[Gallery]], a burning chrome smiley face buried in your cerebral cortex. Shoutout to all the gate spells that connect us.\n\nDreams really can die. Be careful.
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Gallery]]\n\n<html>\n<center>\n<img class="gallery-image dropshadow" src="http://www.computersclub.org/draw/collection/CC_981.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.computersclub.org/draw/collection/CC_725.png"><br />\n\n<img class="gallery-image dropshadow" src="http://computersclub.org/draw/collection/CC_1444.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.computersclub.org/draw/collection/CC_1042.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.computersclub.org/draw/collection/CC_986.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.computersclub.org/draw/collection/CC_805.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.computersclub.org/draw/collection/CC_654.png"><br />\n\n<img class="gallery-image dropshadow" src="http://www.computersclub.org/draw/collection/CC_636.png"><br />\n\n</center>\n</html>
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Gallery]]\n\n<html>\n<div class="unicode-container dropshadow">\n<pre>\n░▓▓▒▒░ ░▓▓▓▒▒▓ ▒▒░▄ ▄██▀ ▀█▀██▄▄███ ▀██▀▀████████████████████████████████████ \n ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░ ▄ ▄▄▄ ▄▄▄▄▄▄▄ ▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ██\n▒█▓▓▓▓▓▓▒▒▓▓▓▓▓▒▓▓▓▓▒▒▒░██████████████████████████████████████████████████ ██\n ░▒▓▓▓▓▓▓▓▒▒▓▒▓▓▓▓▓▓▓▓▓▒▒▒░ ░▒░████████████████████████████████ ▀██ ████ ██\n █▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▓▓▓▓▓▓▓▒▓▓▓▒ ▒░███████████████████████████ ▄ █ ████ ██\n░█▓▓▓▓▓▓▓▓▓▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██▓▀▒▓▓▒░ ▀ │▀▀ ████████████████▓▓▓▓▓▓▓▓▓▓▓██ ██\n█▓▓▓▓▓▒▒▓▓▓▓▒█▒▓▒░▒▓▓▓▓▓▓█▀▒▓▓▓▓▓▓▓▓▓▓░▒%║, ,░▀▓████████████▓▓▓▓▓▓▓▓▓▓▓██ ██\n██▓▓▓▒▓█▒▒░░███▒███▒▒██▀▒▒░ ░▒▒▓▒▒╦▒▒░▓░▓╬▒╗~ ░▒▀▀▓█████████ █ ▀ ████ ██\n █▒ ░███████████████▀▒▒░░ ▒▒▒▒║║║▒";▓▓~` ░░▒▀▀██████ ██▄ ████ ██\n██ ██████████████▀░░░ ;.╠▓!▒║`╠%@▓║,. ░░░▒▀███████████████ ██\n█ ▀███████████▀▒░░ ▫;.▪~▓▓║ ░▒▓▓║ ░░▒▓▓█████████████ ██\n ██████████▀▓▒░░ .',▪;▒;▓║ ╠▒▓║║ ░░░▒▓████████████ ██\n █ █████████▀▒░░░ ` '╠░▒▓║ ╠║║║║ ░░░▒▓██████████▓ ██\n█ ████████▀▓░▒░ ╠║║▓║ ╠║║║║ ░░▒▒▀█████████▀ ██\n██ ░████████▓▒░░▒░ ▫ ╠║║║║ ╠║║║║ ░░▒░░▒▀█████████ ██\n██ ░███████▓▒░ ░░▒░ ╠║║║║ ╠║║║║ ░ ░▒░ ░▒▓█████████ ██\n██ ░███████▓▒░ ░▒░ ░ ╠║║║║ ╠║║║║ ░ ░▒░ ░▒████████▓ ██\n██ ▒███████▒░ ░▒░░ ░░ ╠║║║║ ╠║║║║ ░ ░░▒░ ░▒▓███████▓ ██\n██ ▓███████▓▒░ ░▒░. . .,-'/,-╙╨╨╨╜-╙╨╨╨╜-;. .. . // ░▒░ ░░▒▓███████▀ ██\n██ ▓███████▓▒░ ░▒░░░▄░ ▄▄ ░ `"' ' "'~." ' ░▄▄▄░░ ░░░▒░ ▒▓▒▓████████ ██\n██ ████████▓▓▒░ ░▄▄██████████▓░ ░▄▄░███████▄░▓░░░░ ░▒▓▓███████▄ ██\n██ ███████▓▓▓▒░█████▒█▓▀▀▀███▄█░ ▒█▄█▄███████▓███▓▄░▒▓▓▓▓████████ ██\n██ ▀███████▓▒▒░███████████▓▄▀██▄▀░ ▒▓███████████▄██████ ▒▓▓████████ ██\n██ ████████▓▒░██▓▀█▒█▀█▄▀████▄██▄▀░░ ▒▓████▀██████▄███▄█▄▀ ▒▓████████ ██\n██ ████████▓▓▒██▄▓██ ███▒██▀████▀▒░ ▄████████████████▀█▄ ▒▒▒████████ ██\n██ █████████▀▒░▀████████████▄███▓▒░ ▀████▀██████▄█████▄█▀▒▀▓████████ ██\n██ ▀████████▓▒▒▀██████████████▀▀░ ▄▓▄▄▒ █████▓██████████▄▓▒ ▒█████████ ██\n██ █████████▓▓░██▀███▀██████▓▀░ ▄█████▄ ▓██████▄██▄███▄█▀ ▄████████ ██\n██ ████████▓▓▒▓ ▀ ▓█ ▀▀▀██▀▀▀ ▄██████▄▒ ▀▀█████▀▒███▀█▒ ▒███████▀ ██\n██ ███████▀▓▒░ ▒▒░ ░ ▀█████████▓▒ ░ ░▀▀▀▀ ░▒ ▒ ▒██████▒ ██\n██ ██████▓▒░░ ░░▒░ ▒░ █ █████▀███▀▒ ▒░ ░ ▒▄██████▓ ██\n██ ███████▄▓▒░ ░ ▒▓▒ ░ ▄▄██▄█████▓▒ ░▒▓▒▒ ░░▒ ▒ ▒▄▄█████████ ██\n██ ██████████▄▒▄▓▓▒░▒ ░▒▓▓▒░ ▀▀█████▀█▀▒ ░▒▓▓▒▒ ░▒ ▄█▓██████████ ██\n██ █████████▓▓▓▀▀██▄▄░▒▓▓▒░ ▒▀▀ ▀▀ ▀ ░▒▓▓▓▒ ▒ ▄▀█▀▓▓▒██████████ ██\n██ █████████▓▓▒▓▒ ▄▄ ▀▀▄ ░ ░ ░▒▒▄▀█▄█▄ ▓ ███████████ ██\n██ ██████████▄▄▒ ▒ ▀▒ ░ ░▄█▓▓▒░▀ ▒ ▄███████████▓ ██\n██ ████████████▄▒ ▄ █▒▒ ▄▄░▄█ ▄ █▄█ ██▄▄██▄ ██▓▒░ ░ ▒ █████████████▒ ██\n██ █████████████▀▒ ▒ ▄█▀▒▀▄▓▀██▄ ██▄█▓█▄▄█▄▄▓▄▀██▓▒░ ▀ ▒▀████████████░ ██\n██ ██████████████▓▒ ▒ ▀███▄██▄████▓██▄██████████▄██░ ▀ ░▒▄█████████████░ ██\n██ ███████████████▓▒░ ▀ ▒▀▀▓█▀▀▀ ▀▀▀▀ ▀▀▀ #x▀▀ ▀▀▀▒ ▀█▀ ▒ ██████████████ ██\n██ ▄███████████████▓▒░ ▀ ▄▄▄▄% ` , '` .`. ^` .▄ ▄▄▓░▄▀ ▒ ▓████████████░ █ \n██ ▄██████████████▒ ░ ████▓▄ ~ / / *;.▄█▓███▓░ ▒ █░████████████ ██\n██ █▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▒ ░▒ ████▓▒ &` `. ` , ▒▓▄███▓▒ ░▒ ▓█▓▓▓▓▓▓▓▓▓▓▓▓▓░░██\n██ ▀▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▒ ░▒ ▀██████▄ `` `▄▄ ▄▄▒█████▀ ▒░ ▓▄▓▓▓▓▓▓▓▓▓▓▓▓▓░ ▀\n██ █▒▒▒▒▒▒▒ ♥ ▒▒▒█▄▓▓▒ ░▒ ▒▀████▓██▄██▀██▀█▓████▀ ░ ▒ ▓▄▓▒▒▒▒▒░▒▒▒▒░░░░░ ▄█\n██ █▒▒▒▒▒ ♀ ░ ♂ ▒▒▀▀▄▓▒░ ▒░░▒▀█████▀▀█▒▀▓▒▄███▀▒ ▒ ▓█▀▒▒▒▒▒▒▒▒▒░░░ ░ █\n██ █░░░░░ ▄ █ ▄ ░░░░░█▄▒ ▒ ░░▒▒▄ ▓▀█▄█▒▄▄▓█▒▀░░ ░░▒ ▓▄█░░░░░░█▄▄░░░░░░░░░ ▄█\n██ █░ ░ █▀█▀█ ░░░░█▒▒ ░░░░ ▒▀▒▒▀ ░ ░▄▒ ▓▄▀░░ ░░░░█ ▀▀▀█▄█ ░░░██\n██ █ ░ ▄█▄ ▄█▄ ▄█▄ ░ ▀█▒ ░░░ ░ ▄ ░ ▓▀ ░ /█▐▄▄ ▌█∖ █▄\n██ █ █▀ ▀▀█▄█▀▀ ▀█ ░ ▀██▓▒ ▒▒ ▒░ ▄▄▀ ░ ░ ▐▄▐ █▀∖ ▀▀▄█ ∖ ░ ██\n██ █░ █ ╬ ▀█▀ ╬ █░ ▀█▓▄▒ ▒▒▒▒▒▒▒▒▄ ▄█▀ ▒ ▒/▐/▐ █▐ ∖/ ▌█ ∖. ▀█\n██ █ ▀█ █ █ █ █▀ ░ ░ ▀█▒▄ ▄▄▄▄▄▄▄▀ ░ ░▒▄█▄▄▐▄▐ █▐░░∖░▌█░▒░∖▒██\n██ █ █▄█▄█▄█▄█ ░ ░ ~^~ ~~▀▐██▓█▐█▄▄∖▌█ ~ ~∖██\n██ █ ░▀██▄█▄█▄██▀ ░ ░ ░ ^ ~ ~~ ^ ▐~▐▀█▐█▓█▓▄█~ ~~ ∖█\n██ █ ░ ░ ~ ~ ~~^ ~ ^~^~ █▐▀███▓█∖▄▄~~ ∖\n██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀ ▀▀▀▀▀▀▀▀ ▀ ~ ~~^ ~ ~ ^~~ ~~ ~█▐^~▀██▓█▓▓▓▄██\n█████████████████████████████████████████▀██▀ ▀██▀██▄▄███▀█▄███▐██▀███▓▓▓▓▓▓█\n</pre>\n</div>\n</html>
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Conservatory]]\n\n<html>\n<iframe class="dropshadow" width="420" height="315" src="http://www.youtube.com/embed/d0tP4iLlBp4" frameborder="0" allowfullscreen></iframe><br />\n<br />\nAalborg, Denmark • July 24, 2009<br />\nVisuals by <a href="http://www.no-carrier.com/" target=_blank>NO CARRIER</a>\n</html>
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Conservatory]]\n\n<html>\n<iframe class="dropshadow" width="560" height="315" src="http://www.youtube.com/embed/znnaW61ASWk" frameborder="0" allowfullscreen></iframe><br />\n<br />\nTokyo, Japan • October 23, 2011<br />\nVisuals by <a href="http://m7kenji.com/" target=_blank>m7kenji</a>\n</html>\n
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Conservatory]]\n\n<html>\n<iframe class="dropshadow" width="560" height="315" src="http://www.youtube.com/embed/g_a3IXWu86g" frameborder="0" allowfullscreen></iframe><br />\n<br />\nBrooklyn, NY • August 23, 2014<br />\nVisuals by <a href="http://www.saraludy.com" target=_blank>Sara Ludy</a>\n</html>
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Gallery]]\n\n<html>\n<center>\n<table border=0 align=center valign=middle cellspacing=0>\n<COLGROUP> \n <COL WIDTH="475"> \n <COL WIDTH="50"> \n <COL WIDTH="475"> \n</COLGROUP> \n<tr>\n<td><img src="img/crucifixion-on-the-court/francis-bacon-01.jpg" class="crucifixion-image dropshadow" /></td>\n<td></td>\n<td><img src="img/crucifixion-on-the-court/nba-2k15-01.jpg" class="crucifixion-image dropshadow" /></td>\n</tr></table>\n\n<BR><BR><BR><BR><BR>\n\n<table border=0 align=center valign=middle cellspacing=0>\n<COLGROUP> \n <COL WIDTH="475"> \n <COL WIDTH="50"> \n <COL WIDTH="475"> \n</COLGROUP> \n<tr>\n<td><img src="img/crucifixion-on-the-court/francis-bacon-02.jpg" class="crucifixion-image dropshadow" /></td>\n<td></td>\n<td><img src="img/crucifixion-on-the-court/nba-2k15-02.jpg" class="crucifixion-image dropshadow" /></td>\n</tr></table>\n\n<BR><BR><BR><BR><BR>\n\n\n<table border=0 align=center valign=middle cellspacing=0>\n<COLGROUP> \n <COL WIDTH="475"> \n <COL WIDTH="50"> \n <COL WIDTH="475"> \n</COLGROUP> \n<tr>\n<td><img src="img/crucifixion-on-the-court/francis-bacon-03.jpg" class="crucifixion-image dropshadow" /></td>\n<td></td>\n<td><img src="img/crucifixion-on-the-court/nba-2k15-03.jpg" class="crucifixion-image dropshadow" /></td>\n</tr></table>\n</center>\n</html>
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Gallery]]\n\n<html>\n<center>\n<img class="cult-image dropshadow" src="http://www.datacorruption.org/img/computers_cult/residual-aura-of-leaked-document.gif"><br />\n\n<img class="cult-image dropshadow" src="http://www.datacorruption.org/img/computers_cult/hypersigil_for_preservation_of_decaying_memories.gif"><br />\n</center>\n</html>
<html>\n<img class="zone-image dropshadow" src="img/gallery.gif">\nWELCOME TO THE GALLERY<br />\n<br />\nTradition says the future is a LOVE-LETTER-FOR-YOU.txt.vbs, hand-crafted by artists. But emotions are problematizing scenarios when <a href="http://www.alldistancesreducedtozero.net" target=_blank>all distances are reduced to zero</a></html>. Reality is an endless plane on which mankind takes selfies, an away game that often culminates in [[crucifixion on the court|Crucifixion]]. The brief flicker of, LQQK RaRe OoP BEYONCE DNA ETERNITY SERVER <html><a href="http://www.b-a-b-e-l.net" target=_blank>BABEL</a>, shimmers across your screen. OK, the future eats only violence. They say you were here today, <a href="http://www.watchingtheheavens.com" target=_blank>watching the heavens</a>. The soft glow of your password in the age of lost dreams, a utopian social network where literally everyone is a Zero Day exploit. <a href="http://www.nsa-seo.com" target=_blank>NSA/SEO</a>. Terrifying.<br />\n<br />\nThis could have been your neurological system, adorned with <a href="http://www.enduringpotential.net" target=_blank>enduring potential</a>. You should spend a few minutes trying to see how death is before committing to it, usually. The last time we were here you learned how to be left behind. My precious <a href="http://www.wavemuse.net" target=_blank>wave muse</a></html>, who was always by my side in the surf. Glad we got to see each other after school at [[computers club|Computers Club]], grasping for the future, as you said. Another CPU cycle, another [[decade|Decade]]. Time is the most gentle, beautiful way toward injury or death. For real. \n\nFacebook is just a subjective illusion anyway. Endless repetition of broken [[_patt_rNs|Patterns]]. Hail satan, canyon.mid forever and ever amen. Let's go back home to our [[phone arts|Phone Arts]], fingers running across the cracked screen. It's really dark. I can tell you need someone. Opting-out of this one? this one? this one? I've survived this <html><a href="http://www.voidgaze.net" target=_blank>void gaze</a></html> before, with nothing more than a deleted left shoulder and indecipherable messages from the [[computers cult|Computers Cult]]. If you were here. If you were hardware. I'd be down.\n\nMovements through the boundaries of <html><a href="http://www.datacorruption.org/projects/unicode_cruciforms/" target=_blank>unicode cruciforms</html>.\n\nStrange feeling here.
body {\n background:LightGrey;\n color: #666666;\n font-family: Courier New, Courier, monospace;\n font-size: 10pt;\n line-height: 115%;\n letter-spacing: -0.8pt;\n margin: auto;\n padding: 8px;\n padding-left: 20px;\n padding-right: 20px;\n}\n#passages {\n margin: auto;\n border: 0;\n padding: 0;\n}\n.header, .footer {\n border: 1px inset;\n margin: 0.5rem auto;\n}\n.passage {\n font: inherit;\n line-height: inherit;\n margin: auto;\n}\n.passage ul {\n padding: 0;\n text-align: left;\n}\n.passage li {\n display:inherit;\n margin: 0;\n}\na, #sidebar #snapback, #sidebar #restart, #sidebar #share, .menu div {\n font-weight:inherit !important;\n text-decoration: underline !important;\n color: #00F !important;\n}\na.visited {\n color: #7F007F;\n}\n#sidebar {\n font: inherit !important;\n position:static;\n width: auto;\n list-style: disc outside;\n}\n#sidebar ul {\n padding: inherit;\n}\n#sidebar li {\n color: inherit;\n text-align:inherit;\n margin:inherit;\n display:inline;\n}\n#sidebar #titleSeparator {\n display:none;\n}\n#sidebar #title, #sidebar #title:hover {\n color:inherit;\n}\n#sidebar #storyTitle, #sidebar #storyTitle:hover {\n font-size: 2rem;\n margin: .67rem 0;\n font-weight:bold;\n}\n#sidebar #storySubtitle {\n font-size: inherit;\n font-weight:bold;\n}\n#sidebar #storyAuthor::before {\n content: "by ";\n}\n#sidebar #storyAuthor {\n font-size:medium;\n display:block;\n font-weight:bold !important;\n}\n#sidebar #credits {\n display:block;\n font-size: smaller;\n padding: inherit;\n}\n#snapbackMenu::before {\n content: "Rewind to:";\n font-weight:bold;\n}\n#shareMenu::before {\n content: "Share this story at:";\n font-weight:bold;\n}\n.menu::before {\n content: "Rewind to:";\n font-weight:bold;\n}\n.menu, .menu div:hover {\n position: static;\n background-color:inherit;\n color:inherit;\n opacity:1;\n border:0;\n font:inherit;\n line-height:inherit;\n}\n.menu div {\n margin: 0 1.12rem;\n display: list-item;\n list-style:disc outside;\n}\n\n#top-content {\n position: relative;\n margin-top: -133px;\n margin-left: 160px;\n margin-bottom: 20px;\n}\n\n.zone-image {\n float: left;\n margin-bottom: 8px;\n margin-right: 20px;\n}\n\n#social-icons {\n position: relative;\n margin-top: -15px;\n margin-left: 115px;\n}\n\n#social-icons img {\n margin-right: 4px;\n}\n\npre {\n font-family: Courier New, Courier, monospace;\n font-size: 10pt;\n line-height: 115%;\n letter-spacing: -0.8pt;\n}\n\n.arrow-icon {\n font-size: 12pt;\n}\n\n.dropshadow {\n -moz-box-shadow: 6px 6px 20px #666; /* Firefox */\n -webkit-box-shadow: 6px 6px 20px #666; /* Safari/Chrome */\n box-shadow: 6px 6px 20px #666; /* Opera and other CSS3 supporting browsers */\n -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=6, Direction=135, Color='#666666')";/* IE 8 */\n : progid:DXImageTransform.Microsoft.Shadow(Strength=6, Direction=135, Color='#666666');/* IE 5.5 - 7 */ \n}\n\n.footer {\n display: none;\n}\n\n.content {\n margin-top: 21px;\n}\n\n.gallery-image {\n margin-bottom: 200px;\n}\n\n.cult-image {\n margin-bottom: 200px;\n background: #000000;\n padding: 50px;\n}\n\n.crucifixion-image {\n margin-bottom: 200px;\n background: #ffffff;\n padding: 50px;\n}\n\n.unicode-container {\n position: relative;\n padding: 0px;\n margin: auto;\n color: #000000;\n background-color: #ffffff;\n width: 534px;\n}\n\n.pattern9-container {\n width: 893px;\n height: 585px;\n background-color: #ffffff;\n padding-left: 110px;\n padding-right: 20px;\n padding-top: 18px;\n padding-bottom: 20px;\n}\n\n.glitch {\n -webkit-animation: noise-anim 2s infinite linear alternate-reverse;\n}\n\n@-webkit-keyframes noise-anim {\n 0% {\n clip: rect(61px, 9999px, 138px, 0);\n left: -2px; }\n 5% {\n clip: rect(50px, 9999px, 92px, 0);\n left: -9px; }\n 10% {\n clip: rect(61px, 9999px, 140px, 0);\n left: -2px; }\n 15.0% {\n clip: rect(5px, 9999px, 13px, 0);\n left: -4px; }\n 20% {\n clip: rect(64px, 9999px, 106px, 0);\n left: -2px; }\n 25% {\n clip: rect(54px, 9999px, 70px, 0);\n left: -3px; }\n 30.0% {\n clip: rect(32px, 9999px, 122px, 0);\n left: -7px; }\n 35% {\n clip: rect(32px, 9999px, 98px, 0);\n left: 0px; }\n 40% {\n clip: rect(86px, 9999px, 99px, 0);\n left: -9px; }\n 45% {\n clip: rect(65px, 9999px, 111px, 0);\n left: -6px; }\n 50% {\n clip: rect(49px, 9999px, 107px, 0);\n left: -8px; }\n 55.0% {\n clip: rect(47px, 9999px, 59px, 0);\n left: -4px; }\n 60.0% {\n clip: rect(62px, 9999px, 35px, 0);\n left: -1px; }\n 65% {\n clip: rect(54px, 9999px, 15px, 0);\n left: -9px; }\n 70% {\n clip: rect(37px, 9999px, 30px, 0);\n left: -6px; }\n 75% {\n clip: rect(67px, 9999px, 92px, 0);\n left: -7px; }\n 80% {\n clip: rect(82px, 9999px, 115px, 0);\n left: -3px; }\n 85.0% {\n clip: rect(18px, 9999px, 28px, 0);\n left: -4px; }\n 90% {\n clip: rect(45px, 9999px, 55px, 0);\n left: 0px; }\n 95% {\n clip: rect(15px, 9999px, 133px, 0);\n left: -1px; }\n 100% {\n clip: rect(55px, 9999px, 44px, 0);\n left: -2px; } \n}
<html><span class="arrow-icon">↫</span></html> Take me back to the [[Conservatory]]\n\n<html>\n<pre>\n////////////////////////////////////////////////////////\n//// NSF PLAYBACK CARTRIDGE GUIDE //////////////////////\n//// by nullsleep //////////////////////////////////////\n//// version 1.0 /////////// product of 8bitpeoples ////\n//////////////////////////// Research & Development ////\n////////////////////////////////////////////////////////\n\n\n*******************************************************************************\n** OBJECTIVE ******************************************************************\n*******************************************************************************\n\nThis document is aimed at providing all the information necessary to playback \nNSF files on an actual NES, rather than through the use of an emulator. First, \nthe assembly code for a simple NSF player engine will be covered and explained.\nFollowing this, there will be an overview outlining the light hardware hacking \naspect involved. Specifically, the modification of an existing NES cartridge \nin order to accomodate the NSF playback code.\n\nThanks: Bananmos, Memblers, Andy Gunn, Cory Arcangel, Brad Taylor, Kevin Horton\n\n\n*******************************************************************************\n** SOFTWARE: NSF PLAYBACK CODE ************************************************\n*******************************************************************************\n\nThe code below was written for x816 assembler, which can be found with a quick \nweb search or simply by going to nesdev.parodius.com and downloading it there. \nIf you are more comfortable using a different assembler, you should not have \nmuch trouble converting the code over to fit its requirements.\n\nThis first group of settings is required by x816 assembler:\n\n; *** X816 SETTINGS ***\n .mem 8 ; 8-bit memory mode\n .index 8 ; 8-bit index mode\n .opt on ; address optimize\n\nNext the code is initialized to start at the load address MINUS $80. The load \naddress can be found in the NSF header at offset 0008 and is 2 bytes long. The \nreason why $80 is subtracted from the load address is because the NSF header \nitself is 128 (or $80 in hex) bytes long. If $80 was not subtracted the music \ndata would actually be loaded at an address 128 bytes after the correct load \naddress. So for example, if the load address specified at offset 0008 in the \nNSF header was 8080, then it would be appropriate to .org $8000 thereby putting \nthe actual music data at $8080. Once the code is initialized to start at the \ncorrect address, simply include the NSF file. Note that since x816 is a DOS \nprogram, the filename for the NSF should be a maximum of 8 characters (not \nincluding the file extension).\n\n .org $---- ; replace dashes with load address MINUS $80\n .incbin "chip.nsf" ; include NSF tune \n\nInitializing the NES is the next step, this portion of code defines what will \nhappen when the NES is reset and is simply standard practice. The decimal flag \nis cleared (cld) and interrupts are disabled (sei). The next two instructions \ndisable vblank interrupts, specifically, the most significant bit of $2000 is \nused to either enable(1) or disable(0) these interrupts. Address $2000 is the \nfirst of two PPU (picture processing unit) control registers, mostly used when \ndealing with graphics, however its being used here since vblank interrupts will \nbe providingthe correct timing for our music playback.\n\nReset_Routine:\n cld ; clear decimal flag\n sei ; disable interrupts\n lda #%00000000 ; disable vblank interrupts by clearing\n sta $2000 ; the most significant bit of $2000\n\nThe next few lines of code give the PPU (pixel processing unit) of the NES some\ntime to initialize. Although this code segment may not be required when using \nan emulator, it is integral to getting the replay routine running correctly on \nthe real hardware. Additionally, if graphics are to be displayed, waiting for \nvblank becomes even more important. This is because vblank is the period of \ntime in between frames, and this is the only time during which graphics should \nbe loaded to be displayed. Without this precaution, graphics on the screen may \nbecome corrupted.\n\n; *** WAIT 2 VBLANKS ***\nWaitV1: \n lda $2002 ; give the PPU a little time to initialize\n bpl WaitV1 ; by waiting for a vblank\nWaitV2: \n lda $2002 ; wait for a second vblank to be safe\n bpl WaitV2 ; and now the PPU should be initialized\n\nThe following chunk of code is responsible for clearing all the sound registers\nof the NES. Generally, this may not actually be necessary because it should \nalready be taken care of by the code in the NSF itself. However, it cannot \nreally do any harm, so look at it as good practice. Registers $4000-$4003 are \nassociated with the first pulse wave channel, $4004-$4007 with the second pulse\nwave channel, $4008-$400B with the triangle wave channel, and $400C-$400F with \nthe noise channel. The Clear_Sound loop below simply steps through each of \nthese registers and sets them to $00. First the accumulator and x are loaded \nwith $00, then the accumulator value ($00) is stored in address $4000 at the \noffset of the x value (currently $00), then inx increments x, and cpx #$0F \ncompares the x value to the value $0F, finally the bne statement branches back \nto the Clear_Sound label if these values are not equal. Once $4000-$400F have \nbeen cleared program execution continues downward. The remaining registers from\n$4010 to $4013 are all associated with the delta modulation channel (DMC) and \nare initialized according to values found in the NSF specification by Kevin \nHorton. Check Brad Taylor's DMC documentation for details on what each of these\nregisters control.\n\n; *** CLEAR SOUND REGISTERS ***\n lda #$00 ; clear all the sound registers by setting\n ldx #$00 ; everything to 0 in the Clear_Sound loop\nClear_Sound:\n sta $4000,x ; store accumulator at $4000 offset by x\n inx ; increment x\n cpx #$0F ; compare x to $0F\n bne Clear_Sound ; branch back to Clear_Sound if x != $0F\n\n lda #$10 ; load accumulator with $10\n sta $4010 ; store accumulator in $4010\n lda #$00 ; load accumulator with 0\n sta $4011 ; clear these 3 registers that are \n sta $4012 ; associated with the delta modulation\n sta $4013 ; channel of the NES\n\nThe following instructions are responsible for enabling the sound channels of \nthe NES. Address $4015 acts as a channel enable register when being written to,\nwith the bit 0 corresponding to the first square channel, bit 1 the next square\nchannel, bit 2 the triangle wave channel, bit 3 the noise channel, and bit 4 is\nused to control DMC operation. The remaining bits 5 through 7 are unused (in \nterms of $4015 as a write register). So, setting the 4 least significant bits \nto 1, thereby enables all sound channels of the NES except the delta modulation\nchannel. The DMC is disabled to avoid the possibility of sample playback before\nthe song begins playing.\n\n; *** ENABLE SOUND CHANNELS ***\n lda #%00001111 ; enable all sound channels except\n sta $4015 ; the delta modulation channel\n\nAnytime a write to $4017 occurs, the frame counter and clock divider are reset.\nThe following lines of code are necessary for synchronizing the sound playback \nroutine to the internal timing of the NES sound hardware.\n\n; *** RESET FRAME COUNTER AND CLOCK DIVIDER ***\n lda #$C0 ; synchronize the sound playback routine \n sta $4017 ; to the internal timing of the NES\n\nThe next three lines of code carry out some of the final steps of the playback \nsetup. First, the accumulator is loaded with the song number to be played back.\nThe numbering starts at 00, so for a single song NSF file, this first line \nshould be set to lda #$00. Next set x to $00 for NTSC or $01 for PAL. Finally, \njsr to the init address. This is found at offset 000A in the NSF header and is \n2 bytes long. Keep in mind that because it is 2 bytes, when looking at it in a \nhex editor, the low byte will be followed by the high byte. So for example, if \nthe 2 bytes at offset 000A in the hex editor are 16 8A, the 16-bit address that \nthis represents for jsr to jump to is $8A16.\n\n; *** SET SONG # & PAL/NTSC SETTING ***\n lda #$-- ; replace dashes with song number\n ldx #$-- ; replace with $00 for NTSC or $01 for PAL\n jsr $---- ; replace dashes with init address\n\nNext, vblank interrupts are enabled by setting the most significant bit of \naddress $2000 and program execution drops into an infinite jmp loop. The rest \nof the program code will be located in the NMI routine.\n\n; *** ENABLE VBLANK NMI ***\n lda #%10000000 ; enable vblank interrupts by setting the \n sta $2000 ; most significant bit of $2000\n\nLoop:\n jmp Loop ; loop loop loop loop ...\n\nThe NMI routine is where program execution jumps to whenever a non-maskable \ninterrupt occurs. By enabling the vblank interrupts above, this routine will be\ncalled at either 60Hz (NTSC) or 50Hz (PAL), making it useful for maintaining \nthe correct timing in playing back the NSF. First $2002 is read, this is the \nPPU status register, and reading it resets the vblank flag. Next $2000, the \nfirst PPU control register is cleared, and then the most significant bit of it \nis again set to enable vblank interrupts. Now the NSF playback is achieved by\nsetting jsr to jump to the play address found at offset 000C in the NSF header. \nRemember that, like the load and init addresses, this is a 16-bit address and \nso, when looking at it in the hex editor the low byte will be followed by the \nhigh byte. Finding a value of 84 80 in the editor means jsr should point to \n$8084. Finally, rti returns from the interrupt routine.\n\nNMI_Routine:\n lda $2002 ; read $2002 to reset the vblank flag\n lda #%00000000 ; clear the first PPU control register \n sta $2000 ; writing 0 to it\n lda #%10000000 ; reenable vblank interrupts by setting\n sta $2000 ; the most significant bit of $2000\n jsr $---- ; replace dashes with play address\n rti ; return from interrupt routine\n\nThe remainder of the code is simply necessary for all NES programs. The IRQ \nroutine contains a single statement, rti, because it is not necessary to have \nanything occur during an IRQ since we are using the NMI routine for playback. \nFinally, we pad the code out to location $FFFA and setup the interrupt vectors.\n\nIRQ_Routine:\n rti ; return from interrupt routine\n\n.pad $FFFA\n .dw NMI_Routine ; setup the NMI vector at $FFFA\n .dw Reset_Routine ; setup the Reset vector at $FFFC\n .dw IRQ_Routine ; setup the IRQ vector at $FFFE\n\nThat finishes the software section of this NSF playback guide. While the amount\nof information above might be overwhelming if you have never done any assembly \nprogramming (or NES programming) before, it is really not very complex code at \nall. If you are having trouble understanding certain parts of it, grab some \nadditional documents from nesdev.parodius.com and give it another read. I hope \nthat this guide gives a nice start for some beginners but keep in mind that the\nreal fun in NES development is the joy of discovering things for yourself.\n\n\n*******************************************************************************\n** HARDWARE: MODIFYING THE CARTRIDGE ******************************************\n*******************************************************************************\n\nThe hardware modification aspect of creating the NSF playback cartridge is very\nstraightforward. However, it does require a bit of equipment that the average \nperson may not just have laying around. The required equipment is as follows:\n\nNES game cartridge (mapper 0)\nScrewdriver (may require special Nintendo screw bit)\nSmall Cutters (for clipping the pins on the PRG ROM)\nSoldering Iron & Solder\nDe-Soldering Braid (or other implement for De-Soldering)\n28-pin EPROM socket (low-profile ZIF socket recommended)\n28-pin EPROM (32k or larger recommended)\n28-pin EPROM programmer\nEPROM eraser (you will probably want one of these too)\n\nFirst off, the NES cartridge you modify should be a mapper 0 cartridge. This is\nbasically the simplest cartridge format, it contains no memory mapping hardware\nand is essentially just 2 ROM chips stuck to a board. The game cartridge that \nI would recommend is Super Mario Bros. (NOT the Super Mario Bros./Duck Hunt\ndual game cartridges) since it tends to be easy to find and available cheap. \nSome other possibilities are Arkanoid, Elevator Action, Excitebike, Ice Hockey, \nand Joust among others. The rest of the equipment on the list should be readily\navailable from most electronics component suppliers.\n\n1. Open the Cartridge\nBegin by opening up the game cartridge. Inside there will be a small circuit \nboard, much smaller than the game casing itself. It should look something like \nwhat you see below:\n\n ________________________________________\n | |\n |' __ '|\n |' | | |``````````````| |``````````````| |\n | | | | CHR ROM | | PRG ROM | |\n | | | |______________| |______________| |\n | '--' `````````````` `````````````` |\n |_ _|\n | |\n |||||||||||||||||||||||||||||||||||||||||||\n\n\n2. Remove the PRG ROM\nThe CHR ROM on the left contains graphics data and the PRG ROM on the right \ncontains all the program code. It is the PRG ROM that will need to be removed \nand replaced with an EPROM. Begin by clipping all the pins of the PRG ROM and \nremoving the chip. Next use the de-soldering braid and the soldering iron to \nsoak up the solder around the remaining lengths of pin sticking through the \nboard. Once most of the solder around the pins has been removed, it should be \npossible to push/pull/knock out the pins so there are holes in the board that \nare clear and ready to receive the socket.\n\n3. Solder the Socket\nPlace the pins of the socket into the place left by the PRG ROM. Next, solder \nthe socket into place. This is basically the extent of modification necessary \nto the cartridge. Mapper 0 cartridges do not require any pin reconfigurations, \nsince the mapping for the removed ROM and replacement EPROM is identical.\n\n4. Write Data to the EPROM\nThe final step is to use the EPROM programmer to first blank check the EPROM \nand then write to it with the compiled program code. If everything was done \nproperly, the EPROM can then be placed into the socket, the cartridge inserted \ninto the NES, and the lovely sounds of the NSF will fill the air!\n\n- EOF -------------------------------------------------------------------------\n\n../Nullsleep\n../www.8bitpeoples.com\n../www.nullsleep.com\n\nIf you find any errors in this document or have any suggestions or requests for\nadditions, please contact me: nullsleep@8bitpeoples.com\n</pre>\n</html>