http://blea.ch/wiki/api.php?action=feedcontributions&user=Eris&feedformat=atomProjectWiki - User contributions [en]2024-03-19T02:59:17ZUser contributionsMediaWiki 1.18.1http://blea.ch/wiki/index.php/PH_MeterPH Meter2020-08-16T21:23:54Z<p>Eris: </p>
<hr />
<div><big>pH Meter</big><br />
==What is this?==<br />
Here is a simple pH meter that uses standard pH probes. This is a quick unfinished afterthought to the [[PPM_Meter]] article. (u_u~feel free to make additions or corrections.) It describes how to use a standard and pretty cheap (like $10-$40) pH meter probe and make a simple meter or microcontroller interface. <br />
<br />
==Probe==<br />
[[Image:PHProbe.JPG|right|thumb|120px|Typical pH Probe]]<br />
A pH probe works something like a little battery powered by the test solution. In a neutral solution the pH probe would generate 0v. An acidic sample would generate a positive voltage proportional to the ionic strength of the sample being measuring. A basic solution does the same except resulting in a negative voltage output. <br />
<br />
So, a standard pH Probe generates a voltage either positive or negative proportional to the acidity or alkalinity (baseyness) of whatever its testing.<br />
<br />
It does this using this fascinating thing called [http://en.wikipedia.org/wiki/Glass_electrode Glass Electrode]. It has this little ball (see pic!) at the tip with a special pH glass. The probe's output is fed through a shielded cable into the amplifier. Shielding is needed because the extremely low voltages and currents involved are easily are susceptible to noise.<br />
<br />
The output of this probe is very small, very low current (extremely high impedance), varies a lot between probes (even by the same manufacturer) and is affected by the room temperature. It requires additional circuitry process the signal and give some type of usable output.<br />
<br />
Ok, so why not just MAKE a pH probe?? Good question! Tbhnfirly. Seem to remember something about using two dissimilar metals to power a clock from potatoes which seems as if it may work, have not actually tried it... ~_~<br />
<br />
==Amplifier==<br />
[[Image:PH-sch-only.jpg|400px|thumb|right|Simple pH Meter amp. [[:Image:PH-sch.jpg|Click here for full Version w/notes!!]]]]<br />
The circuit here will allow adjusting for probe and temperature variants and produce output in Volts/pH or ADC compatible ranges.<br />
* Volts/pH configuration: output will be between 0 and 14Volts with the voltage directly representing the pH value. (Such as: 3.4volts out would equal pH of 3.4) This is most useful if you want to plug it directly into a volt meter.<br />
* ADC configuration: output will be between 0 and 5V for interfacing with an ADC or microcontroller's input range.<br />
<br />
It uses op-amp U1a to amplify and buffer the high impedance signal from the probe and adjust the slope which is done by adjusting the gain loop. The output of this stage if adjusted properly would be beetween -7v to+7v with -8 being pH of 14 and +7 being pH of 0. What is needed is for this voltage to be inverted and offset, and both those tasks are accomplished using op-amp-u1b. The output at this stage should be 0 to 14FV indicating the pH of the sample being tested.<br />
<br />
<s>Prolly should note that the circuit has no AC noise limiting, this could be a problem if the probe is located near electromagnetic sources such as pump motors. If you get sporadic readings might try a .1uF or so capacitor across R3. Being in the gain loop of U1b it will work as a integrator and easily pass DC such as the probe reading, while nullifying AC signals. </s> Capacitor C1 was added to the circuit diagram for this function. :D<br />
<br />
==Microcontroller Stuffs==<br />
If using in ADC mode, you can use the microcontroller to scale/offset. just set the offset a little above 0v and set 7pH to be about 2.5v. Then use the controller to sample the offset and scale test solutions, then calculate the ph of test sample. Like this for fixed point maths:<br />
<br />
<source lang="c"><br />
/* zero (7pH) ph meter */<br />
void c_zeroPh(void) {<br />
m_cfg.phoset=delayADC(ADC_CH1);<br />
meterSave(); // save settings to eeprom<br />
}<br />
<br />
/* calibrate ph to 4.0 solution */<br />
void c_scalePh(void) { <br />
m_cfg.phscale=((long)(delayADC(ADC_CH1)-m_cfg.phoset)*10000)/-300;<br />
meterSave(); // save settings to eeprom<br />
}<br />
<br />
void c_readPh(void) {<br />
long pH;<br />
pH=((long)(delayADC(ADC_CH1,)-m_cfg.phoset)*10000/m_cfg.phscale)+700; // read the results<br />
printf("pH: %2i.%02i\r\n",(int)pH/100,(int)pH-(int)((pH/100)*100));<br />
}<br />
</source><br />
<br />
==Temperature Compensation==<br />
Really need to add temp compensation to this project. Here is a simple [[Temperature_probe|Temperature_probe circuit proposed by ElAmpo]]<br />
<br />
seems to change by about .10pH for ever 5F change in temp. Need to research this more.</div>Erishttp://blea.ch/wiki/index.php/Talk:PPM_MeterTalk:PPM Meter2020-08-16T21:20:32Z<p>Eris: </p>
<hr />
<div>Due to insane amounts of nearly daily spammage this page has been moved..... <br />
<br />
#REDIRECT [[Talk:PPM Meter Alt]]<br />
<br />
==PPM Meter Discussion==<br />
This page is for:<br />
* questions<br />
* comments<br />
* etc...<br />
<br />
==Temperature Compensation==<br />
Has anyone added a temperature compensation function yet??<br />
<br />
'''Shure, why not...'''<br />
<br />
Moved this to its own page [[Temperature_probe]] May 31 2009 >:D [[User:Wikisysop|Wikisysop]]<br />
<br />
==Interesting reader comments on probe design==<br />
Got this in an email, seems useful so posting here:<br />
<br />
"I want to measure conductivity in limewater (for a marine fish tank), so I want an electrode for highly conductive solutions (around 10mS/cm).<br />
<br />
After a bit of thought, I used two propelling pencil leads (0.7mm diameter) - I needed only a few mm exposed spaced by say 5mm. Readings after a few months are stable, so graphite leads seem ok for this application. (And to calibrate, just draw a line to make the electrode shorter!)<br />
<br />
Clearly they're not suitable for everything, but they are readily available."<br />
<br />
== thanks... ==<br />
<br />
seems you're good not only in electronic stuff but also in water analysis... :)<br />
<br />
Thanks for such informative and helpful project.<br />
<br />
any update on those meters?<br />
<br />
like to see your project.......possible?<br />
<br />
how's your old meter?<br />
<br />
tc.<br />
* thanks for the encouragement. ^_^ I was considering the other night posting the complete source code for the meter. As far as updates, since the meter is working for the moment I've been using it without much changes. Would really like to add in the temperature compensation circuit provided by ElAMPO, for temperature compensation on the pH/PPM readings. :D Hmmz, lastly been using the meter pictured on the page since 2006. Thx again, ~ eris - 2009/03/13<br />
<br />
== Is There a Trick to Zeroing ==<br />
<br />
Hi,<br />
<br />
I'm trying to build the conductivity meter but am having trouble getting it to zero. I adjust v2 to midrange (using a meter) and then try to adjust v3 to get pin 14 to read 0 volts. I can't get any closer than -1.87.<br />
<br />
V3 is about a 20 turn resister and V2 is probable about 10 so I should have good resolution.<br />
<br />
Is there a trick to zeroing it (the first time)<br />
<br />
Thanks<br />
<br />
* hmmz, it should zero... If its otherwise reading okai u may try increasing value of r15 to 100K or a little more. Also check the power supply voltages are symmetrical (should be +/- same voltage) Lemme know if this helps. @_@ [[User:Wikisysop|Wikisysop]]<br />
<br />
== Marine Aquarium Salinity Controller ==<br />
<br />
Hi Isabella,<br />
<br />
I was looking for conductivity controllers on the internet and came across your site. AWESOME!<br />
<br />
The only problem I'm coming across is getting a cheap 12V dual pole power supply. I have a design for one, but it's much more complicated than the meter circuit itself. Do you think a power supply for a computer would work? The one I'm looking at is only $15. Its outputs include an 18A +12V source and a 1.0A -12V source.<br />
<br />
TIA for any thoughts.<br />
<br />
If you are interested, here is what I am up to:<br />
<br />
I am going to try to build a conductivity meter to automate the tedious process of making the salt solution for a marine aquarium. The idea is to start with a very strong salt solution, and have the meter control a reverse osmosis water supply. At or below a certain salinity, the RO supply will automatically switch off. I'll hold the temperature constant with an aquarium heater, killing two birds with one stone: I have to heat the water to 80° anyway before adding it to the aquarium, plus keeping the temperature constant might make a temperature compensation circuit unnecessary for this application. I will circulate the water with a small submersible pump (a powerhead if you're into aquariums). The RO water supply creates purified water so slowly (10 gallons a day) that the concentration should increase slowly and steadily. <br />
<br />
The graphite probe lead* idea posted above is great! That has been one of my biggest hurdles. I bought a surplus commercial probe and experimented with it years ago, but it had a bunch of mystery leads, and I couldn't sort out how to use it in my own circuit. None of the other home-made probes I tried seemed to work. I never could really make a circuit that gave any kind of readable, consistent results. I did manage to burn out a lot of op-amps, though. : (<br />
<br />
If all of that works out, this could be taken farther. The entire process of adding make up water (because of evaporation) and doing weekly 10% water changes could be automated. There would have to be some redundant built-in safeties so nothing could get locked on, which could create a flood or, even worse, kill everything in the tank.<br />
<br />
<br />
Thanks for all of the excellent information you have posted. Posting all that info looks like quite a bit of work!<br />
<br />
Sincerely<br />
<br />
Jerm<br />
<br />
* would that be a lead lead? <br />
<br />
* hmmz, hey, thanks for the interest.. often wonder if anyone reads this stuff hehe. Well making a +/-12V supply should be pretty simple. A center tapped transformer, bridge rectifier, two 3300uf or so caps for filtering, a 7812, 7912, (these are very simple 3 pin +12 and -12 volt regulator ICs) and then two smaller output caps. Something like this: [http://www.reconnsworld.com/power/multipowersupply.gif http://www.reconnsworld.com/power/multipowersupply.gif] Except without the bottom part.<br />
<br />
I used an old modem power supply that happened to have +/-12v and +5v which was perfect for running the controller as well as the ppm circuit. The PSU u described would work, but 18amps seems greatly overkill, the circuit uses less than an amp. If you just want to get things working might try an old PC PSU.<br />
<br />
Good luck, if have anymore questions lemme know ^^<br />
<br />
== Stainless steel probe ==<br />
<br />
Hi there,<br />
<br />
My name is Daniel and i'm a electronics/microcontrollers entusiast.<br />
I've found you project very interesting.<br />
I've also come across a web site mentioning that commercial ppm meters use staineless steel probes, and i'm in the process of experimenting with a homemade one.<br />
<br />
I'm building a probe thats very similar at least it looks similar to the ones in those cheap comercial ppm meters. A friend of mine will machine a piece of PVC to shape the probe, and i'm thinking of using staineless steel screws with the screw head removed (a 35mm M4 CHC cutted to make it smaller). They have a threaded part and a non threaded part and it will be the non threaded part that will come in contact with the solution to me mesured.<br />
<br />
I was wondering if anyone has tried this because stainless steel screws are cheap and easy to find. It is also easy to make the connections and it is very robust.<br />
<br />
I'll post here what results i'll find with this kind of probe. It will take me a couple of weeks because i have other projects going on.<br />
<br />
Keep up the good work :)<br />
<br />
* Thanks! will be interesting to see how this works out. ^^ [[User:Eris|eris]]<br />
<br />
== Split Rail ==<br />
<br />
I was researching for a way to measure water conductivity and I stumble upon your project. I've decided to give it a try but I have no experience with op amps.<br />
<br />
One of questions I have is whether its possible to power the circuit with a rail splitter such as this:<br />
[[Image:Sijosae-rail-splitter.png]]<br />
<br />
Lastly, is there a way to check the oscillation without using an oscilloscope? Maybe a pair of leds?<br />
<br />
Thanks!</div>Erishttp://blea.ch/wiki/index.php/Talk:PPM_Meter_AltTalk:PPM Meter Alt2020-08-16T21:19:52Z<p>Eris: </p>
<hr />
<div>==PPM Meter Discussion==<br />
This page is for:<br />
* questions<br />
* comments<br />
* etc...<br />
<br />
==Temperature Compensation==<br />
Has anyone added a temperature compensation function yet??<br />
<br />
'''Shure, why not...'''<br />
<br />
Moved this to its own page [[Temperature_probe]] May 31 2009 >:D [[User:Wikisysop|Wikisysop]]<br />
<br />
==Interesting reader comments on probe design==<br />
Got this in an email, seems useful so posting here:<br />
<br />
"I want to measure conductivity in limewater (for a marine fish tank), so I want an electrode for highly conductive solutions (around 10mS/cm).<br />
<br />
After a bit of thought, I used two propelling pencil leads (0.7mm diameter) - I needed only a few mm exposed spaced by say 5mm. Readings after a few months are stable, so graphite leads seem ok for this application. (And to calibrate, just draw a line to make the electrode shorter!)<br />
<br />
Clearly they're not suitable for everything, but they are readily available."<br />
<br />
== thanks... ==<br />
<br />
seems you're good not only in electronic stuff but also in water analysis... :)<br />
<br />
Thanks for such informative and helpful project.<br />
<br />
any update on those meters?<br />
<br />
like to see your project.......possible?<br />
<br />
how's your old meter?<br />
<br />
tc.<br />
* thanks for the encouragement. ^_^ I was considering the other night posting the complete source code for the meter. As far as updates, since the meter is working for the moment I've been using it without much changes. Would really like to add in the temperature compensation circuit provided by ElAMPO, for temperature compensation on the pH/PPM readings. :D Hmmz, lastly been using the meter pictured on the page since 2006. Thx again, ~ eris - 2009/03/13<br />
<br />
== Is There a Trick to Zeroing ==<br />
<br />
Hi,<br />
<br />
I'm trying to build the conductivity meter but am having trouble getting it to zero. I adjust v2 to midrange (using a meter) and then try to adjust v3 to get pin 14 to read 0 volts. I can't get any closer than -1.87.<br />
<br />
V3 is about a 20 turn resister and V2 is probable about 10 so I should have good resolution.<br />
<br />
Is there a trick to zeroing it (the first time)<br />
<br />
Thanks<br />
<br />
* hmmz, it should zero... If its otherwise reading okai u may try increasing value of r15 to 100K or a little more. Also check the power supply voltages are symmetrical (should be +/- same voltage) Lemme know if this helps. @_@ [[User:Wikisysop|Wikisysop]]<br />
<br />
== Marine Aquarium Salinity Controller ==<br />
<br />
Hi Isabella,<br />
<br />
I was looking for conductivity controllers on the internet and came across your site. AWESOME!<br />
<br />
The only problem I'm coming across is getting a cheap 12V dual pole power supply. I have a design for one, but it's much more complicated than the meter circuit itself. Do you think a power supply for a computer would work? The one I'm looking at is only $15. Its outputs include an 18A +12V source and a 1.0A -12V source.<br />
<br />
TIA for any thoughts.<br />
<br />
If you are interested, here is what I am up to:<br />
<br />
I am going to try to build a conductivity meter to automate the tedious process of making the salt solution for a marine aquarium. The idea is to start with a very strong salt solution, and have the meter control a reverse osmosis water supply. At or below a certain salinity, the RO supply will automatically switch off. I'll hold the temperature constant with an aquarium heater, killing two birds with one stone: I have to heat the water to 80° anyway before adding it to the aquarium, plus keeping the temperature constant might make a temperature compensation circuit unnecessary for this application. I will circulate the water with a small submersible pump (a powerhead if you're into aquariums). The RO water supply creates purified water so slowly (10 gallons a day) that the concentration should increase slowly and steadily. <br />
<br />
The graphite probe lead* idea posted above is great! That has been one of my biggest hurdles. I bought a surplus commercial probe and experimented with it years ago, but it had a bunch of mystery leads, and I couldn't sort out how to use it in my own circuit. None of the other home-made probes I tried seemed to work. I never could really make a circuit that gave any kind of readable, consistent results. I did manage to burn out a lot of op-amps, though. : (<br />
<br />
If all of that works out, this could be taken farther. The entire process of adding make up water (because of evaporation) and doing weekly 10% water changes could be automated. There would have to be some redundant built-in safeties so nothing could get locked on, which could create a flood or, even worse, kill everything in the tank.<br />
<br />
<br />
Thanks for all of the excellent information you have posted. Posting all that info looks like quite a bit of work!<br />
<br />
Sincerely<br />
<br />
Jerm<br />
<br />
* would that be a lead lead? <br />
<br />
* hmmz, hey, thanks for the interest.. often wonder if anyone reads this stuff hehe. Well making a +/-12V supply should be pretty simple. A center tapped transformer, bridge rectifier, two 3300uf or so caps for filtering, a 7812, 7912, (these are very simple 3 pin +12 and -12 volt regulator ICs) and then two smaller output caps. Something like this: [http://www.reconnsworld.com/power/multipowersupply.gif http://www.reconnsworld.com/power/multipowersupply.gif] Except without the bottom part.<br />
<br />
I used an old modem power supply that happened to have +/-12v and +5v which was perfect for running the controller as well as the ppm circuit. The PSU u described would work, but 18amps seems greatly overkill, the circuit uses less than an amp. If you just want to get things working might try an old PC PSU.<br />
<br />
Good luck, if have anymore questions lemme know ^^<br />
<br />
== Stainless steel probe ==<br />
<br />
Hi there,<br />
<br />
My name is Daniel and i'm a electronics/microcontrollers entusiast.<br />
I've found you project very interesting.<br />
I've also come across a web site mentioning that commercial ppm meters use staineless steel probes, and i'm in the process of experimenting with a homemade one.<br />
<br />
I'm building a probe thats very similar at least it looks similar to the ones in those cheap comercial ppm meters. A friend of mine will machine a piece of PVC to shape the probe, and i'm thinking of using staineless steel screws with the screw head removed (a 35mm M4 CHC cutted to make it smaller). They have a threaded part and a non threaded part and it will be the non threaded part that will come in contact with the solution to me mesured.<br />
<br />
I was wondering if anyone has tried this because stainless steel screws are cheap and easy to find. It is also easy to make the connections and it is very robust.<br />
<br />
I'll post here what results i'll find with this kind of probe. It will take me a couple of weeks because i have other projects going on.<br />
<br />
Keep up the good work :)<br />
<br />
* Thanks! will be interesting to see how this works out. ^^ [[User:Eris|eris]]<br />
<br />
== Split Rail ==<br />
<br />
I was researching for a way to measure water conductivity and I stumble upon your project. I've decided to give it a try but I have no experience with op amps.<br />
<br />
One of questions I have is whether its possible to power the circuit with a rail splitter such as this:<br />
[[Image:Sijosae-rail-splitter.png]]<br />
<br />
Lastly, is there a way to check the oscillation without using an oscilloscope? Maybe a pair of leds?<br />
<br />
Thanks!</div>Erishttp://blea.ch/wiki/index.php/Lymellons_diseaseLymellons disease2020-06-12T01:22:18Z<p>Eris: /* 2015: Exploring the association between Morgellons and Lyme */</p>
<hr />
<div><big>FUCK U LYME CAUSING BACTERIA - AND FUCK U TOO CDC, AND A SPECIAL HEART FELT FUUUUUCK YOU TO THE AMA - PISS OFF ASSHOLES!</big><br />
__TOC__<br />
<br />
==2015: Exploring the association between Morgellons and Lyme==<br />
https://bmcdermatol.biomedcentral.com/articles/10.1186/s12895-015-0023-0<br />
<br />
Exploring the association between Morgellons disease and Lyme disease: identification of Borrelia burgdorferi in Morgellons disease patients<br />
Morgellons disease (MD) is a complex skin disorder characterized by ulcerating lesions that have protruding or embedded filaments. Many clinicians refer to this condition as delusional parasitosis or delusional infestation and consider the filaments to be introduced textile fibers. In contrast, rece...<br />
<br />
==2018: Study of Persistent Lyme Patients== <br />
2018:<br />
https://www.mdpi.com/2227-9032/6/2/33/htm <br />
===Verifying Borella Presence===<br />
Study cites above paper, noting that 2 of it's study subjects (All previously diagnosed clinically as positive for burgdoff borrella spirochete bacteria and previously treated for Lyme with no resolution to symptoms) presented also definitive Morgellons dermal filiments and lesions (which tested positive for the bacteria)<br />
Persistent Borrelia Infection in Patients with Ongoing Symptoms of Lyme Disease<br />
Introduction: Lyme disease is a tickborne illness that generates controversy among medical providers and researchers. One of the key topics of debate is the existence of persistent infection with the Lyme spirochete, Borrelia burgdorferi, in patients who have been treated with recommended doses of a...<br />
<br />
===Morgellons Symptoms in two Patients===<br />
Two of the study's participants diagnosed as having Lyme were additionally found to Morgellons type dermal lesions - from which samples were taken confirming presence of dermal borella spirochets and further strengthening Lyme / Morgellons association.<br />
<br />
<br />
==2019: State of the Art==<br />
2019: <br />
https://parasitesandvectors.biomedcentral.com/articles/10.1186/s13071-019-3495-7<br />
<br />
State of the art from what i've seen. Brings everything together, describes mechanisms, forms, for why it's PITA to cure.. and most notably cites from several studies on methods to eradicate the various forms - wat works wat doesnt - and best they found ---[[User:Eris|Eris]] 03:44, 8 June 2020 (UTC)> 'Pulsed Antibiotic therapy' <[[User:Eris|Eris]]--- however was shown to ill 100% of bacterial forms only in the lab (in vivo) so theoretically...<br />
Metamorphoses of Lyme disease spirochetes: phenomenon of Borrelia persisters<br />
The survival of spirochetes from the Borrelia burgdorferi (sensu lato) complex in a hostile environment is achieved by the regulation of differential gene expression in response to changes in temperature, salts, nutrient content, acidity fluctuation, multiple host or vector dependent factors, and le...<br />
<br />
<br />
<br />
==Pulsed Antibiotic Thearapy==<br />
===and lastly THIS FUKR!===<br />
https://www.treatlyme.net/guide/lyme-pulse-antibiotics <--- who seems to know his shit - and outlines a practical pulse regimine even - like any doctor or anyone who can find the meds can do it - so he isnt like milking it for $$$ he seems to just wanna dissemenate what he finds to be effective treatment<br />
<br />
===Practical Antibiotic Regime===</div>Erishttp://blea.ch/wiki/index.php/Lymellons_diseaseLymellons disease2020-06-12T01:21:50Z<p>Eris: /* 2015: Exploring the association between Morgellons and Lyme */</p>
<hr />
<div><big>FUCK U LYME CAUSING BACTERIA - AND FUCK U TOO CDC, AND A SPECIAL HEART FELT FUUUUUCK YOU TO THE AMA - PISS OFF ASSHOLES!</big><br />
__TOC__<br />
<br />
==2015: Exploring the association between Morgellons and Lyme==<br />
https://bmcdermatol.biomedcentral.com/articles/10.1186/s12895-015-0023-0<br />
Exploring the association between Morgellons disease and Lyme disease: identification of Borrelia burgdorferi in Morgellons disease patients<br />
Morgellons disease (MD) is a complex skin disorder characterized by ulcerating lesions that have protruding or embedded filaments. Many clinicians refer to this condition as delusional parasitosis or delusional infestation and consider the filaments to be introduced textile fibers. In contrast, rece...<br />
<br />
==2018: Study of Persistent Lyme Patients== <br />
2018:<br />
https://www.mdpi.com/2227-9032/6/2/33/htm <br />
===Verifying Borella Presence===<br />
Study cites above paper, noting that 2 of it's study subjects (All previously diagnosed clinically as positive for burgdoff borrella spirochete bacteria and previously treated for Lyme with no resolution to symptoms) presented also definitive Morgellons dermal filiments and lesions (which tested positive for the bacteria)<br />
Persistent Borrelia Infection in Patients with Ongoing Symptoms of Lyme Disease<br />
Introduction: Lyme disease is a tickborne illness that generates controversy among medical providers and researchers. One of the key topics of debate is the existence of persistent infection with the Lyme spirochete, Borrelia burgdorferi, in patients who have been treated with recommended doses of a...<br />
<br />
===Morgellons Symptoms in two Patients===<br />
Two of the study's participants diagnosed as having Lyme were additionally found to Morgellons type dermal lesions - from which samples were taken confirming presence of dermal borella spirochets and further strengthening Lyme / Morgellons association.<br />
<br />
<br />
==2019: State of the Art==<br />
2019: <br />
https://parasitesandvectors.biomedcentral.com/articles/10.1186/s13071-019-3495-7<br />
<br />
State of the art from what i've seen. Brings everything together, describes mechanisms, forms, for why it's PITA to cure.. and most notably cites from several studies on methods to eradicate the various forms - wat works wat doesnt - and best they found ---[[User:Eris|Eris]] 03:44, 8 June 2020 (UTC)> 'Pulsed Antibiotic therapy' <[[User:Eris|Eris]]--- however was shown to ill 100% of bacterial forms only in the lab (in vivo) so theoretically...<br />
Metamorphoses of Lyme disease spirochetes: phenomenon of Borrelia persisters<br />
The survival of spirochetes from the Borrelia burgdorferi (sensu lato) complex in a hostile environment is achieved by the regulation of differential gene expression in response to changes in temperature, salts, nutrient content, acidity fluctuation, multiple host or vector dependent factors, and le...<br />
<br />
<br />
<br />
==Pulsed Antibiotic Thearapy==<br />
===and lastly THIS FUKR!===<br />
https://www.treatlyme.net/guide/lyme-pulse-antibiotics <--- who seems to know his shit - and outlines a practical pulse regimine even - like any doctor or anyone who can find the meds can do it - so he isnt like milking it for $$$ he seems to just wanna dissemenate what he finds to be effective treatment<br />
<br />
===Practical Antibiotic Regime===</div>Erishttp://blea.ch/wiki/index.php/Lymellons_diseaseLymellons disease2020-06-12T01:21:34Z<p>Eris: </p>
<hr />
<div><big>FUCK U LYME CAUSING BACTERIA - AND FUCK U TOO CDC, AND A SPECIAL HEART FELT FUUUUUCK YOU TO THE AMA - PISS OFF ASSHOLES!</big><br />
__TOC__<br />
<br />
==2015: Exploring the association between Morgellons and Lyme==<br />
https://bmcdermatol.biomedcentral.com/articles/10.1186/s12895-015-0023-0<br />
Exploring the association between Morgellons disease and Lyme disease: identification of Borrelia burgdorferi in Morgellons disease patients<br />
Morgellons disease (MD) is a complex skin disorder characterized by ulcerating lesions that have protruding or embedded filaments. Many clinicians refer to this condition as delusional parasitosis or delusional infestation and consider the filaments to be introduced textile fibers. In contrast, rece...<br />
<br />
<br />
<br />
<br />
==2018: Study of Persistent Lyme Patients== <br />
2018:<br />
https://www.mdpi.com/2227-9032/6/2/33/htm <br />
===Verifying Borella Presence===<br />
Study cites above paper, noting that 2 of it's study subjects (All previously diagnosed clinically as positive for burgdoff borrella spirochete bacteria and previously treated for Lyme with no resolution to symptoms) presented also definitive Morgellons dermal filiments and lesions (which tested positive for the bacteria)<br />
Persistent Borrelia Infection in Patients with Ongoing Symptoms of Lyme Disease<br />
Introduction: Lyme disease is a tickborne illness that generates controversy among medical providers and researchers. One of the key topics of debate is the existence of persistent infection with the Lyme spirochete, Borrelia burgdorferi, in patients who have been treated with recommended doses of a...<br />
<br />
===Morgellons Symptoms in two Patients===<br />
Two of the study's participants diagnosed as having Lyme were additionally found to Morgellons type dermal lesions - from which samples were taken confirming presence of dermal borella spirochets and further strengthening Lyme / Morgellons association.<br />
<br />
<br />
==2019: State of the Art==<br />
2019: <br />
https://parasitesandvectors.biomedcentral.com/articles/10.1186/s13071-019-3495-7<br />
<br />
State of the art from what i've seen. Brings everything together, describes mechanisms, forms, for why it's PITA to cure.. and most notably cites from several studies on methods to eradicate the various forms - wat works wat doesnt - and best they found ---[[User:Eris|Eris]] 03:44, 8 June 2020 (UTC)> 'Pulsed Antibiotic therapy' <[[User:Eris|Eris]]--- however was shown to ill 100% of bacterial forms only in the lab (in vivo) so theoretically...<br />
Metamorphoses of Lyme disease spirochetes: phenomenon of Borrelia persisters<br />
The survival of spirochetes from the Borrelia burgdorferi (sensu lato) complex in a hostile environment is achieved by the regulation of differential gene expression in response to changes in temperature, salts, nutrient content, acidity fluctuation, multiple host or vector dependent factors, and le...<br />
<br />
<br />
<br />
==Pulsed Antibiotic Thearapy==<br />
===and lastly THIS FUKR!===<br />
https://www.treatlyme.net/guide/lyme-pulse-antibiotics <--- who seems to know his shit - and outlines a practical pulse regimine even - like any doctor or anyone who can find the meds can do it - so he isnt like milking it for $$$ he seems to just wanna dissemenate what he finds to be effective treatment<br />
<br />
===Practical Antibiotic Regime===</div>Erishttp://blea.ch/wiki/index.php/Lymellons_diseaseLymellons disease2020-06-08T03:44:56Z<p>Eris: Created page with "<big>FUCK U LYME CAUSING BACTERIA - AND FUCK U TOO CDC, AND A SPECIAL HEART FELT FUUUUUCK YOU TO THE AMA - PISS OFF ASSHOLES!</big> __TOC__ 2015: https://bmcdermatol.biomedc..."</p>
<hr />
<div><big>FUCK U LYME CAUSING BACTERIA - AND FUCK U TOO CDC, AND A SPECIAL HEART FELT FUUUUUCK YOU TO THE AMA - PISS OFF ASSHOLES!</big><br />
__TOC__<br />
<br />
2015:<br />
https://bmcdermatol.biomedcentral.com/articles/10.1186/s12895-015-0023-0<br />
Exploring the association between Morgellons disease and Lyme disease: identification of Borrelia burgdorferi in Morgellons disease patients<br />
Morgellons disease (MD) is a complex skin disorder characterized by ulcerating lesions that have protruding or embedded filaments. Many clinicians refer to this condition as delusional parasitosis or delusional infestation and consider the filaments to be introduced textile fibers. In contrast, rece...<br />
bmcdermatol.biomedcentral.com<br />
Isabella<br />
<br />
<br />
==2018: Study of Persistent Lyme Patients== <br />
2018:<br />
https://www.mdpi.com/2227-9032/6/2/33/htm <br />
===Verifying Borella Presence===<br />
Study cites above paper, noting that 2 of it's study subjects (All previously diagnosed clinically as positive for burgdoff borrella spirochete bacteria and previously treated for Lyme with no resolution to symptoms) presented also definitive Morgellons dermal filiments and lesions (which tested positive for the bacteria)<br />
Persistent Borrelia Infection in Patients with Ongoing Symptoms of Lyme Disease<br />
Introduction: Lyme disease is a tickborne illness that generates controversy among medical providers and researchers. One of the key topics of debate is the existence of persistent infection with the Lyme spirochete, Borrelia burgdorferi, in patients who have been treated with recommended doses of a...<br />
mdpi.com<br />
===Morgellons Symptoms in two Patients===<br />
Two of the study's participants diagnosed as having Lyme were additionally found to Morgellons type dermal lesions - from which samples were taken confirming presence of dermal borella spirochets and further strengthening Lyme / Morgellons association.<br />
<br />
<br />
==2019: State of the Art==<br />
2019: <br />
https://parasitesandvectors.biomedcentral.com/articles/10.1186/s13071-019-3495-7<br />
<br />
State of the art from what i've seen. Brings everything together, describes mechanisms, forms, for why it's PITA to cure.. and most notably cites from several studies on methods to eradicate the various forms - wat works wat doesnt - and best they found ---[[User:Eris|Eris]] 03:44, 8 June 2020 (UTC)> 'Pulsed Antibiotic therapy' <[[User:Eris|Eris]]--- however was shown to ill 100% of bacterial forms only in the lab (in vivo) so theoretically...<br />
Metamorphoses of Lyme disease spirochetes: phenomenon of Borrelia persisters<br />
The survival of spirochetes from the Borrelia burgdorferi (sensu lato) complex in a hostile environment is achieved by the regulation of differential gene expression in response to changes in temperature, salts, nutrient content, acidity fluctuation, multiple host or vector dependent factors, and le...<br />
parasitesandvectors.biomedcentral.com<br />
Isabella<br />
<br />
<br />
<br />
==Pulsed Antibiotic Thearapy==<br />
===and lastly THIS FUKR!===<br />
https://www.treatlyme.net/guide/lyme-pulse-antibiotics <--- who seems to know his shit - and outlines a practical pulse regimine even - like any doctor or anyone who can find the meds can do it - so he isnt like milking it for $$$ he seems to just wanna dissemenate what he finds to be effective treatment<br />
<br />
===Practical Antibiotic Regime===</div>Erishttp://blea.ch/wiki/index.php/Template:HlTemplate:Hl2020-06-07T05:25:35Z<p>Eris: Created page with "<span style="background:{{{2|yellow}}}">{{{1}}}</span>"</p>
<hr />
<div><span style="background:{{{2|yellow}}}">{{{1}}}</span></div>Erishttp://blea.ch/wiki/index.php/Template:HighlightTemplate:Highlight2020-06-07T05:25:05Z<p>Eris: </p>
<hr />
<div><span style="background:{{{2|yellow}}}">{{{1}}}</span></div>Erishttp://blea.ch/wiki/index.php/Template:HighlightTemplate:Highlight2020-06-07T05:18:32Z<p>Eris: </p>
<hr />
<div>{{#if:{{{3|}}}|{{#ifexpr:({{#time:U|{{{3}}}}} - {{#time:U|now}}) > 0|{{highlight/core|{{{1|}}}|{{#ifeq:{{{2|}}}||yellow|{{{2}}}}}}}|{{{1|}}}}}|{{highlight/core|{{{1|}}}|{{{2|yellow}}}}}}}</div>Erishttp://blea.ch/wiki/index.php/Template:HighlightTemplate:Highlight2020-06-07T05:15:41Z<p>Eris: Created page with "{{#if:{{{3|}}}|{{#ifexpr:({{#time:U|{{{3}}}}} - {{#time:U|now}}) > 0|{{highlight/core|{{{1|}}}|{{#ifeq:{{{2|}}}||yellow|{{{2}}}}}}}|{{{1|}}}}}|{{highlight/core|{{{1|}}}|{{{2|y..."</p>
<hr />
<div>{{#if:{{{3|}}}|{{#ifexpr:({{#time:U|{{{3}}}}} - {{#time:U|now}}) > 0|{{highlight/core|{{{1|}}}|{{#ifeq:{{{2|}}}||yellow|{{{2}}}}}}}|{{{1|}}}}}|{{highlight/core|{{{1|}}}|{{{2|yellow}}}}}}}<noinclude>{{documentation}}</noinclude></div>Erishttp://blea.ch/wiki/index.php/Template:Highlight/coreTemplate:Highlight/core2020-06-07T05:14:33Z<p>Eris: Created page with "<span style="background:{{{2|yellow}}}">{{{1}}}</span>"</p>
<hr />
<div><span style="background:{{{2|yellow}}}">{{{1}}}</span></div>Erishttp://blea.ch/wiki/index.php/File:FatigueinMilitaryAviation--AnOverviewofU.S.Military-ApprovedPharmacologicalCountermeasures.pdfFile:FatigueinMilitaryAviation--AnOverviewofU.S.Military-ApprovedPharmacologicalCountermeasures.pdf2020-01-10T23:35:33Z<p>Eris: Fatigue in Military Aviation--An Overviewof U.S. Military - Approved Pharmacological Countermeasures.pdf
Exellent Info on benefits of Amphetamines vs. Drawbacks</p>
<hr />
<div>Fatigue in Military Aviation--An Overviewof U.S. Military - Approved Pharmacological Countermeasures.pdf<br />
<br />
Exellent Info on benefits of Amphetamines vs. Drawbacks</div>Erishttp://blea.ch/wiki/index.php/File:Phenthylamine_Position_reference_0.1.pngFile:Phenthylamine Position reference 0.1.png2020-01-10T23:33:26Z<p>Eris: DO NOT USE!!! Has 'ToDos'...</p>
<hr />
<div>DO NOT USE!!! Has 'ToDos'...</div>Erishttp://blea.ch/wiki/index.php/MusicsMusics2020-01-08T05:50:26Z<p>Eris: /* Assorted Newer Stuffs */</p>
<hr />
<div><big>'''My musics ♪( ^-^)ノ☆♪'''</big><br />
__TOC__<br />
==What is it?==<br />
Here are mp3s, plz enjoy. <br />
<br />
==Assorted Newer Stuffs==<br />
My Soundcloud: <br />
[https://soundcloud.com/erisuhime My SoundCrowd]<br />
<br />
My YouTubes (Formally named 'Forbidden Magic'):<br />
[https://www.youtube.com/channel/UCALq1y1GOB8QB35HOUUZ_bQ My YouTube]<br />
<br />
* Todo: Add 8bit, compo sites if u can find them<br />
<br />
==Early Gamey Stuff==<br />
Most here is highly Influenced by if not transcriptions/arrangements of music from the Zun's Touhou series of games... particularly from the first five games which ran on the PC-98.. Aka 'the music of the Yougakudan':<br />
<br />
===WTF is a Tofu?===<br />
"Many years ago in Gensokyo, there was a band known as the Yougakudan which dearly loved FM synthesis. Yougaku" refers to a type of music that is in danger of disappearing from today's world, FM synthesis." - Xlated quote from [https://touhou.fandom.com/wiki/Akyu%27s_Untouched_Score_vol.1 Akyu's Untouched Score Vol. 1 CD]<br />
<br />
The PC-98 utilized a Yamaha YMBlahblha IC which featured a 3 channel PSG synth and 3 channels of FM systhesis (OPL-N flavor'd). The 3 PSG channels were very similar tonally to the ubiquitious AY-8-8910 3 channel PSG IC used in countless hundreds of arcade games in the 1980s [https://www.youtube.com/watch?v=TNc7VdD-ink Gyruss - Had Six AY-3-8910s!!], and etc...<br />
<br />
===Blah, blah, blah...===<br />
☆ [http://blea.ch/~eris/litter/mrvainvstouhou101.mp3 Mr.Vain Vs. Touhou]<br><br />
Dear friend of mine sent me the old 1990's techno hit Mr. Vain, which brought back flood of memories.. I started playing along with it and thought o wow i should make a Touhou style version, and here it is. Hope you find it amusing I do. :D<br />
<br />
[http://blea.ch/~eris/litter/tx81z+sk88pro-2.4-clip.mp3 Tx81Z Test]<br><br />
I just bought a used Yamaha TX81Z FM Tone Module and this is first song I created with it. I need practice editing the sounds more. It comes preset with a lot of rather boring plain tones. Think this turned out okay for first attempt with new sounds. <br />
<br />
☆ [http://blea.ch/~eris/litter/omg-1.1.mp3 OMG!]<br><br />
Made this one ~ July 2010. Really like how it turned out, is very well planned. <br />
<br />
☆ [http://blea.ch/~eris/litter/wtg-3.mp3 WayToGo!]<br><br />
This is one I am very happy with, especially the ending which u can hear <br />
[http://blea.ch/~eris/litter/wtg-endingnosquares.mp3 Just the here w/out the squarewaves,]<br />
ALL done on SC-88Pro.<br />
<br />
[http://blea.ch/~eris/litter/lotus_land_story_final-eq.mp3 Lotus Land Story]<br><br />
title track from Touhou04 Lotus Land Story. Rendered on SK-88Pro. Agonized over this one for a while as it is one of my favorites, finished it months ago but only now listening to it again and isn't so bad. ^_^;<br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/eternalofshrinemaiden2.1-eq-dyn.mp3 Eternal Shrine Maiden.mp3 (Alt. Arrange)]<br><br />
''Alternate arrange'' ... Pleasing sounding sk88pro arrangement of ESM with nice ending. <br><br />
☆ [http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.mp3 Eternal Shrine Maiden.mp3 (Synth Arrange)] or <br />
[http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.flac (Synth Arrange lossless .flac)]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on SK-88Pro. This is a re-recording made after cleaning up my sound system and noticing the previous release sounded horrible. u_u;; Less distortion now than [http://blea.ch/~eris/litter/eternalofshrinemaiden4.mp3 original release.] and also changed the drums quite a bit. May make one more go at it this time with particular attention to making the instruments more distinct. <br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/maple%20dream%20ds%20psg.0.3.5.mp3 Maple Dream]<br><br />
Another MML, this time an arrangement of the Maple Dream off the Phantasmagoria of Dim. Dream soundtrack. Rendered on Nintendo DS. Think this one turned out quite well!☆ ^__^<br><br />
* [http://blea.ch/~eris/litter/mapledream.bdt .bdt for NDS_BGMFILER].<br />
* [http://blea.ch/~eris/litter/mapledream.mml.txt MML source file].<br />
<br />
<br />
[http://blea.ch/~eris/litter/Pyongyang%20Solstice.mp3 Pyongyang Solstice]<br><br />
Sorta rockish sounding song made in late december. <br />
<br />
<br />
[http://blea.ch/~eris/litter/incomplete%20happiness.0.6.mp3 Incomplete Happiness]<br><br />
Excited about getting an SK-88pro synth, made this.<br />
<br />
<br />
[http://blea.ch/~eris/litter/eternalshrinemaiden-nds-psg.mp3 Eternal Shrine Maiden PSG]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on NDS using the NDS_BGMDRV.<br />
* [http://blea.ch/~eris/litter/eternalofshrinemaiden.bdt bdt data file] that may be played using [http://meraman.dip.jp/index.php?NDS_BGMFILER NDS_BGMFILER]. <br />
* [http://blea.ch/~eris/litter/eternalshrinemaiden3.mml.txt mml source].<br />
<br />
<br />
Errata:<br />
* [http://blea.ch/~eris/litter/idgi3.0.mp3 I Dont Get it.mp3]<br />
* [http://blea.ch/~eris/litter/BlackTheCandle2.mp3 Black Candle.mp3]<br />
* [http://blea.ch/~eris/litter/hmmmz4.4.mp3 hmmm.mp3]<br />
* [http://blea.ch/~eris/litter/nfi4.1.mp3 N.F.I.mp3]<br />
<br />
[http://blea.ch/~eris/litter/hmmmz4.4.mp3 SongNAme]<br><br />
This song is an attempt at creating a Touhouish style composition entirely from scratch. Saying attempt because I feel it falls short, but somehow it persuades me to post itself here. <br />
<br />
[http://blea.ch/~eris/litter/myfirst.mml.mp3 Myfirst.mml]<br><br />
My first experiment in MML, rendered on Nintendo DS. More information [[Thds#2008.10.19_.7E_MML_rant|here]]. ^^<br />
<br />
☆ = songs I likes the best :D<br />
<br />
==Older Than Above==<br />
Here are old music page. Songs here are from between 1994 to 2005.<br />
[http://www.octiva.net/planks/ Old music page here]<br></div>Erishttp://blea.ch/wiki/index.php/MusicsMusics2020-01-08T05:50:11Z<p>Eris: /* Early Gamey Stuff */</p>
<hr />
<div><big>'''My musics ♪( ^-^)ノ☆♪'''</big><br />
__TOC__<br />
==What is it?==<br />
Here are mp3s, plz enjoy. <br />
<br />
==Assorted Newer Stuffs==<br />
My Soundcloud: <br />
[https://soundcloud.com/erisuhime My SoundCrowd]<br />
My YouTubes (Formally named 'Forbidden Magic'):<br />
[https://www.youtube.com/channel/UCALq1y1GOB8QB35HOUUZ_bQ My YouTube]<br />
<br />
* Todo: Add 8bit, compo sites if u can find them<br />
<br />
==Early Gamey Stuff==<br />
Most here is highly Influenced by if not transcriptions/arrangements of music from the Zun's Touhou series of games... particularly from the first five games which ran on the PC-98.. Aka 'the music of the Yougakudan':<br />
<br />
===WTF is a Tofu?===<br />
"Many years ago in Gensokyo, there was a band known as the Yougakudan which dearly loved FM synthesis. Yougaku" refers to a type of music that is in danger of disappearing from today's world, FM synthesis." - Xlated quote from [https://touhou.fandom.com/wiki/Akyu%27s_Untouched_Score_vol.1 Akyu's Untouched Score Vol. 1 CD]<br />
<br />
The PC-98 utilized a Yamaha YMBlahblha IC which featured a 3 channel PSG synth and 3 channels of FM systhesis (OPL-N flavor'd). The 3 PSG channels were very similar tonally to the ubiquitious AY-8-8910 3 channel PSG IC used in countless hundreds of arcade games in the 1980s [https://www.youtube.com/watch?v=TNc7VdD-ink Gyruss - Had Six AY-3-8910s!!], and etc...<br />
<br />
===Blah, blah, blah...===<br />
☆ [http://blea.ch/~eris/litter/mrvainvstouhou101.mp3 Mr.Vain Vs. Touhou]<br><br />
Dear friend of mine sent me the old 1990's techno hit Mr. Vain, which brought back flood of memories.. I started playing along with it and thought o wow i should make a Touhou style version, and here it is. Hope you find it amusing I do. :D<br />
<br />
[http://blea.ch/~eris/litter/tx81z+sk88pro-2.4-clip.mp3 Tx81Z Test]<br><br />
I just bought a used Yamaha TX81Z FM Tone Module and this is first song I created with it. I need practice editing the sounds more. It comes preset with a lot of rather boring plain tones. Think this turned out okay for first attempt with new sounds. <br />
<br />
☆ [http://blea.ch/~eris/litter/omg-1.1.mp3 OMG!]<br><br />
Made this one ~ July 2010. Really like how it turned out, is very well planned. <br />
<br />
☆ [http://blea.ch/~eris/litter/wtg-3.mp3 WayToGo!]<br><br />
This is one I am very happy with, especially the ending which u can hear <br />
[http://blea.ch/~eris/litter/wtg-endingnosquares.mp3 Just the here w/out the squarewaves,]<br />
ALL done on SC-88Pro.<br />
<br />
[http://blea.ch/~eris/litter/lotus_land_story_final-eq.mp3 Lotus Land Story]<br><br />
title track from Touhou04 Lotus Land Story. Rendered on SK-88Pro. Agonized over this one for a while as it is one of my favorites, finished it months ago but only now listening to it again and isn't so bad. ^_^;<br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/eternalofshrinemaiden2.1-eq-dyn.mp3 Eternal Shrine Maiden.mp3 (Alt. Arrange)]<br><br />
''Alternate arrange'' ... Pleasing sounding sk88pro arrangement of ESM with nice ending. <br><br />
☆ [http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.mp3 Eternal Shrine Maiden.mp3 (Synth Arrange)] or <br />
[http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.flac (Synth Arrange lossless .flac)]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on SK-88Pro. This is a re-recording made after cleaning up my sound system and noticing the previous release sounded horrible. u_u;; Less distortion now than [http://blea.ch/~eris/litter/eternalofshrinemaiden4.mp3 original release.] and also changed the drums quite a bit. May make one more go at it this time with particular attention to making the instruments more distinct. <br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/maple%20dream%20ds%20psg.0.3.5.mp3 Maple Dream]<br><br />
Another MML, this time an arrangement of the Maple Dream off the Phantasmagoria of Dim. Dream soundtrack. Rendered on Nintendo DS. Think this one turned out quite well!☆ ^__^<br><br />
* [http://blea.ch/~eris/litter/mapledream.bdt .bdt for NDS_BGMFILER].<br />
* [http://blea.ch/~eris/litter/mapledream.mml.txt MML source file].<br />
<br />
<br />
[http://blea.ch/~eris/litter/Pyongyang%20Solstice.mp3 Pyongyang Solstice]<br><br />
Sorta rockish sounding song made in late december. <br />
<br />
<br />
[http://blea.ch/~eris/litter/incomplete%20happiness.0.6.mp3 Incomplete Happiness]<br><br />
Excited about getting an SK-88pro synth, made this.<br />
<br />
<br />
[http://blea.ch/~eris/litter/eternalshrinemaiden-nds-psg.mp3 Eternal Shrine Maiden PSG]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on NDS using the NDS_BGMDRV.<br />
* [http://blea.ch/~eris/litter/eternalofshrinemaiden.bdt bdt data file] that may be played using [http://meraman.dip.jp/index.php?NDS_BGMFILER NDS_BGMFILER]. <br />
* [http://blea.ch/~eris/litter/eternalshrinemaiden3.mml.txt mml source].<br />
<br />
<br />
Errata:<br />
* [http://blea.ch/~eris/litter/idgi3.0.mp3 I Dont Get it.mp3]<br />
* [http://blea.ch/~eris/litter/BlackTheCandle2.mp3 Black Candle.mp3]<br />
* [http://blea.ch/~eris/litter/hmmmz4.4.mp3 hmmm.mp3]<br />
* [http://blea.ch/~eris/litter/nfi4.1.mp3 N.F.I.mp3]<br />
<br />
[http://blea.ch/~eris/litter/hmmmz4.4.mp3 SongNAme]<br><br />
This song is an attempt at creating a Touhouish style composition entirely from scratch. Saying attempt because I feel it falls short, but somehow it persuades me to post itself here. <br />
<br />
[http://blea.ch/~eris/litter/myfirst.mml.mp3 Myfirst.mml]<br><br />
My first experiment in MML, rendered on Nintendo DS. More information [[Thds#2008.10.19_.7E_MML_rant|here]]. ^^<br />
<br />
☆ = songs I likes the best :D<br />
<br />
==Older Than Above==<br />
Here are old music page. Songs here are from between 1994 to 2005.<br />
[http://www.octiva.net/planks/ Old music page here]<br></div>Erishttp://blea.ch/wiki/index.php/MusicsMusics2020-01-08T05:49:06Z<p>Eris: /* Early Gamey Stuff */</p>
<hr />
<div><big>'''My musics ♪( ^-^)ノ☆♪'''</big><br />
__TOC__<br />
==What is it?==<br />
Here are mp3s, plz enjoy. <br />
<br />
==Assorted Newer Stuffs==<br />
My Soundcloud: <br />
[https://soundcloud.com/erisuhime My SoundCrowd]<br />
My YouTubes (Formally named 'Forbidden Magic'):<br />
[https://www.youtube.com/channel/UCALq1y1GOB8QB35HOUUZ_bQ My YouTube]<br />
<br />
* Todo: Add 8bit, compo sites if u can find them<br />
<br />
==Early Gamey Stuff==<br />
Most here is highly Influenced by if not transcriptions/arrangements of music from the Zun's Touhou series of games... particularly from the first five games which ran on the PC-98.. Aka 'the music of the Yougakudan':<br />
<br />
===Tofu===<br />
"Many years ago in Gensokyo, there was a band known as the Yougakudan which dearly loved FM synthesis. Yougaku" refers to a type of music that is in danger of disappearing from today's world, FM synthesis." - Xlated quote from [https://touhou.fandom.com/wiki/Akyu%27s_Untouched_Score_vol.1 Akyu's Untouched Score Vol. 1 CD]<br />
<br />
The PC-98 utilized a Yamaha YMBlahblha IC which featured a 3 channel PSG synth and 3 channels of FM systhesis (OPL-N flavor'd). The 3 PSG channels were very similar tonally to the ubiquitious AY-8-8910 3 channel PSG IC used in countless hundreds of arcade games in the 1980s [https://www.youtube.com/watch?v=TNc7VdD-ink Gyruss - Had Six AY-3-8910s!!], and etc...<br />
<br />
===Musics===<br />
☆ [http://blea.ch/~eris/litter/mrvainvstouhou101.mp3 Mr.Vain Vs. Touhou]<br><br />
Dear friend of mine sent me the old 1990's techno hit Mr. Vain, which brought back flood of memories.. I started playing along with it and thought o wow i should make a Touhou style version, and here it is. Hope you find it amusing I do. :D<br />
<br />
[http://blea.ch/~eris/litter/tx81z+sk88pro-2.4-clip.mp3 Tx81Z Test]<br><br />
I just bought a used Yamaha TX81Z FM Tone Module and this is first song I created with it. I need practice editing the sounds more. It comes preset with a lot of rather boring plain tones. Think this turned out okay for first attempt with new sounds. <br />
<br />
☆ [http://blea.ch/~eris/litter/omg-1.1.mp3 OMG!]<br><br />
Made this one ~ July 2010. Really like how it turned out, is very well planned. <br />
<br />
☆ [http://blea.ch/~eris/litter/wtg-3.mp3 WayToGo!]<br><br />
This is one I am very happy with, especially the ending which u can hear <br />
[http://blea.ch/~eris/litter/wtg-endingnosquares.mp3 Just the here w/out the squarewaves,]<br />
ALL done on SC-88Pro.<br />
<br />
[http://blea.ch/~eris/litter/lotus_land_story_final-eq.mp3 Lotus Land Story]<br><br />
title track from Touhou04 Lotus Land Story. Rendered on SK-88Pro. Agonized over this one for a while as it is one of my favorites, finished it months ago but only now listening to it again and isn't so bad. ^_^;<br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/eternalofshrinemaiden2.1-eq-dyn.mp3 Eternal Shrine Maiden.mp3 (Alt. Arrange)]<br><br />
''Alternate arrange'' ... Pleasing sounding sk88pro arrangement of ESM with nice ending. <br><br />
☆ [http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.mp3 Eternal Shrine Maiden.mp3 (Synth Arrange)] or <br />
[http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.flac (Synth Arrange lossless .flac)]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on SK-88Pro. This is a re-recording made after cleaning up my sound system and noticing the previous release sounded horrible. u_u;; Less distortion now than [http://blea.ch/~eris/litter/eternalofshrinemaiden4.mp3 original release.] and also changed the drums quite a bit. May make one more go at it this time with particular attention to making the instruments more distinct. <br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/maple%20dream%20ds%20psg.0.3.5.mp3 Maple Dream]<br><br />
Another MML, this time an arrangement of the Maple Dream off the Phantasmagoria of Dim. Dream soundtrack. Rendered on Nintendo DS. Think this one turned out quite well!☆ ^__^<br><br />
* [http://blea.ch/~eris/litter/mapledream.bdt .bdt for NDS_BGMFILER].<br />
* [http://blea.ch/~eris/litter/mapledream.mml.txt MML source file].<br />
<br />
<br />
[http://blea.ch/~eris/litter/Pyongyang%20Solstice.mp3 Pyongyang Solstice]<br><br />
Sorta rockish sounding song made in late december. <br />
<br />
<br />
[http://blea.ch/~eris/litter/incomplete%20happiness.0.6.mp3 Incomplete Happiness]<br><br />
Excited about getting an SK-88pro synth, made this.<br />
<br />
<br />
[http://blea.ch/~eris/litter/eternalshrinemaiden-nds-psg.mp3 Eternal Shrine Maiden PSG]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on NDS using the NDS_BGMDRV.<br />
* [http://blea.ch/~eris/litter/eternalofshrinemaiden.bdt bdt data file] that may be played using [http://meraman.dip.jp/index.php?NDS_BGMFILER NDS_BGMFILER]. <br />
* [http://blea.ch/~eris/litter/eternalshrinemaiden3.mml.txt mml source].<br />
<br />
<br />
Errata:<br />
* [http://blea.ch/~eris/litter/idgi3.0.mp3 I Dont Get it.mp3]<br />
* [http://blea.ch/~eris/litter/BlackTheCandle2.mp3 Black Candle.mp3]<br />
* [http://blea.ch/~eris/litter/hmmmz4.4.mp3 hmmm.mp3]<br />
* [http://blea.ch/~eris/litter/nfi4.1.mp3 N.F.I.mp3]<br />
<br />
[http://blea.ch/~eris/litter/hmmmz4.4.mp3 SongNAme]<br><br />
This song is an attempt at creating a Touhouish style composition entirely from scratch. Saying attempt because I feel it falls short, but somehow it persuades me to post itself here. <br />
<br />
[http://blea.ch/~eris/litter/myfirst.mml.mp3 Myfirst.mml]<br><br />
My first experiment in MML, rendered on Nintendo DS. More information [[Thds#2008.10.19_.7E_MML_rant|here]]. ^^<br />
<br />
☆ = songs I likes the best :D<br />
<br />
==Older Than Above==<br />
Here are old music page. Songs here are from between 1994 to 2005.<br />
[http://www.octiva.net/planks/ Old music page here]<br></div>Erishttp://blea.ch/wiki/index.php/MusicsMusics2020-01-08T05:47:45Z<p>Eris: /* Early Gamey Stuff */</p>
<hr />
<div><big>'''My musics ♪( ^-^)ノ☆♪'''</big><br />
__TOC__<br />
==What is it?==<br />
Here are mp3s, plz enjoy. <br />
<br />
==Assorted Newer Stuffs==<br />
My Soundcloud: <br />
[https://soundcloud.com/erisuhime My SoundCrowd]<br />
My YouTubes (Formally named 'Forbidden Magic'):<br />
[https://www.youtube.com/channel/UCALq1y1GOB8QB35HOUUZ_bQ My YouTube]<br />
<br />
* Todo: Add 8bit, compo sites if u can find them<br />
<br />
==Early Gamey Stuff==<br />
Most here is highly Influenced by if not transcriptions/arrangements of music from the Zun's Touhou series of games... particularly from the first five games which ran on the PC-98.. Aka 'the music of the Yougakudan':<br />
<br />
"Many years ago in Gensokyo, there was a band known as the Yougakudan which dearly loved FM synthesis. Yougaku" refers to a type of music that is in danger of disappearing from today's world, FM synthesis." - Xlated quote from [https://touhou.fandom.com/wiki/Akyu%27s_Untouched_Score_vol.1 Akyu's Untouched Score Vol. 1 CD]<br />
<br />
The PC-98 utilized a Yamaha YMBlahblha IC which featured a 3 channel PSG synth and 3 channels of FM systhesis (OPL-N flavor'd). The 3 PSG channels were very similar tonally to the ubiquitious AY-8-8910 3 channel PSG IC used in countless hundreds of arcade games in the 1980s [https://www.youtube.com/watch?v=TNc7VdD-ink Gyruss - Had Six AY-3-8910s!!], and etc...<br />
<br />
☆ [http://blea.ch/~eris/litter/mrvainvstouhou101.mp3 Mr.Vain Vs. Touhou]<br><br />
Dear friend of mine sent me the old 1990's techno hit Mr. Vain, which brought back flood of memories.. I started playing along with it and thought o wow i should make a Touhou style version, and here it is. Hope you find it amusing I do. :D<br />
<br />
[http://blea.ch/~eris/litter/tx81z+sk88pro-2.4-clip.mp3 Tx81Z Test]<br><br />
I just bought a used Yamaha TX81Z FM Tone Module and this is first song I created with it. I need practice editing the sounds more. It comes preset with a lot of rather boring plain tones. Think this turned out okay for first attempt with new sounds. <br />
<br />
☆ [http://blea.ch/~eris/litter/omg-1.1.mp3 OMG!]<br><br />
Made this one ~ July 2010. Really like how it turned out, is very well planned. <br />
<br />
☆ [http://blea.ch/~eris/litter/wtg-3.mp3 WayToGo!]<br><br />
This is one I am very happy with, especially the ending which u can hear <br />
[http://blea.ch/~eris/litter/wtg-endingnosquares.mp3 Just the here w/out the squarewaves,]<br />
ALL done on SC-88Pro.<br />
<br />
[http://blea.ch/~eris/litter/lotus_land_story_final-eq.mp3 Lotus Land Story]<br><br />
title track from Touhou04 Lotus Land Story. Rendered on SK-88Pro. Agonized over this one for a while as it is one of my favorites, finished it months ago but only now listening to it again and isn't so bad. ^_^;<br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/eternalofshrinemaiden2.1-eq-dyn.mp3 Eternal Shrine Maiden.mp3 (Alt. Arrange)]<br><br />
''Alternate arrange'' ... Pleasing sounding sk88pro arrangement of ESM with nice ending. <br><br />
☆ [http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.mp3 Eternal Shrine Maiden.mp3 (Synth Arrange)] or <br />
[http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.flac (Synth Arrange lossless .flac)]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on SK-88Pro. This is a re-recording made after cleaning up my sound system and noticing the previous release sounded horrible. u_u;; Less distortion now than [http://blea.ch/~eris/litter/eternalofshrinemaiden4.mp3 original release.] and also changed the drums quite a bit. May make one more go at it this time with particular attention to making the instruments more distinct. <br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/maple%20dream%20ds%20psg.0.3.5.mp3 Maple Dream]<br><br />
Another MML, this time an arrangement of the Maple Dream off the Phantasmagoria of Dim. Dream soundtrack. Rendered on Nintendo DS. Think this one turned out quite well!☆ ^__^<br><br />
* [http://blea.ch/~eris/litter/mapledream.bdt .bdt for NDS_BGMFILER].<br />
* [http://blea.ch/~eris/litter/mapledream.mml.txt MML source file].<br />
<br />
<br />
[http://blea.ch/~eris/litter/Pyongyang%20Solstice.mp3 Pyongyang Solstice]<br><br />
Sorta rockish sounding song made in late december. <br />
<br />
<br />
[http://blea.ch/~eris/litter/incomplete%20happiness.0.6.mp3 Incomplete Happiness]<br><br />
Excited about getting an SK-88pro synth, made this.<br />
<br />
<br />
[http://blea.ch/~eris/litter/eternalshrinemaiden-nds-psg.mp3 Eternal Shrine Maiden PSG]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on NDS using the NDS_BGMDRV.<br />
* [http://blea.ch/~eris/litter/eternalofshrinemaiden.bdt bdt data file] that may be played using [http://meraman.dip.jp/index.php?NDS_BGMFILER NDS_BGMFILER]. <br />
* [http://blea.ch/~eris/litter/eternalshrinemaiden3.mml.txt mml source].<br />
<br />
<br />
Errata:<br />
* [http://blea.ch/~eris/litter/idgi3.0.mp3 I Dont Get it.mp3]<br />
* [http://blea.ch/~eris/litter/BlackTheCandle2.mp3 Black Candle.mp3]<br />
* [http://blea.ch/~eris/litter/hmmmz4.4.mp3 hmmm.mp3]<br />
* [http://blea.ch/~eris/litter/nfi4.1.mp3 N.F.I.mp3]<br />
<br />
[http://blea.ch/~eris/litter/hmmmz4.4.mp3 SongNAme]<br><br />
This song is an attempt at creating a Touhouish style composition entirely from scratch. Saying attempt because I feel it falls short, but somehow it persuades me to post itself here. <br />
<br />
[http://blea.ch/~eris/litter/myfirst.mml.mp3 Myfirst.mml]<br><br />
My first experiment in MML, rendered on Nintendo DS. More information [[Thds#2008.10.19_.7E_MML_rant|here]]. ^^<br />
<br />
☆ = songs I likes the best :D<br />
<br />
==Older Than Above==<br />
Here are old music page. Songs here are from between 1994 to 2005.<br />
[http://www.octiva.net/planks/ Old music page here]<br></div>Erishttp://blea.ch/wiki/index.php/MusicsMusics2020-01-08T05:30:09Z<p>Eris: /* Early Gamey Stuff */</p>
<hr />
<div><big>'''My musics ♪( ^-^)ノ☆♪'''</big><br />
__TOC__<br />
==What is it?==<br />
Here are mp3s, plz enjoy. <br />
<br />
==Assorted Newer Stuffs==<br />
My Soundcloud: <br />
[https://soundcloud.com/erisuhime My SoundCrowd]<br />
My YouTubes (Formally named 'Forbidden Magic'):<br />
[https://www.youtube.com/channel/UCALq1y1GOB8QB35HOUUZ_bQ My YouTube]<br />
<br />
* Todo: Add 8bit, compo sites if u can find them<br />
<br />
==Early Gamey Stuff==<br />
Most here is highly Influenced by if not transcriptions/arrangements of music from the Zun's Touhou series of games... particularly the music of the Yougakudan:<br />
<br />
"Many years ago in Gensokyo, there was a band known as the Yougakudan which dearly loved FM synthesis. Yougaku" refers to a type of music that is in danger of disappearing from today's world, FM synthesis."<br />
<br />
[[Image:Musicstuffs.jpg|thumb|250px|...]]<br />
☆ [http://blea.ch/~eris/litter/mrvainvstouhou101.mp3 Mr.Vain Vs. Touhou]<br><br />
Dear friend of mine sent me the old 1990's techno hit Mr. Vain, which brought back flood of memories.. I started playing along with it and thought o wow i should make a Touhou style version, and here it is. Hope you find it amusing I do. :D<br />
<br />
[http://blea.ch/~eris/litter/tx81z+sk88pro-2.4-clip.mp3 Tx81Z Test]<br><br />
I just bought a used Yamaha TX81Z FM Tone Module and this is first song I created with it. I need practice editing the sounds more. It comes preset with a lot of rather boring plain tones. Think this turned out okay for first attempt with new sounds. <br />
<br />
☆ [http://blea.ch/~eris/litter/omg-1.1.mp3 OMG!]<br><br />
Made this one ~ July 2010. Really like how it turned out, is very well planned. <br />
<br />
☆ [http://blea.ch/~eris/litter/wtg-3.mp3 WayToGo!]<br><br />
This is one I am very happy with, especially the ending which u can hear <br />
[http://blea.ch/~eris/litter/wtg-endingnosquares.mp3 Just the here w/out the squarewaves,]<br />
ALL done on SC-88Pro.<br />
<br />
[http://blea.ch/~eris/litter/lotus_land_story_final-eq.mp3 Lotus Land Story]<br><br />
title track from Touhou04 Lotus Land Story. Rendered on SK-88Pro. Agonized over this one for a while as it is one of my favorites, finished it months ago but only now listening to it again and isn't so bad. ^_^;<br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/eternalofshrinemaiden2.1-eq-dyn.mp3 Eternal Shrine Maiden.mp3 (Alt. Arrange)]<br><br />
''Alternate arrange'' ... Pleasing sounding sk88pro arrangement of ESM with nice ending. <br><br />
☆ [http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.mp3 Eternal Shrine Maiden.mp3 (Synth Arrange)] or <br />
[http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.flac (Synth Arrange lossless .flac)]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on SK-88Pro. This is a re-recording made after cleaning up my sound system and noticing the previous release sounded horrible. u_u;; Less distortion now than [http://blea.ch/~eris/litter/eternalofshrinemaiden4.mp3 original release.] and also changed the drums quite a bit. May make one more go at it this time with particular attention to making the instruments more distinct. <br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/maple%20dream%20ds%20psg.0.3.5.mp3 Maple Dream]<br><br />
Another MML, this time an arrangement of the Maple Dream off the Phantasmagoria of Dim. Dream soundtrack. Rendered on Nintendo DS. Think this one turned out quite well!☆ ^__^<br><br />
* [http://blea.ch/~eris/litter/mapledream.bdt .bdt for NDS_BGMFILER].<br />
* [http://blea.ch/~eris/litter/mapledream.mml.txt MML source file].<br />
<br />
<br />
[http://blea.ch/~eris/litter/Pyongyang%20Solstice.mp3 Pyongyang Solstice]<br><br />
Sorta rockish sounding song made in late december. <br />
<br />
<br />
[http://blea.ch/~eris/litter/incomplete%20happiness.0.6.mp3 Incomplete Happiness]<br><br />
Excited about getting an SK-88pro synth, made this.<br />
<br />
<br />
[http://blea.ch/~eris/litter/eternalshrinemaiden-nds-psg.mp3 Eternal Shrine Maiden PSG]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on NDS using the NDS_BGMDRV.<br />
* [http://blea.ch/~eris/litter/eternalofshrinemaiden.bdt bdt data file] that may be played using [http://meraman.dip.jp/index.php?NDS_BGMFILER NDS_BGMFILER]. <br />
* [http://blea.ch/~eris/litter/eternalshrinemaiden3.mml.txt mml source].<br />
<br />
<br />
Errata:<br />
* [http://blea.ch/~eris/litter/idgi3.0.mp3 I Dont Get it.mp3]<br />
* [http://blea.ch/~eris/litter/BlackTheCandle2.mp3 Black Candle.mp3]<br />
* [http://blea.ch/~eris/litter/hmmmz4.4.mp3 hmmm.mp3]<br />
* [http://blea.ch/~eris/litter/nfi4.1.mp3 N.F.I.mp3]<br />
<br />
[http://blea.ch/~eris/litter/hmmmz4.4.mp3 SongNAme]<br><br />
This song is an attempt at creating a Touhouish style composition entirely from scratch. Saying attempt because I feel it falls short, but somehow it persuades me to post itself here. <br />
<br />
[http://blea.ch/~eris/litter/myfirst.mml.mp3 Myfirst.mml]<br><br />
My first experiment in MML, rendered on Nintendo DS. More information [[Thds#2008.10.19_.7E_MML_rant|here]]. ^^<br />
<br />
☆ = songs I likes the best :D<br />
<br />
==Older Than Above==<br />
Here are old music page. Songs here are from between 1994 to 2005.<br />
[http://www.octiva.net/planks/ Old music page here]<br></div>Erishttp://blea.ch/wiki/index.php/MusicsMusics2020-01-08T05:29:33Z<p>Eris: /* Assorted Newer Stuffs */</p>
<hr />
<div><big>'''My musics ♪( ^-^)ノ☆♪'''</big><br />
__TOC__<br />
==What is it?==<br />
Here are mp3s, plz enjoy. <br />
<br />
==Assorted Newer Stuffs==<br />
My Soundcloud: <br />
[https://soundcloud.com/erisuhime My SoundCrowd]<br />
My YouTubes (Formally named 'Forbidden Magic'):<br />
[https://www.youtube.com/channel/UCALq1y1GOB8QB35HOUUZ_bQ My YouTube]<br />
<br />
* Todo: Add 8bit, compo sites if u can find them<br />
<br />
==Early Gamey Stuff==<br />
Most here is highly Influenced by if not transcriptions/arrangements of music from the Zun's Touhou series of games... particularly the music of the Yougakudan:<br />
<br />
"Many years ago in Gensokyo, there was a band known as the Yougakudan which dearly loved FM synthesis. Yougaku" refers to a type of music that is in danger of disappearing from today's world, FM synthesis."<br />
<br />
[[Image:Musicstuffs.jpg|thumb|250px|...]]<br />
☆ [http://blea.ch/~eris/litter/mrvainvstouhou101.mp3 Mr.Vain Vs. Touhou]<br><br />
Dear friend of mine sent me the old 1990's techno hit Mr. Vain, which brought back flood of memories.. I started playing along with it and thought o wow i should make a Touhou style version, and here it is. Hope you find it amusing I do. :D<br />
<br />
[http://blea.ch/~eris/litter/tx81z+sk88pro-2.4-clip.mp3 Tx81Z Test]<br><br />
I just bought a used Yamaha TX81Z FM Tone Module and this is first song I created with it. I need practice editing the sounds more. It comes preset with a lot of rather boring plain tones. Think this turned out okay for first attempt with new sounds. <br />
<br />
☆ [http://blea.ch/~eris/litter/omg-1.1.mp3 OMG!]<br><br />
Made this one ~ July 2010. Really like how it turned out, is very well planned. <br />
<br />
☆ [http://blea.ch/~eris/litter/wtg-3.mp3 WayToGo!]<br><br />
This is one I am very happy with, especially the ending which u can hear <br />
[http://blea.ch/~eris/litter/wtg-endingnosquares.mp3 Just the here w/out the squarewaves,]<br />
ALL done on SC-88Pro.<br />
<br />
[http://blea.ch/~eris/litter/lotus_land_story_final-eq.mp3 Lotus Land Story]<br><br />
title track from Touhou04 Lotus Land Story. Rendered on SK-88Pro. Agonized over this one for a while as it is one of my favorites, finished it months ago but only now listening to it again and isn't so bad. ^_^;<br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/eternalofshrinemaiden2.1-eq-dyn.mp3 Eternal Shrine Maiden.mp3 (Alt. Arrange)]<br><br />
''Alternate arrange'' ... Pleasing sounding sk88pro arrangement of ESM with nice ending. <br><br />
☆ [http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.mp3 Eternal Shrine Maiden.mp3 (Synth Arrange)] or <br />
[http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.flac (Synth Arrange lossless .flac)]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on SK-88Pro. This is a re-recording made after cleaning up my sound system and noticing the previous release sounded horrible. u_u;; Less distortion now than [http://blea.ch/~eris/litter/eternalofshrinemaiden4.mp3 original release.] and also changed the drums quite a bit. May make one more go at it this time with particular attention to making the instruments more distinct. <br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/maple%20dream%20ds%20psg.0.3.5.mp3 Maple Dream]<br><br />
Another MML, this time an arrangement of the Maple Dream off the Phantasmagoria of Dim. Dream soundtrack. Rendered on Nintendo DS. Think this one turned out quite well!☆ ^__^<br><br />
* [http://blea.ch/~eris/litter/mapledream.bdt .bdt for NDS_BGMFILER].<br />
* [http://blea.ch/~eris/litter/mapledream.mml.txt MML source file].<br />
<br />
<br />
[http://blea.ch/~eris/litter/Pyongyang%20Solstice.mp3 Pyongyang Solstice]<br><br />
Sorta rockish sounding song made in late december. <br />
<br />
<br />
[http://blea.ch/~eris/litter/incomplete%20happiness.0.6.mp3 Incomplete Happiness]<br><br />
Excited about getting an SK-88pro synth, made this.<br />
<br />
<br />
[http://blea.ch/~eris/litter/eternalshrinemaiden-nds-psg.mp3 Eternal Shrine Maiden PSG]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on NDS using the NDS_BGMDRV.<br />
* [http://blea.ch/~eris/litter/eternalofshrinemaiden.bdt bdt data file] that may be played using [http://meraman.dip.jp/index.php?NDS_BGMFILER NDS_BGMFILER]. <br />
* [http://blea.ch/~eris/litter/eternalshrinemaiden3.mml.txt mml source].<br />
<br />
<br />
Errata:<br />
* [http://blea.ch/~eris/litter/idgi3.0.mp3 I Dont Get it.mp3]<br />
* [http://blea.ch/~eris/litter/BlackTheCandle2.mp3 Black Candle.mp3]<br />
* [http://blea.ch/~eris/litter/hmmmz4.4.mp3 hmmm.mp3]<br />
* [http://blea.ch/~eris/litter/nfi4.1.mp3 N.F.I.mp3]<br />
<br />
<br />
[http://blea.ch/~eris/litter/hmmmz4.4.mp3 SongNAme]<br><br />
This song is an attempt at creating a Touhouish style composition entirely from scratch. Saying attempt because I feel it falls short, but somehow it persuades me to post itself here. <br />
<br />
[http://blea.ch/~eris/litter/myfirst.mml.mp3 Myfirst.mml]<br><br />
My first experiment in MML, rendered on Nintendo DS. More information [[Thds#2008.10.19_.7E_MML_rant|here]]. ^^<br />
<br />
☆ = songs I likes the best :D<br />
<br />
==Older Than Above==<br />
Here are old music page. Songs here are from between 1994 to 2005.<br />
[http://www.octiva.net/planks/ Old music page here]<br></div>Erishttp://blea.ch/wiki/index.php/MusicsMusics2020-01-08T05:29:13Z<p>Eris: </p>
<hr />
<div><big>'''My musics ♪( ^-^)ノ☆♪'''</big><br />
__TOC__<br />
==What is it?==<br />
Here are mp3s, plz enjoy. <br />
<br />
==Assorted Newer Stuffs==<br />
My Soundcloud: <br />
[https://soundcloud.com/erisuhime My SoundCrowd]<br />
My YouTubes (Formally named 'Forbidden Magic'):<br />
* [https://www.youtube.com/channel/UCALq1y1GOB8QB35HOUUZ_bQ My YouTube]<br />
<br />
* Todo: Add 8bit, compo sites if u can find them<br />
<br />
==Early Gamey Stuff==<br />
Most here is highly Influenced by if not transcriptions/arrangements of music from the Zun's Touhou series of games... particularly the music of the Yougakudan:<br />
<br />
"Many years ago in Gensokyo, there was a band known as the Yougakudan which dearly loved FM synthesis. Yougaku" refers to a type of music that is in danger of disappearing from today's world, FM synthesis."<br />
<br />
[[Image:Musicstuffs.jpg|thumb|250px|...]]<br />
☆ [http://blea.ch/~eris/litter/mrvainvstouhou101.mp3 Mr.Vain Vs. Touhou]<br><br />
Dear friend of mine sent me the old 1990's techno hit Mr. Vain, which brought back flood of memories.. I started playing along with it and thought o wow i should make a Touhou style version, and here it is. Hope you find it amusing I do. :D<br />
<br />
[http://blea.ch/~eris/litter/tx81z+sk88pro-2.4-clip.mp3 Tx81Z Test]<br><br />
I just bought a used Yamaha TX81Z FM Tone Module and this is first song I created with it. I need practice editing the sounds more. It comes preset with a lot of rather boring plain tones. Think this turned out okay for first attempt with new sounds. <br />
<br />
☆ [http://blea.ch/~eris/litter/omg-1.1.mp3 OMG!]<br><br />
Made this one ~ July 2010. Really like how it turned out, is very well planned. <br />
<br />
☆ [http://blea.ch/~eris/litter/wtg-3.mp3 WayToGo!]<br><br />
This is one I am very happy with, especially the ending which u can hear <br />
[http://blea.ch/~eris/litter/wtg-endingnosquares.mp3 Just the here w/out the squarewaves,]<br />
ALL done on SC-88Pro.<br />
<br />
[http://blea.ch/~eris/litter/lotus_land_story_final-eq.mp3 Lotus Land Story]<br><br />
title track from Touhou04 Lotus Land Story. Rendered on SK-88Pro. Agonized over this one for a while as it is one of my favorites, finished it months ago but only now listening to it again and isn't so bad. ^_^;<br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/eternalofshrinemaiden2.1-eq-dyn.mp3 Eternal Shrine Maiden.mp3 (Alt. Arrange)]<br><br />
''Alternate arrange'' ... Pleasing sounding sk88pro arrangement of ESM with nice ending. <br><br />
☆ [http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.mp3 Eternal Shrine Maiden.mp3 (Synth Arrange)] or <br />
[http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.flac (Synth Arrange lossless .flac)]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on SK-88Pro. This is a re-recording made after cleaning up my sound system and noticing the previous release sounded horrible. u_u;; Less distortion now than [http://blea.ch/~eris/litter/eternalofshrinemaiden4.mp3 original release.] and also changed the drums quite a bit. May make one more go at it this time with particular attention to making the instruments more distinct. <br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/maple%20dream%20ds%20psg.0.3.5.mp3 Maple Dream]<br><br />
Another MML, this time an arrangement of the Maple Dream off the Phantasmagoria of Dim. Dream soundtrack. Rendered on Nintendo DS. Think this one turned out quite well!☆ ^__^<br><br />
* [http://blea.ch/~eris/litter/mapledream.bdt .bdt for NDS_BGMFILER].<br />
* [http://blea.ch/~eris/litter/mapledream.mml.txt MML source file].<br />
<br />
<br />
[http://blea.ch/~eris/litter/Pyongyang%20Solstice.mp3 Pyongyang Solstice]<br><br />
Sorta rockish sounding song made in late december. <br />
<br />
<br />
[http://blea.ch/~eris/litter/incomplete%20happiness.0.6.mp3 Incomplete Happiness]<br><br />
Excited about getting an SK-88pro synth, made this.<br />
<br />
<br />
[http://blea.ch/~eris/litter/eternalshrinemaiden-nds-psg.mp3 Eternal Shrine Maiden PSG]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on NDS using the NDS_BGMDRV.<br />
* [http://blea.ch/~eris/litter/eternalofshrinemaiden.bdt bdt data file] that may be played using [http://meraman.dip.jp/index.php?NDS_BGMFILER NDS_BGMFILER]. <br />
* [http://blea.ch/~eris/litter/eternalshrinemaiden3.mml.txt mml source].<br />
<br />
<br />
Errata:<br />
* [http://blea.ch/~eris/litter/idgi3.0.mp3 I Dont Get it.mp3]<br />
* [http://blea.ch/~eris/litter/BlackTheCandle2.mp3 Black Candle.mp3]<br />
* [http://blea.ch/~eris/litter/hmmmz4.4.mp3 hmmm.mp3]<br />
* [http://blea.ch/~eris/litter/nfi4.1.mp3 N.F.I.mp3]<br />
<br />
<br />
[http://blea.ch/~eris/litter/hmmmz4.4.mp3 SongNAme]<br><br />
This song is an attempt at creating a Touhouish style composition entirely from scratch. Saying attempt because I feel it falls short, but somehow it persuades me to post itself here. <br />
<br />
[http://blea.ch/~eris/litter/myfirst.mml.mp3 Myfirst.mml]<br><br />
My first experiment in MML, rendered on Nintendo DS. More information [[Thds#2008.10.19_.7E_MML_rant|here]]. ^^<br />
<br />
☆ = songs I likes the best :D<br />
<br />
==Older Than Above==<br />
Here are old music page. Songs here are from between 1994 to 2005.<br />
[http://www.octiva.net/planks/ Old music page here]<br></div>Erishttp://blea.ch/wiki/index.php/SighSigh2019-10-24T23:46:28Z<p>Eris: Created page with "<big>Isa Ruins Everything</big> __TOC__ ==What is it?== Page full of grrrrrr..... ==Rant #1 'day make me happy'== Fucking stupid arse smartphones!! Ffs auto-incorrect just pi..."</p>
<hr />
<div><big>Isa Ruins Everything</big><br />
__TOC__<br />
==What is it?==<br />
Page full of grrrrrr.....<br />
<br />
==Rant #1 'day make me happy'==<br />
Fucking stupid arse smartphones!! Ffs auto-incorrect just piss off already, just when i think it's safe... i see:<br />
<nowiki>"day make me happy" which was supposed 2b "DAT make me happy".... </nowiki><br />
<br />
Feel so much do not belong in this world, because I know ~this~ is so wrong.. utilizing technology to convey ideas shouldn't be a fucking struggle...<br />
<br />
Know how thins should actually be, have the knowledge, experience, and expertise to bring together ideas and create wonderfully elegant usefull things. Like creating better apps, better operating systems even. Used this stuff all day! Just for fun or to help other ppl do things better or so i myself just wouldn't be so damn annoyed and could accomplish even more stuffs by creating and utilizing the proper tools and practices and interacting with others doing the same and sharing ideas and comparing and seeing what works and wat doesn't and well what smartphones have become and the hows and the whys it just does not benefit the user like it should. Theres so much self promotion and profiting and circle-jerking justification for it all that just gah... i mean unless ur using ur phone for some activity that's gonna benefit these assholes - ur better off using a pad and paper or real computer or fucking anything but a goddamned smart phone.<br />
<br />
I want so much to implement a new way.. the hardware and technology is incredibly powerful but like wtf at the bullshit wasteful as fuck operating system, and fucktard apps, and adds, and show downs and just w t f?!!?<br />
<br />
I want to produce better alternatives, collaborate on larger projects like i used to but I've fallen, i don't know if its lime disease or my mouth and sinuses being so damn infected or if i'm just crazy but I know something is wrong both with me physically and with things like fucking stupid 'smart' auto-uncorrectors, screen flipping around constantly, stupid features that serve only marketing purposes like speech fucking balloons turning a 4 line conversation into some abomination of pixels taking up the entire goddamned screen because wtf ?!! Srsly, I used to chat online like all day every day and would have many many conversations color coded, time-stamped, sorted, organized all on a 80x24 character display - and thats with fancy piped out boarders and blah blah... <br />
<br />
i'll find a screen-shot.. then vs. now.. it's really insane... <br />
<br />
==Rant #2 ... too fucking tired, i give up...==<br />
Maybe later... *sighs*<br />
<br />
d(u_u;,,</div>Erishttp://blea.ch/wiki/index.php/Main_PageMain Page2019-09-09T19:55:24Z<p>Eris: </p>
<hr />
<div><center><br />
<big>'''Projects Wiki'''</big><br />
<br />
== About Projects Wiki ==<br />
</center><br />
Projects Wiki was created to simply and easily document, release, and get feedback on various ongoing or completed projects. Everyone is welcome to read and contribute to it. Feel free to improve documentation, discuss questions, or anything else you please. Any <s>mistakes</s> spam you might make can be easily <span class="plainlinks">[http://www.diamondlinks.net <span style="color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;">link building service</span>] changed back.<br />
<br /><br />
<center><br />
<br />
== Projects ==<br />
</center><br />
{| border="0" width="100%"<br />
! align="center" colspan="2" |<br />
|- valign="top"; <br />
|<br />
{| class="toccolours" cellpadding="5" style="border: 0px; float: center; margin: 0 0 1em 1em; width: 100%; border-collapse: collapse; font-size: 95%;"<br />
| align="center" colspan=2 bgcolor="#ccccff" style="font-size:110%; border: 0px solid #999999;" | '''Nintendo DS'''<br />
|- <br />
| [[Nitrofs|Nitrofs device driver]] <br />
|-<br />
| [[Thmp3|Mp3 player library]]<br />
|- <br />
| [[Thsprite|Danmaku Spritelib]]<br />
|- <br />
| [[Thds|Touhou Fangame]]<br />
|-<br />
| [[Thbg|Background management]]<br />
|-<br />
| [[Thfifo|FIFO/IPC library]]<br />
|-<br />
| [[Thsound|Sound library]]<br />
|-<br />
| [[Nyanroll|Nyanroll for nds]]<br />
|-<br />
| [[Caramelldansen|(゚∀゚) Caramell Dansen Movie Create]]<br />
|-<br />
| [[:Category:LIBTHDS|libraries used by thds]]<br />
|}<br />
! align="center" colspan="2" |<br />
| valign="top" |<br />
{| class="toccolours" cellpadding="5" style="border: 0px; float: center; margin: 0 0 1em 1em; width: 100%; border-collapse: collapse; font-size: 95%;"<br />
| align="center" colspan=2 bgcolor="#ccccff" style="font-size:110%; border: 0px solid #999999;" | '''Irssi/IRC'''<br />
|- <br />
| [[Cdwn|Countdown script]] <br />
|-<br />
| [[Ddate|Discordian date script]]<br />
|-<br />
| [[Voiceops|Voiceops eggdrop script]]<br />
|-<br />
| [[VHost_listing_script|vhost shell script]]<br />
|}<br />
|- <br />
! align="center" colspan="2" |<br />
|- valign="top"; <br />
|<br />
{| class="toccolours" cellpadding="5" style="border: 0px; float: center; margin: 0 0 1em 1em; width: 100%; border-collapse: collapse; font-size: 95%;"<br />
| align="center" colspan=2 bgcolor="#ccccff" style="font-size:110%; border: 0px solid #999999;" | '''Stuff''' <br />
|- <br />
| [[PPM_Meter|PPM/EC/TDS meter]]<br />
|-<br />
| [[PH_Meter]]<br />
|-<br />
| [[Temperature_probe| Cheap Temperature Probe]]<br />
|-<br />
| [[WAG54GV3_Howto|WAG54GV3 fw Howto ]]<br />
|-<br />
| [[Musics|My Musics]]<br />
|-<br />
| [[PinkHelloKittyDesktop| Super cute pink hello kitty desktop]]<br />
|-<br />
| [[3DCube| Optical Metrology From Image Data]]<br />
|-<br />
| [[Adjectives| Adjective Ordering]]<br />
|}<br />
! align="center" colspan="2" |<br />
| valign="top" |<br />
{| class="toccolours" cellpadding="5" style="border: 0px; float: center; margin: 0 0 1em 1em; width: 100%; border-collapse: collapse; font-size: 95%;"<br />
| align="center" colspan=2 bgcolor="#ccccff" style="font-size:110%; border: 0px solid #999999;" | '''Code bits''' <br />
|-<br />
| [[Hexdump|Simple hex dump code]]<br />
|-<br />
| [[RngLib|VxWorks Style ring library]]<br />
|-<br />
| [[VxWorksMipsTelnetd|Telnet daemon 4 VxWorks (MIPS)]]<br />
|-<br />
| [[VxWorksMipsHttpd|HTTP daemon 4 VxWorks (MIPS)]]<br />
|-<br />
| [[Thds/Bullet_code_bits|Shmups/Danmaku code samples]]<br />
|-<br />
| [[Path_Case_Script|Path Case Script]]<br />
|}<br />
|}</div>Erishttp://blea.ch/wiki/index.php/AdjectivesAdjectives2019-09-09T19:54:29Z<p>Eris: Created page with "==Adjectives== Forsyth says there are eight types of adjectives, which should be used in this order: 1. Opinion 2. Size 3. Age 4. Shape 5. Color 6. Origin 7. Material ..."</p>
<hr />
<div>==Adjectives==<br />
Forsyth says there are eight types of adjectives, which should be used in this order:<br />
<br />
1. Opinion<br />
<br />
2. Size<br />
<br />
3. Age<br />
<br />
4. Shape<br />
<br />
5. Color<br />
<br />
6. Origin<br />
<br />
7. Material<br />
<br />
8. Purpose</div>Erishttp://blea.ch/wiki/index.php/Talk:NitrofsTalk:Nitrofs2019-09-08T08:57:36Z<p>Eris: revverted spam</p>
<hr />
<div>==Changes notes==<br />
Just today (2008-05-01) heard there was a discussion about nitrofs on gbadev's forums, and found out why i was not able before to use a .nds file with emulators. Both thanks to Wintermutes Thx!!!!!! :DD<br />
<br />
After reading the forums found out there was a bug with fseek() and the SEEK_CUR, i am sorry. u_u This was not noticed immediately as I only used SEEK_SET in testing. The problem turned out to be an improper return value in my fseek() function. Guess i should thank noda for pointing this out, and btw, hellos! ^^/<br />
<br />
Now, a single .nds file should work equally well with both emulators and flashcards, hopefully... I tried this before in the previous version but did not realize passing -o option to ndstool prevented GBA access. After fixing the Makefile and zeroing the offset used previously for the older style .ds.gba <br />
<br />
2008-05-21 - fixed ftell() issues, and re-enabled support for ds.gba files in addition to .nds on emulators (best of both worlds! :PP).. also added stat() support for reading file lengths w/o opening..<br />
<br />
2008-05-26 - Added chdir() functionality, lets see how long till someone usurp the insanely simple method...<br />
<br />
2008-06-16 - Relased turbo version.<br />
<br />
2008-06-19 - So soon another release :D this time "." and ".." is fully supported!!<br />
YAY!!<br />
<br />
==Why not read from the card directly?==<br />
Noticed someone asked about this on another forum. I'll try to explain (based on what i've been told so please correct me if am wrong)...<br />
<br />
Original games are encrypted and read over SPI buss from the card which decrypts using hardware. When these games are loaded off flashcards, the flashcard's loader modifies the card/SPI functions which are patched to use flashcard specific functions that emulate normal SPI access to the card's data. <br />
<br />
The details of this are foggy, since flashcard companies don't wanna say what they are doing exactly and help competitors. :/ So to make homebrew that uses official SPI style calls would be sort of pointless since the loaders would prolly not pick up on this, not patch them, and thus not work at all.<br />
<br />
eris <span style="color:pink;">♥</span><br />
<br />
==Multiple vs Single FAT filehandles when in .nds mode==<br />
After pondering this a bit, have decided most uses would prefer quicker open/close times versus a very slight slowdown when reading from multiple files. <br />
<br />
When using the .nds file and FAT, is there any advantage in using opening only one ".nds" instead of opening a ".nds" file for each file opened on the nitrofs. <br />
<br />
fopen uses up quite a few cpu cycles, so obviously f/opening of files from the nitrofs would be faster if the same .nds file were used instead of opening a new one each time. This would speed up most other operations as well such as directory openings, file/dir closes, stat() calls, etc.<br />
<br />
What happens if your reading from two nitrofs files at once?? In this case the single .nds file would need be seeked back and forth like crazy every time a different nitrofs file was read from. Have heard that FAT may take a bit of time to search the allocation tables and change file position, is this take any longer than opening up multiple files that hafta read from different positions on the card, and how the different DLDI implementations would affect this is truly a guess to me??? If anyone wants to try I'd like some feedback here. <br />
<br />
I tested it with my newflash 8gbit, here are the results:<br />
{| align="right" border="1" width=25%<br />
|+ Single vs Multiple .nds *<br />
|-<br />
! Test || Multi || Single || diff<br />
|- align="center"<br />
| 2files || 956 || 1078 || -122<br />
|- align="center"<br />
| fread || 432 || 326 || 106<br />
|- align="center"<br />
| read || 338 || 232 || 106<br />
|- align="center"<br />
| shortread || 113 || 5 || 108<br />
|}<br />
* all results in ms<br />
<br />
'''2files'''<br><br />
this test reading 2 files simultainiously, 0x100 bytes at a time, over 10327 reads (file is 1032793 bytes), one file is fopen'd other is open'd. <br />
<br />
As i suspected, reading multiple files with single .nds file is slower, but.... not by much at all, especially given the number of reads this spans.<br />
<br />
'''fread & read'''<br><br />
just freading (or reading) the same 1032793 byte file. Times include open/close calls. here the winner is the single file mode, saving about 106ms for both methods. open is always gonna be a bit faster because its a simpler method than fopen (this is why i prefer open to fopen *shrug*)<br />
<br />
'''shortread'''<br><br />
ok this is reading a short 16 bytes or so from a file and doing a bit of seeking around. Here the biggest advantage can be seen. If your opening alot of small files (as i suspect most will be doing) there would be a big improvement as all those fopen/open calls add up.<br />
<br />
==Games/Projects using Nitrofs==<br />
Below is a list of projects using the nitrofs driver. Thought of adding this to main page but figured should start here first. Curious who is using this and what they're working on, add to list if you wish...<br />
* [[Thds|Thds01]] - Touhou project for nds (this is what the library was originally created for :)<br />
* [http://blog.dev-scene.com/lacey/ Lacy's Investimigations]<br />
* [http://frikiblog.spaces.live.com/blog/cns!77C5B83F3CAB780E!521.entry Indiana Jones and the Aztec Curse]<br />
<br />
Thank you :D<br />
<br />
==Finding filename for nitroFSInit()==<br />
<br />
Here is some code I wrote to find the filename of the currently loaded NDS file. It relies on the fact that the header is quite probably unique for any given ROM, and so scans through the filesystem and checks all NDS files. It seems to run quite fast enough to be useful.<br />
<br />
<source lang="c"><br />
int NDSFilePathScanner(char *path,char *end,void *buffer)<br />
{<br />
static struct stat st;<br />
DIR_ITER *dir=diropen(path);<br />
if(!dir) return 0;<br />
<br />
while(dirnext(dir,end,&st)==0)<br />
{<br />
if(end[0]=='.') continue; // skip all entries beginning with a .<br />
else if(st.st_mode&S_IFDIR)<br />
{<br />
char *newend=end+strlen(end);<br />
newend[0]='/';<br />
newend[1]=0;<br />
if(NDSFilePathScanner(buffer,newend+1,buffer)) return 1;<br />
}<br />
else<br />
{<br />
char *ext=strrchr(end,'.');<br />
if(ext&&!strcasecmp(ext,".nds"))<br />
{<br />
int fd=open(path,O_RDONLY);<br />
if(fd>=0)<br />
{<br />
if(read(fd,buffer,0x170)==0x170)<br />
if(!memcmp(buffer,(void *)0x27ffe00,0x170)) return 1;<br />
close(fd);<br />
}<br />
}<br />
}<br />
}<br />
dirclose(dir);<br />
return 0;<br />
}<br />
<br />
char *FindPathToCurrentNDSFile()<br />
{<br />
static char path[MAXPATHLEN];<br />
static uint8 buffer[0x170];<br />
<br />
path[0]='/';<br />
path[1]=0;<br />
<br />
if(NDSFilePathScanner(path,path+1,buffer)) return path;<br />
else return NULL;<br />
}<br />
</source><br />
<br />
Feel free to add this to nitro.c too. I'd suggest making an init function that takes argc, argv and a default filename, and uses the name supplied by argc and argv if available, else tries to use this code to find it, and if that fails, uses the default name passed in. That is what my code does at the moment, anyway. -- WAHa.06x36<br />
<br />
===* Oh, thanks.===<br />
been wanting something like this but too busy to write it.. ill give it a try later, might tweak a few things, but otherwise looks very promising.<br />
<br />
[http://nocash.emubase.de/gbatek.htm#dscartridgeheader http://nocash.emubase.de/gbatek.htm#dscartridgeheader] <-- Ohh i didn't know this! Was wondering where 0x27ffe00 came from. Very nice :PPP<br />
<br />
===Well tried it...===<br />
'''Hmmmmmz''', after spending all night on this... a few issues:<br />
* open()'s filename NEEDS "fat:/" at the start.... took a while but figured that one @_@<br />
* my card's loader changes the header!?!? here may be real problems... u_u;; about 8 bytes starting at 0x60 are different<br />
060h 4 Port 40001A4h setting for normal commands (usually 00586000h)<br />
064h 4 Port 40001A4h setting for KEY1 commands (usually 001808F8h)<br />
<br />
may be able to skip these and continue.. using ndsloader.nds it works fine, tho ndsloader also sets arg0 properly so idk...<br />
<br />
yes comparing 0 to 0x60 then 0x70 to 0x170 was successful, finally! :D Tho im wondering about other cards?? <br />
<br />
===Summary so far===<br />
anonuser figured out that cartridge header in .nds is copied to 0x27ffe00 during loading and is mostly unique to each file/build. By comparing the first 0x170 bytes starting with 0x27ffe00 at startup with each file on the FAT filesystem it is possible to locate the .nds file. Great idea until the loaders are standardized to provide proper argv argc values. :D<br />
<br />
there is a potential problem with card's loaders modifying the headers... however this may have been fixed.(see above)<br />
<br />
The code provided by anonuser was modified a bit, and the nitroFsInitAdv() function was added. It workes as follows:<br />
<br />
first argument fatfilename is the name we expect the file to be, if this is incorrect the function will return pointer to what file it found, if correct will return fatfilename, or NULL on error. Also it will return fatfilename if it is in GBA mode.<br />
<br />
First checks if its in GBA mode, if so will not call fatInitDefault(), and returns fatfilename. In this way there is no startup delay on emulators. :D If not GBA first fatInitDefault is called, then a stat of fatfilename is done to detemine if the file exists, if so, it attempts to use this. if not will search thru all files on the card ending in ".nds" for a matching header. <br />
<br />
Proof of concept. Code needs cleanup work but atm it needs testing on several cards:<br />
<source lang="c"><br />
bool NDSFilePathScanner(char *path, char *end, void *buffer, struct stat st)<br />
{<br />
DIR_ITER *dir=diropen(path);<br />
if(!dir) return false;<br />
<br />
while(dirnext(dir,end,&st)==0)<br />
{<br />
if(end[0]=='.') continue; // skip all entries beginning with a .<br />
else if(st.st_mode&S_IFDIR)<br />
{<br />
char *newend=end+strlen(end);<br />
newend[0]='/';<br />
newend[1]=0;<br />
if(NDSFilePathScanner(path,newend+1,buffer,st)) {<br />
dirclose(dir);<br />
return true; <br />
}<br />
}<br />
else<br />
{<br />
char *ext=strrchr(end,'.');<br />
if(ext&&!strcasecmp(ext,".nds"))<br />
{<br />
int fd=open(path,O_RDONLY);<br />
if(fd>=0)<br />
{<br />
int len;<br />
len=read(fd,buffer,DSHEADERLEN);<br />
if(len==DSHEADERLEN) {<br />
if((memcmp(buffer,(void *)DSHEADERCPY,0x60)==0) &&<br />
(memcmp(buffer+0x70,(void *)DSHEADERCPY+0x70,DSHEADERLEN-0x70)==0)) {<br />
close(fd);<br />
dirclose(dir);<br />
//printf("FOUNDIT!\n");<br />
return true;<br />
}<br />
}<br />
close(fd);<br />
} <br />
}<br />
}<br />
}<br />
dirclose(dir);<br />
return false;<br />
}<br />
<br />
#define FATPATH "fat:/"<br />
<br />
//path should be char path[MAXPATHLEN];<br />
//returns NULL if failed<br />
char *findPathToCurrentNDSFile(char *path, struct stat st)<br />
{<br />
<br />
uint8 buffer[DSHEADERLEN];<br />
strcpy(path,FATPATH);<br />
// path[0]='/';<br />
// path[1]=0;<br />
<br />
if(NDSFilePathScanner(path,path+strlen(FATPATH),buffer,st)!=false)<br />
return path;<br />
else<br />
return NULL;<br />
}<br />
<br />
//quick hack to simplify nitrofs usage<br />
// * fatfilename - what the developer thinks the file is gonna be called on the fat filesystem.. <br />
// return value is == submitted fatfilename if its correct or is using GBA mode. <br />
// if fat is detected but the fatfilename fails to open, or fatfilename == NULL, then it attempts to find <br />
// the correct fatfilename by searching thru all of fat. If found will return pointer to the newpath, if not<br />
// will return NULL indicating no file was found. by comparing the return value to fatfilename devel can <br />
// deterimine if the location of file has changed, this value may then be stored in nvram and reused next time! ^^<br />
const char *nitroFSInitAdv(const char *fatfilename) {<br />
static char path[MAXPATHLEN+1]; //+1 for the zero that is sometimes added in these functions<br />
struct stat st;<br />
//These two lines to detect GBA mode should be put into a function in nitrofs, the rest stays here...<br />
REG_EXMEMCNT &= ~ARM7_OWNS_CARD; //give us gba slot ownership<br />
if(strncmp(((const char *)GBAROM)+LOADERSTROFFSET,LOADERSTR,strlen(LOADERSTR))!=0) {<br />
//printf("yes its fat!\n");<br />
if(fatInitDefault()==true) {<br />
if((fatfilename==NULL) || (stat(fatfilename,&st)==-1)) { //no filename set<br />
//printf("searching for the path\n");<br />
char *foundpath;<br />
foundpath=findPathToCurrentNDSFile(path, st);<br />
//printf("foundpath=%s\n",foundpath);<br />
if(foundpath) {<br />
//printf("found '%s'\n",path);<br />
if(nitroFSInit(path)==0) {<br />
printf("nitrofail?!\n");<br />
}<br />
}<br />
return(path);<br />
} else {<br />
//printf("using existing path\n");<br />
nitroFSInit(fatfilename);<br />
return(fatfilename);<br />
}<br />
} else {<br />
printf("Fat failed!\n");<br />
return(NULL);<br />
}<br />
} else {<br />
//printf("using GBA mode\n");<br />
nitroFSInit(fatfilename); //actually all these should be checked ~_~<br />
return(fatfilename);<br />
}<br />
}<br />
</source><br />
<br />
A working nds for testing on different cards is found here: [http://blea.ch/~eris/nitrofs.nds nitrofs.nds] Will say "This file is being read off nitrofs!! :DD" if successfull. Should be able to put this in any folder on the card, and it still finds it! <br />
<br />
===List of tested cards/loaders===<br />
* neo 8gbit - works<br />
* ndsloader.nds - works<br />
* moonshell - works<br />
<br />
(version numbers would be nice ~_~)<br />
<br />
[[User:Eris|Eris]]<br />
<br />
I've tested it with the folowing cards:<br />
<br />
* r4ds v1.18 - diffs at 0x18 - 0x1a, works when ignoring 0x10 - 0x20<br />
* acekard2 akmenu 4.16 hw:80 - diffs at 0x160 - 0x167, works when ignring 0x160 - 0x170<br />
<br />
Tiger[DS]<br />
<br />
===Some comments===<br />
<br />
Looking good so far. I wonder if it's wise to just use the default filename if it exists, though. Perhaps the code should read the header first to check that it is indeed the right file? If it isn't, it could run a scan, and if that fails too it could use the default filename anyway (for cards that change some more header fields). I can imagine, say, that you've got two different versions of an app, and put one in the root and one is a subdirectory. That would break with the current code.<br />
<br />
* yeah considered that, needs to actually check the header still just in case that one in a million chance. My intention is that fatfilename be stored in nvram. First time the game is ran this should be set to default values prolly "" or all zeros. Then the user checks afterward if the returned value is different, if so they store the returned value in nvram for next time. Using that scenario really does seem difficult to mess up unless, as you said they for some reason have same .nds in two directories, but even then, if they are identical then the nitrofs data would be identical and game would run normally. Gah its confusing @_@ bring on argv!! Also regarding argv, in the up comming libnds release there is a magical number that indicates argv and argc are set to proper values. may be able to work this into the scheme somehow, although if your using the new libnds, then you prolly arn't gonna want/need/or even really be able to use this anyway because the nitrofs driver in new libnds does not take any arguments to nitroFSInit().. *headspin* [[User:Eris|Eris]]<br />
<br />
Also, maybe the code should take argc and argv as parameters too, so the user doesn't need to check those for themselves? Just for convenience. <br />
<br />
Also, detecting GBA mode is a really good idea, because goddamn, libfat sure takes its time to figure out that it doesn't work on no$gba.<br />
* yeah, got the idea because wintermute had made nitroFSInit() go ahead and init fat when adding the code into upcomming libnds release. However then we're stuck with: How do you determine if fat was init or not??? because the user may wanna use fat seperately.. (on some rare ancient flashcards it will load into gba mode, but still use fat @_@) This is why we should prolly make the GBA mode detection function publicly available from nitrofs itself. [[User:Eris|Eris]]<br />
** I just noticed the GBA mode detection fails on Ensata. It tries to init FAT, which fails. I'm not sure yet what causes that, I'll look into it later. -- WAHa.06x36<br />
*** heys, sorry i havent gotten back on this yesterday a server was compromised, and been working like mad to get it secured backing up data, worrying alot, etc... hopefully wikidata will be preserved... >_< should get back on this by the weekend. Also more info on ensata would be nice, i imagine they also screw with the header somehow. might want to do a [[Hexdump|hexdump]] of the gba area see if PASS is readable.. thx! [[User:Eris|Eris]]<br />
<br />
Are you going to be putting this into the official nitrofs.c file? I'd love to cut down the clutter in my own code by offloading it onto you.<br />
<br />
* have put it into a seperate ndsfinder.c and .h file. Just because its a temporary measure until the new libnds comes out, and would save a few hundred bytes to omit it. In nitrofs.c I may add a isGbaMode() function because this may be useful to devels who would like to know if FAT was initialized or not. I'll get back on this in a bit, and upload ndsfinder.c tho its pretty much just the code i pasted so far. ^^<br />
<br />
--WAHa.06x36<br />
<br />
Hey, you still around? been busy fixing my server and beefing up security. Also had to put some stuff on ebay to help pay for the server, and of course working on my Touhou for DS game quite alot. Curious if you have made any progess here?<br />
<br />
[[User:Eris|Eris]]<br />
<br />
== Qwestion ==<br />
<br />
Hei Penitential klooper regardless of my english jer, buti exceedingly perceptive re counter .</div>Erishttp://blea.ch/wiki/index.php/ThfifoThfifo2019-08-17T08:58:33Z<p>Eris: </p>
<hr />
<div>==What is this?==<br />
A novel approach to inter-processor communications and related resource management for the Nintendo DS. Based on the concepts of simplicity, ease of use, modularity, and run-time resource allocation. <br />
<br />
In addition to the usual FIFO functionality, functions for managing the 4K shared memory space (swrmalloc/swrfree), and rudimentary inter-processor mutual exclusion functions are also provided.<br />
<br />
Inter-processor systems provided:<br />
* Shared Work Ram allocation (swrmalloc/swrfree)<br />
* Shared Work Ram mutual exclusion locks<br />
* FIFO for sending data and alerting other CPU of events<br />
* Ring buffers for queuing data recieved by fifo (seperate, in the [[RngLib|rngLib]] library)<br />
<br />
Other libraries using thfifo include:<br />
* [[Thmp3|thmp3]]<br />
* [[Thsound|thsound]]<br />
<br />
Changes:<br />
* 2009/03/30 - added check for fifo full before transmitting to prevent possible data loss. See [[Thfifo#ToDo|ToDo]].<br />
<br />
[http://meraman.dip.jp/index.php Meraman] was kind enough to translate this page into Japanese which can be found [http://meraman.dip.jp/index.php?THFIFO_JPN here].<br />
<br />
==Where to get it==<br />
Currently the sources for this are part of [http://blea.ch/wiki/index.php/Category:LIBTHDS LibThds]. The source can be downloaded via SVN (see libthds page) or directly from the svn httpd:<br><br />
* [http://svn.blea.ch/thdslib/trunk/thdslib/source/shared/include/thfifo.h thfifo.h]<br />
* [http://svn.blea.ch/thdslib/trunk/thdslib/source/shared/source/thfifo.c thfifo.c]<br />
<br />
(.h and .c files should be placed in both arm7 and arm9 directories plz :D)<br />
<br />
Example code:<br />
* [http://svn.blea.ch/thdslib/trunk/thdslib/examples/thfifo simple fifo example]<br />
<br />
==Shared Work Ram Management==<br />
Functions detailed here are for managing the 4K shared work ram (swr) segment. This segment is uncached on the arm9 side and therefore slower so should only be used for variables and structures that routinely need to be immediately available to both CPUs.<br />
<br />
Traditionally this area was managed at compile time using complex #define statements requiring careful planning to prevent two libraries reusing the same region twice. To avoid these potential pitfalls a simple dynamic runtime allocation system is provided so that libraries may request swr space with minimal concern.<br />
<br />
These functions may be called from either CPU, and you should be able to malloc on one side and free on the other! (however this is discouraged).<br />
<br />
===SWR Functions===<br />
'''swrInit'''<br><br />
Initialize the swr functionality, called on both CPUs before using. Calling this function is unnecessary if using the FIFO because its called already in fifoInit().<br />
<source lang="c"><br />
void swrInit(void);<br />
</source><br />
<br />
'''swrmalloc'''<br><br />
Allocate a region of swr. Only argument is the size requested. Returns a pointer to the newly allocated region or null if fail.<br />
<source lang="c"><br />
void *swrmalloc(int size);<br />
</source><br />
<br />
'''swrfree'''<br><br />
Frees up a previously allocated region of swr. Only argument is the previously allocated swr pointer. returns true if successful.<br />
<br />
Do not see this being used very often if at all, but it is provided for completeness.<br />
<source lang="c"><br />
bool swrfree(void *loc);<br />
</source><br />
<br />
==Inter-processor Mutual Exclusion==<br />
Two functions are available to restrict access during critical read/writes to swr. For this the well documented Peterson algorithm is used. <br />
<br />
These functions were originally conceived to prevent corruption during swrmalloc but may be useful to developers as well. Still debating if the FIFO section itself shouldnt provide per channel locks... @_@<br />
<br />
While use of these functions is provided it should generally be avoided since it slows down the other CPU, and essentially wastes time while waiting. <br />
<br />
'''getGlobalSWRLock'''<br><br />
This function is caled ''before'' accessing critical data.<br />
<source lang="c"><br />
void getGlobalSWRLock(void);<br />
</source><br />
<br />
'''giveGlobalSWRLock'''<br><br />
This function is caled ''after'' accessing critical data.<br />
<source lang="c"><br />
void giveGlobalSWRLock(void);<br />
</source><br />
<br />
Usage example:<br />
<source lang="c"><br />
getGlobalSWRLock(); //get exclusive access to SWR for this cpu, and/or wait until other CPU is finished with it<br />
myIpcData->variable=newvalue;<br />
myIpcData->othervar=anothervalue;<br />
giveGlobalSWRLock(); //allow other CPU access to SWR<br />
</source><br />
<br />
==FIFO==<br />
The design philosophy here is based on simplicity and modularity. It is essentially a channelized version of the hardware rather than an attempt to provide facilities for every possible need. Channel numbers are 0 thru 15.<br />
<br />
The channels are named with strings to ease locating on the other CPU. In this way the channel number to use does not need deciding beforehand. <br />
<br />
In addition the the ASCII name, an optional pointer to user data to be shared between CPUs (most likely allocated with swrmalloc :P).<br />
<br />
Each CPU expecting to receiving data is required to assign a handler function. To receive data must set a handler function using fifoChanSetFunc(). Additionally fifoChanRecvChk() can be used to determine if a channel has a receive function set on the other CPU or not. In this way it may double as a mechanism to sync user's initialization functions. (need example!) If no receive function is set, data received at buffer is discarded.<br />
<br />
Up to 24 bits of data may be transfered at a time, the format of this data is left up to the developer. <br />
<br />
===FIFO Functions===<br />
'''fifoInit'''<br><br />
Should be called on both cpu before using the FIFO. Will sync and setup fifo for use.<br />
<source lang="c"><br />
void fifoInit(void);<br />
</source><br />
<br />
'''fifoChanCreate'''<br><br />
Create a new channel. <br />
* name - Zero terminated name to use for this channel. <br />
* udata - pointer to user data structure, usually allocated with swrmalloc. <br />
Returns a channel number. <br />
<source lang="c"><br />
thfifo_t fifoChanCreate(const char *name, void *udata);<br />
</source><br />
<br />
'''fifoChanSetFunc'''<br><br />
Sets a function to be called whenever this channel receives data from other CPU.<br />
* chan - which channel to use<br />
* func - pointer to a function of type pHFifoFunc<br />
Returns true if channel was valid.<br />
<source lang="c"><br />
bool fifoChanSetFunc(thfifo_t chan, _pHFifoFunc func);<br />
</source><br />
<br />
The _pHFifoFunc callback function should accecpt the following arguments:<br />
* chan - channel number 0-15<br />
* data - up to 24 bits of data sent from other side<br />
* udata- pointer to shared IPC structure (prolly redundant as user will create a global for this... remove?)<br />
<source lang="c"><br />
//callback function type<br />
typedef void(*_pHFifoFunc)(thfifo_t chan, u32 data, void *udata); //callback<br />
</source><br />
<br />
'''fifoSendChan24'''<br><br />
Sends up to 24 bits of data to other CPU's receive handler.<br />
* chan - channel to send data on.<br />
* data - data to send, up to 24 bits. MSByte (top 8 bits) are discarded, so if data = 0xffffffff then 0x00ffffff will be sent.<br />
<source lang="c"><br />
void fifoSendChan24(thfifo_t chan, u32 data);<br />
</source><br />
<br />
'''fifoSendChan32'''<br><br />
Sends up to 32 bits of data to other CPU's receive handler. Note this takes 2 fifo sends where as fifoSendChan24 uses only one. If possible use 24 bit function to save. ^^<br />
* chan - channel to send data on.<br />
* data - data to send, up to 32 bits. so if data = 0xffffffff then 0xffffffff will be sent.<br />
<source lang="c"><br />
void fifoSendChan32(thfifo_t chan, u32 data);<br />
</source><br />
<br />
'''fifoFindChan'''<br><br />
Searches for a channel by name. ^^<br />
* name - zero terminated name of the channel your looking for.<br />
Returns channel if found or -1 if not.<br />
<source lang="c"><br />
thfifo_t fifoFindChan(const char *name);<br />
</source><br />
<br />
'''fifoChanRecvChk'''<br><br />
Determins if a receive function has been set on the other CPU. <br />
chan - channel to check.<br />
Returns true if function has been set, false otherwise.<br />
<source lang="c"><br />
bool fifoChanRecvChk(thfifo_t chan);<br />
</source><br />
<br />
'''fifoGetUData'''<br />
Returns the user data pointer for a specified channel.<br />
* chan - channel<br />
Returns the user data pointer for a specified channel.<br />
<source lang="c"><br />
void *fifoGetUData(thfifo_t chan);<br />
</source><br />
<br />
===ToDo===<br />
While this is essentially complete and fully functional some things may be improved:<br />
* <s>fifo32Buf[FIFOMAXCHANS] should be moved into the fifo struct</s> Actually putting this here because at first glance it seems this may be useful, however having it in its own array on each cpu is faster because it does not need to write/read from SWR.<br />
* in the fifo receive function chan&0xf and chan&0xf0 are seen multiple times, would probably be best to create a local variable containing these values already masked off.<br />
* <s>Check if FIFO is full before transmitting data.. '''This''' Really should be implemented otherwise data may overflow and become lost. Possibly create a macro that loops while the buffer full flag is set. </s> (added 2009/03/30) It may also be nice to add a feature to create ring buffer to queue up data in the event fifo becomes full and utilize the xmit interrupt to transparently send the queued data in the background. Integrate rng32Lib into thFifo?<br />
* possibly provide a channelized swrLock ?<br />
<br />
[[Category:NDS]]<br />
[[Category:C]]<br />
[[Category:LIBTHDS]]</div>Erishttp://blea.ch/wiki/index.php/Thds/BlogarchiveThds/Blogarchive2019-08-17T07:21:15Z<p>Eris: </p>
<hr />
<div>===2008.09===<br />
'''2008.09.18'''<br><br />
[[Image:Eeekmarisabomb.png|thumb|Poor Kaguya buried under a pile of Marisas.]]<br />
Have been mostly busy struggling to deal with MSVC++ past few days. Last time i tried gave up programming for a year or so afterwards cause i just felt so helpless. That was about 10 years ago, nowdays realize MFC is just stupid. :P Have used other gui widget sets and they're much less W T F?! GRR GRRR *HEADDESK* *HEADDESK* than this stuff is. But the company i've contracted to for this project needs my classes to integrate into msvc++ so here i am again... ~_~<br />
<br />
Did sneak away and do a quick bit of coding on the game. Instead of using VBI to wake up the cpu, have put a wait for VCOUNT delay at start of bulletUpdate() function. VCOUNT is then set to immediately after the last subscreen update at VCOUNT of 144.. and yay! sprites are no longer cut in half at random resulting in a much more pleasing display. \\(^_^)// There is still an occasional random flickering caused by mp3s, and it gets worse when a 44.1khz mp3 plays but is very tolorable. Still i have some tricks to get rid of this, as mentioned below, just no time to try them yet.<br />
<br />
Also NEED MOAR SPRITES!!! ;; Thinking of doubling the number of subscreens to try and get more. Worked out that pattern seen in the video is using 192 sprites per iteration and if that burst happens all on one subscreen (as it can sometimes) u get missing sprites since each subscreen can only produce 128 sprites (remember each physical display is divided into 4 subscreens 48 scanlines high), they will appear as soon as there is a free hw sprite but still it looks odd. doubling the number of subscreens from 4 to 8 would prolly fix that (and use up another 4K of ram >_>). Also i could just make the initial position of each sprite a little further away from the character, or position the character to be on a subscreen boundry to distribute the load, but it looks totally ossum as it is, and we cannot start compromising.. :P<br />
<br />
I'll be getting back to full time working on thds soon as contract work is done, which will be this weekend, at least thats when i need to turn it in and get paid. :DD In the mean time enjoy the screenshot, was not unloading player bullet sprites after each level start and eventually if you played over and over it started using marisas as bullets. thought it funny hehe<br />
<br />
ohhh yah, started on yet another song, its comming along nicely. Someone on [[Talk:Thds|the talk page]] asked about the music. Kinda put me on the spot asking if its gonna have an epic soundtrack.. ;; ;; ;; am doing my best... u_u;; Zun really set quite a high standard...<br />
<br />
'''2008.09.15'''<br><br />
Eventfull day here yesterday, we had remains of Hurricaine Ike blow thru here with winds up to 75Mph. Was without power most of the day :\ Played [http://meraman.dip.jp/index.php?NDS_TGM TGM] on nds and listened to music from psp to pass time made it tolorable :D Also over the weekend picked up some coding work involving processing images from a video camera, only have a few days to complete my portions so will probably be busy mostly with this week. <br />
<br />
Okais, oh yeah blog is supposed to be about the game, have not done much coding on it, did fix the annoying purple square around my marisa sprites. Both modified my gfx converter to take a bgcolor argument if necessary and also figured out why GIMP was saving the image with a randomized color palette (it had transparency channel on the layer adding an additional color to palette). Either one of these things would have fixed the problem but having both fixed is nice. :D<br />
<br />
Am concerned a bit now about the sprite multiplexing scheme. There are two issues, firstly the bullet updating function sometimes runs in between subscreens meaning you'll get 'broken' sprites where the top and bottom half's dont line up along one of the 4 subscreen boundries within each screen, only for a frame or so, but still its visable and bothers me. Also sometimes the bullet update function takes so long after being started in VBLANK that it updates during line 0 being drawn, this causes corrupted sprites to appear, only for one frame but grrr hisss.... This can be fixed or worked around in a few ways, best way atm seems to use the last subframe write to wake up the arm9 and do bullet updates, or double buffer...<br />
<br />
Second sprite issue is the arm7 uses alot of memory bandwidth during certain mp3 decoding operations, if these happen to occur during a subscreen update there is possibility of 'flicker' from tops of subscreen boundries, its very intermittent and not very noticable but i can see it and also bothers me. Possible way around this is to occupy the arm7 with operations not involving memory access for duration of vhblank.. Might just put vblank interrupts on the arm7 coinciding with the arm9's updates.. Another maybe even better solution would be to double the number of subframes from 4 to 8, and reduce the number of sprites updated during HBLANK. For smaller sprites that may actually increase the maximum number of sprites possible for dense danmaku clouds, it would also simplify fixed priority sprites a bit.. :D <br />
<br />
Both of these solutions are hax hax haxy, and i do not like them, but to make this work best may need to. <br />
<br />
Sorry to rambles do that when tire. Need to nap for a bit and resume work on for hire project.. u_u//<br />
<br />
'''2008.09.11'''<br><br />
[[Image:Stage_one.png|thumb|Screenshot of stage start, just thought it looks sorta purdy ^^ Didn't make the bg, its 3 layers from a pa_lib demo.]]<br />
Made a video [http://www.youtube.com/watch?v=8krGT4BSV5I video to show a few friends] ^^ sorry digicam wont record for much longer... ~_~ <br />
<br />
It's at a good point to take break for few days, got lots to do (like work to pay for this server, am a bit late >_>) tho mostly exhausted trying to get all the systems working together. :\ Still, <3 touhou and does most everything technically required now. XD<br />
<br />
Its debugged as far as i know, gots stages, levels, bullets, patterns/spells systems, along with characters, hit detects, animations, made things more scripted instead of coded etc.. <br />
<br />
Found [http://mana.hacca.jp/ this site], likes the style of art... sorta touhou related hehe<br />
<br />
gots a dentist appointment today and will be gone for a good while, is part of why feel should take break. bbiab i hope :D<br />
<br />
'''2008.09.08'''<br><br />
[[Image:Almostthar.png|thumb|Few issues to sort obviously...]]<br />
Getting there, integrated my old spells system into the newer version of game. After doing so realized why i hated the old spell system so much. :P Just wanted to get it working again to see how much cpu it used, still at only around 12% XDD Can see from the image it has a few issues, for one thing gimp is not saving the palette in proper order on the Marisa image so ya get a purple square around her, thats not such a big deal because have a sprite converter just not using it yet for these tests. Here i am testing spell functionality so just not a concern, yet.<br />
<br />
Spells need to be defined in the character scripts instead of how they are at the moment using const tables. The main thing thats going to change is moving as much as possible into textual scripts to ease changes. and also because stuff like:<br />
<source lang="c"><br />
//movements<br />
spellMoves_t moarstarsmoves[] = {<br />
{128,96,26,240,MOVES_ABS},<br />
{55,128,20,240,MOVES_ABS},<br />
{200,128,20,240,MOVES_ABS},<br />
{128,128,90,-1,MOVES_ABS},<br />
{0,0,0,0,MOVES_REPEAT} //last one must be zero <br />
};<br />
<br />
Spells_t mgrimoire[]= {<br />
{"Moar stars", moarstars, 0 ,0 ,moarstarsmoves ,0 ,0}, <br />
{"Radiant", radiant ,0 ,0 ,radiantmoves ,00 ,0},<br />
{"Border of Insanity", radialstars ,0 ,0 ,topuppercenter ,00 ,0}<br />
}<br />
</source><br />
is insanely cryptic and hard to deal with... <_<<br />
<br />
Still hope to have a working demo soon, am sorry for delays... ^^<br />
<br />
'''2008.09.06'''<br><br />
Regret still do not have a demo. But progress++ :D Have been working so intently lately think my friends seem a bit annoyed at my lack of concern for anything else, sorry2u guys. Srsly doubt they ever read meh wiki but its the thought that counts eh? Right well onto what all I've done...<br />
<br />
Last post said, "My objective for the day is to implement a player entity, provided no other bugs are found." which turned out to be a curse cause gawds did i has bug. Though after a bit found it, and in the process found out quite a bit about how the ds along with libnds works. One of the biggest wtf i had would realizing that ITCM is located by default starting at location 0x0000. Most systems I've worked with (btw, bit of personal infos, have worked as embedded systems developer on and off since late 90s) leave the first mb or so of ram unused. Among other things this allows you to protect the region and enable an exception handler so that any access to this area can call a debug routine (stack trace for instance). Since a lot of problems come about from NULL pointers being used when they should not this srsly helps with the debug process. But since memory is not configured like this from default on the NDS, errant writes to this region will result in bizzare and confusing behavior. @_@ <br />
<br />
In my game there was a loop, here much simplified as:<br />
<source lang="c"><br />
do {<br />
blah=resultOfSomething();<br />
printf("blah=%d\n",blah);<br />
} while(blah);<br />
</source><br />
The printf (which was added to help debug this mess) was displaying that blah==0, however the while loop continued! After quite a bit of researching and experimentation realized that the function calling the function containing the loop had a null pointer being referenced as like: NULL->foo->bar which was screwing up the ITCM resulting in the nutty observations. <br />
<br />
Something else I found out recently while i'm thinking about it, stddef.h contains a useful macro:<br />
<source lang="c"><br />
//say u gotta structure like:<br />
typedef struct _blah {<br />
int x;<br />
int y;<br />
char *cptr;<br />
unsigned short mychar;<br />
} blah;<br />
<br />
//and want to know how many bytes from the beginning of the<br />
//structure the element 'cptr' is offset you can use:<br />
offsetof(blah.cptr) // :D :D<br />
</source><br />
This is useful if you wish to manipulate structure elements directly. Similar is concept to sizeof(). Was gonna use it for my script parsing scheme where a const table defined variable names within a structure and where to put the results. Decided not to for now but still thought offsetof() was really neat. :D<br />
<br />
OHH,sry am totally off topic really >_> Okais on the game now have both player and scenario script parsing functional, can load and unload character data required for the level as needed, player character responds to user input, other entities (enemys) can be manipulated by the scenario script. For now am just loading various characters and moving them to various places on the screen. Now need to work one reimplementing the spell casting system that will in addition do player firing patterns and bombs, detecting collisions, and then move on to more specific things such as level design. yay!! \\\^_^///<br />
<br />
Also made a quickie Marisa enemy and Kaguya player sprites. Not animated yet, someone saw my kaguya posted earlier and made lot nicer one hehe, i should post it here, after asking permission. ^^<br />
<br />
Have lot of notes and rough drawings of levels, music, characters, am encouraged getting this close.... will work more in a bit, am still laying in bed on lappy, needs sleep.. u_u<br />
<br />
'''2008.09.04'''<br><br />
Installed a subversion server today to keep track of changes in my various project's code and as a way to keep backups off-site in case of catastrophe. :D Implemented stage scripts, an example follows:<br />
<pre><br />
#firstly start a bg<br />
bg: 1<br />
wait: 0<br />
<br />
#nextly start some musics<br />
bgm: 3<br />
wait: 5<br />
<br />
#display stage title<br />
showstage: A tumbly world<br />
text: Wut am i supposed to do here?<br />
gfxpng: nitro:/stage1gfx.png<br />
duration: 360<br />
x: 2<br />
y: 30<br />
wait:80<br />
</pre><br />
Nothing too fancy, just wanted an easier way to tweak the scenarios without recompiles. Recreating the entity (player/enemy) systems, spell systems will follow. Had all this done before but redoing to take advantage of [[Nitrofs|NitroFS]] usage and to solve a few problems with original code. Lot of decisions to make, which always slow me down as I'm very indecisive. u_u Getting there tho! My objective for the day is to implement a player entity, provided no other bugs are found. Created a Kaguya player sprite and Marisa enemy sprite. Neither are animated (yet! :P) but will work for testing.<br />
<br />
Oh, intended to mention something i figured out about DS WiFi... Was trying to get a homebrew game to connect to internet, it would not. Same settings had worked before, then tried the offical Opera web browser, it also did not work. After doing a bit of testing with DSOrganize.IRC figured out it was not resolving the <br />
<br />
Lastly, friend asked who this Zun guy is, did google search, found wiki article, and realized from an old interview he owns and seems to like the NDS. ^5 hehe, wonder if he every looks at fan games. *ponder* *ponder*<br />
<br />
'''2008.09.02'''<br><br />
Just thought i'd post to indicate progress is being made. Have reimplemented the main menu system which includes Game Start, Music Room, and Options. Also is a "please watch warmly" splash screen while the systems (such as dldi/fat/nitrofs, etc) are being warmed up. At this time Game Start simply takes you to sprite/bgm/background tests. Would post a screen shot but do not with to spoil, just trust me its sooooooooooooooooooo cute!!! :P<br />
<br />
Since there are no more bugs presenting themselves in the bg and sprite portions, am now returning to the Entity, Spells, and Stage Scenario systems. Previous version of THDS used tables to store scenario and spell data like so:<br />
<source lang="c"><br />
struct StageSteps ezStage1[] = {<br />
// {EVENT TYPE, wait, index, char, entity, x, y) <br />
{STAGE_BG, 0, 0, NOCHR, 0, 0, 0}, //background (bg 1 from list)<br />
{STAGE_BGM, 75, 2, NOCHR, 0, 0, 0}, //stages bgm (song 2 from playlist)<br />
{STAGE_SHOWLVL, 320, 0, NOCHR, 0, 0, 0},<br />
{STAGE_SUMMON, 0, 0, &fam1chr, 1, -32, 0}, //create two entities (enemy characters)<br />
{STAGE_SUMMON, 0, 0, &fam1chr, 2, 288, 20}, <br />
{STAGE_SPELLCAST,268, 5, &fam1chr, 1, 0, 0}, //Start noodley looking spells on each<br />
{STAGE_SPELLCAST,280, 6, &fam1chr, 2, 0, 0},<br />
</source><br />
and for spells:<br />
<source lang="c"><br />
struct Spells fam2grimoire[]= {<br />
// {spell name, spell ,health ,dur ,Moves ,delay ,flags<br />
{"right atcha 8x8 L", allatcha8x8 ,0 ,0 ,downandtoleft ,0 ,0},<br />
{"right atcha 8x8 R", allatcha8x8 ,0 ,0 ,downandtoright ,0 ,0},<br />
{"8x8 L2R", allatcha8x8 ,0 ,0 ,left2right ,0 ,0},<br />
{"8x8 R2L", allatcha8x8 ,0 ,0 ,right2left ,0 ,0},<br />
{(const char*)NULL,(void*)NULL,0,0,noMove,0} //EndOflist<br />
};<br />
</source><br />
<br />
Since the creation of these tables have developed the [[Nitrofs|NitroFS]] driver which would easily allow for scripting to simplify some of these tasks. Thinks should be a hybrid of spells coded in C and scripts to control them rather than going for a total scripted solution such as danmaku fu seems to use. <br />
<br />
There is still some unwanted sprite flickering at certain moments caused by interaction of arm7 ram access during critical horizontal blanking periods when the OAM tables are being updated for multiplexing. It actually looks kinda neat but still am occasionally attempting stop it. A few idea's I've tried are having the arm7 go into halt mode during the critical hblanks (every 48 lines), this is so far a failure because it requires halting during interupts which is well just weird. Another idea was to just idle in a loop for the critical period where the arm7 would only need register access to VCOUNT but this for some reason did not have desiered effect.. @_@??? Still working on it off and on...<br />
<br />
Lastly wanted to mention a really neat site I found a while back. [http://meraman.dip.jp/index.php?NDS_TGM http://meraman.dip.jp/index.php?NDS_TGM] This page describes the development of a WIP game called Tetris the Grand Master - Terror Instinct. It is really what encouraged me to start a development blog of my own, and has been an interesting read. Other pages on the site have tutorials for things such as laser effects and also is a insanely nice MML player library for nds called BGM DRIVER. Oh btw, its entirely in japanese, however [http://translate.google.com translate.google.com] or [http://www.excite.co.jp/world/english/ excite.co.jp's translation page] have helped alot. (considering i know only about a dozen words in Japanese and the characters are less comprehensible to me than Egyptian heiroglyphs ;_;;)<br />
<br />
===2008.08===<br />
'''2008.08.31'''<br><br />
Sorry for delays between posts but when working am not writing. hehe Last night (over the past few days really) made lot of progress with background system, am now able to do thBgLoad(screen,bg0thru4, "fileprefix") and it loads the map, tiles, palette, and a bgtype definition file automagically. Can also load from memory with another function so that the font and startup screens may be loaded before filesystem is initalized (as well as be able to display error messages :)<br />
<br />
Also automatic vram allocations finding the smallest 'hole' that the data will fit, similar to what i have done with sprite's vram. Made these macro defines to allow screen (s), and bg (b) parameters.<br />
<br />
<source lang="c"><br />
//macro to find proper bg control reg<br />
#define BGCR(s,b) (*(vuint16*)(0x04000008+((s)<<12)+((b)<<1)))<br />
#define DISPLAYCR(s) (*(vuint32*)(0x04000000+((s)<<12)))<br />
//scrolling<br />
#define BGX0(s,b) (*(vuint16*)(0x04000010+((s)<<12)+((b)<<2)))<br />
#define BGY0(s,b) (*(vuint16*)(0x04000012+((s)<<12)+((b)<<2)))<br />
//ram<br />
#define BGBMPRAM(s,b) (((b)<<14) + 0x06000000+((s)<<21))<br />
#define BGTILERAM(s,b) (((b)<<14) + 0x06000000+((s)<<21))<br />
#define BGMAPRAM(s,b) (((b)<<11) + 0x06000000+((s)<<21))<br />
</source><br />
<br />
Background loading went from:<br />
<source lang="c"><br />
BG1_CR = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(12) | BG_TILE_BASE(1) | BG_PRIORITY(BG_PRIORITY_1);<br />
SUB_BG1_CR = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(12) | BG_TILE_BASE(1) | BG_PRIORITY(BG_PRIORITY_1);<br />
dmaCopyWords(3,BG1_Map, (u16*)BG_MAP_RAM(12), sizeof(BG1_Map));<br />
dmaCopyWords(3,BG1_Tiles, (u16*)BG_TILE_RAM(1), sizeof(BG1_Tiles));<br />
dmaCopyWords(3,BG1_Map, (u16*)BG_MAP_RAM_SUB(12), sizeof(BG1_Map));<br />
dmaCopyWords(3,BG1_Tiles, (u16*)BG_TILE_RAM_SUB(1), sizeof(BG1_Tiles));<br />
thUpdateBgPalette((u16*)BG1_Pal, 1, sizeof(BG1_Pal));<br />
thUpdateBgSubPalette((u16*)BG1_Pal, 1, sizeof(BG1_Pal));<br />
</source><br />
To this:<br />
<source lang="c"><br />
thBgLoad(0, 1, "nitro:/BG1");<br />
thBgLoad(1, 1, "nitro:/BG1");<br />
</source><br />
Much simpler!! \^_^/ Can also load from ram so that font data and startup screens may be loaded before the filesystems are initalized (and ofc display errors)<br />
<br />
So now am working on bringing the menu systems back using the new systems and have ran into a small bug last night, was quite tired so went to sleep. Now im awake, so here we go.. bbiab ^^/<br />
<br />
<br />
'''2008.08.26'''<br><br />
It has been an eventful few days. Some hackers got onto the server, creating a bit of havoc but politely leaving it otherwise intact. Fixing that required backing up the data, reinstalling, updating everything, fixing the inevitable problems but normalcy is finally being restored. Friend also came to visit from out of town, and have some financial difficulties that are still being sorted. All this delayed work on game much more than i would have liked.. But...<br />
<br />
Last night managed to find a troublesome bug in the sprite code. A sprite system funtion that tries to allocate a hardware sprite on the given screen division (there are 8 divisions, 4 per physical screen because of the multiplexing scheme) and if it fails returns -1 that should never return -1, at least with the limited number of sprites im using so far, (so i wasnt checking the return value >_>) WAS returning -1. Hmmz easier to explain in code:<br />
<br />
inline int thGetNextSprite(u8 screen); //Return the next available hardware sprite on the given screen (0 thru 7)<br />
<br />
The reason it was failing however was because the screen argument being passed was -1 from this funtion<br />
<br />
//create a sprite on each screen sprite would be visable.. screen0 = first screen, screen1 = last visable screen<br />
inline int thSubCreateSprite(thSprite_t *thsp, int screen0, int screen1); <br />
<br />
Sprites may span up to 4 'screens' (each screen is 48 pixels high, rly better terminology for this would be 'subscreen'). If the sprite is not visible on any screen screen0 argument would == -1. And THIS too wasnt being checked before calling thSubCreateSprite, causing the entire problem.<br />
<br />
The bug appeared as an occasional missing bullet, and was occasionally corrupting other parts of ram as well. Originally thought it was in the bullet engine code, where i looked and looked often trying to find it before finally examining a disassembly and noticing the sprite tables were immediately above the bullet tables in memory and wondering if a corrupted array index may be to blame.<br />
<br />
Confused? @_@??? Yes, kinda pointless to even try to explain, simple of it is.. ITS FIXED!!!! XDDDDDDDD Hopefully i will keep my schedule of completing a mostly working demo by the end of month tho it may be a few days longer due to the expected delays.<br />
<br />
Also considering moving this dev blog to eris's user talk page instead, since it covers more than just THDS, and is getting quite long. Anyways back to work.. ^^<br />
<br />
'''2008.08.14'''<br><br />
Heyas! Been insanely busy past few days working on the game, well notrly the game but the libraries to support the game. ^^ Now have [[Thsound|soundfx]], and a very nice [[Thfifo|FIFO/IPC system]] among other things. <br />
<br />
[[Image:kaguya-boss.gif|thumb|right|First animation attempt]] <br />
While making the sound lib created a simple synth, which sounds a lot neater that i'd thought it would [http://blea.ch/~eris/crappysynthtst.mp3 Here a very very short mp3] demonstrating it. Had originally wanted to make mp3/midi playback of the soundtrack as Zun does but abandoned the idea early on... For now my objective is still to get a demo out by end of month, but may come back to the synth and midi idea afterward. ^^<br />
<br />
Really need to work on my sprite animation techniques.. am pretty terrible (see pic :p) however this .gif was done quickly just to gimme something for testing the animation code rather than a very serious attempt at animation. Still am concerned a bit. Her skirt needs to flutter and hair needs blowing in breeze, prolly need to find better software than GIMP for the task, any suggestions? @_@<br />
<br />
Gotta get back to work, leave with this nice sprite tutorial. [http://www.petesqbsite.com/sections/tutorials/tuts/tsugumo/chapter10.htm a nice tutorial on sprite making] <br />
<br />
XD<br />
<br />
'''2008.08.08'''<br><br />
Here we are, happy 08/08/08!! ^^ Found out last night game was mentioned on [http://www.shrinemaiden.org/forum/index.php?topic=1045.0 MotK] along with another thds by anoNL in the works. :D Good we needz moar touhou!! <br />
<br />
Just laying here in bed after getting my new audio library working about to nap and thought to write a bit. Am very excited as it is very efficient and feature packed, even includes basic PSG functions mostly because i was wanting to use the noise generators on a level to simulate environmental noises. Still a few little features to add but its working gr8 so far!! :D<br />
<br />
Have decided to attempt releasing a demo by the end of the month, probably just a single level but am doing alot of hardware trickery and trying new things, need to test will work with all homebrew cards and such. Will do my best! ^^<br />
<br />
Otherwise lot has happend personally. My poor kitteh, who is best friend, and familiar died 2 days ago. She never recovered from whatever happened to her when she disappeared. but at least got to say goodbye and be with her to the end, was very difficult time. ;__;<br />
<br />
'''2008.08.03'''<br><br />
protip: after hours and hours of wondering why something isn't working, give up and try doing it a different way. <br />
<br />
Earlier today finally got back to working a bit, ran into some unexpected behaviour on the ds itself that i couldnt replicate on no$gba. after a few frustrating hours going in circles, realized there was an even nicer more simple way to do it and did that instead. Still had the memory sharing problems, this:<br />
Shared Work 027FF000h 4KB - - - R/W<br />
is only explained as:<br />
Region 2 and 7 are not understood?<br />
sighs, so nor do i still do not fully understand them. but now know, if u want something to be always available at either cpu without caching issues, use this region.. it rly needs a malloc. and a semaphore mechanism. Along those lines have made some simple 8,16, and 32 bit ring buffer code. ^^<br />
<br />
''a thought: if had flushed the cache after writes on the arm9 side this might not have been a problem :D''<br />
<br />
otherwise, over the past week or so my kitty dissappeared, she returned 4 days later very worn and weak. Was very very worry. ;; <br />
<br />
Also made new song for start menu.<br />
<br />
===2008.07===<br />
'''2008.07.26'''<br><br />
Finally went to dentist last tuesday, was there for 5 hours... not very pleasant, but after a few days of recovery feel much better and have resumed working. \(^_^)/ <br />
<br />
Have a working FIFO library now. days of resting allowed a bit of ponderings, and decided to go extremely simple with the FIFO code channelizing transmissions and providing facilities for locating particular channels on either side. Additionally will create messaging and ring buffer libraries for dealing with higher level tasks. This makes things more flexible and should improve handling speed for some situations.<br />
<br />
Have already a ring buffer library coded for another project. Will attempt to reuse that and save some time.. :D<br />
<br />
'''2008.07.21'''<br />
[[Image:Firstspritelibdemo.png|thumb|Image from spritelib demo showing]]<br />
found a bug in the bulletlib, very odd it didnt like that i preset a global to 0. Normally set globals in init functions, and had set this one the same, but for some reason when declaring it had int nextbullet=0; which caused things to go screwy whenever nextbullet equaled 0... @_@ still confused about that..<br />
<br />
Made a simple stand alone example/demo for [[Thsprite|spritelib]]. Image on the right shows the result. :D<br />
* animated 64x64 kaguya.thg movable by the touchscreen on the left<br />
* grit converted 8x8 white dot on the top<br />
* spinning red star on middle left<br />
* 16 color 16x16 kaguya on the right<br />
* a 8x16 2 frame gfx on two sprites (frame 0 blue+yellow and frame 1 pink+green circles)<br />
* and a buncha 16x16 bullets to demonstrate the multiplexing ^^<br />
<br />
Few things remaining to create, need a better sound fx system, and to do that need a decent fifo which would also improve the mp3 playback *sighs* really want to get back to the fun of pretty pattern making, but need these backend stuffs need doing first.. ~~<br />
<br />
Also finally released a very rough example application for the [[Thmp3|thmp3 lib]]. Added some features so that it may used in a friend's rhythm game.<br />
<br />
'''2008.07.16'''<br><br />
toof again a bit better than before, still worrying me at time. -_- Today and yesterday made good bit of progress on spritelib, cleaned it up, fixed some bugs, only one weird thing remains but it may be in the bullets system instead. Not sure..<br />
<br />
Also since there was some interest in the arm7 mp3 library (using helix ofc), went ahead and broke it off into a seperate project. Moar non-game work, but letting others use the code will help me find and correct bugs faster and result in better code for all. ^^ Over the next few days will most likely be documenting and correcting bugs in the sprite and mp3 libs.<br />
<br />
'''2008.07.14'''<br><br />
Toof getting a bit better, but still an an annoyance. ;;<br />
After talking with dovoto who is creating a pretty decent nondanmaku library for newest libnds, decided it was important to support multiple object/tile boundry sizes in thsprite. What that means is your not limited to the 128K vram banks for sprite tile data thsprite allocates by default. You can instead use 32, 64, or even 256K of vram depending on application. Some users may desire to use limited sprites and allocate the rest of vram for 3d textures, or may desire more tile data and use 256K.<br />
<br />
Work is nearly done here, just need to modify the raw gfx loading functions (for loading grit processed sprites) and clean up a bit. Then can again get back to the actual game code. :D<br />
<br />
'''2008.07.10'''<br><br />
Tooth still hurts... >_< <br />
Otherwise some progress in the [[Thsprite|spritelib]]! can now load 16/256 color images instead of just 256 which saves on vram meaning moar animations! Hopefully tonight will start to re-integrate the entities and spells libraries which should give me players, enemys, familiars, and ofc spells again. That would leave only thmenu and thgoodness libs which are the start menu and other game functionality (such as levels, scoring, and other gamey related stuffs).<br />
<br />
'''2008.07.04'''<br />
Tooth hurts really bad, keeping me awake at night. still working on the [[Thsprite|spritelib]] one feature left to add, loading of 16color in addition to 256 color sprites to save memory when possible.<br />
<br />
Made more music, now have 26 minutes 54 seconds total! XDD Definitly not Zun quality, but i am improving. u_u<br />
<br />
have met recently [[User:SquidMan|SquidMan]] who has started working on a touhou game for wii. ^^ I had a wii but sold it to buy the ds and a flash card instead, had it for almost a year and never played it. :\<br />
<br />
===2008.06===<br />
'''2008.06.28'''<br><br />
Have drawn a few characters and created about half dozen musics, but the graphics and audio used in these screenshots are from a version some months back and taken from various internet sources. <br />
<br />
<table width><tr align=center valign=top><td><br />
[[Image:Screenshot1.png|thumb|first half of level (Ignore replay debug infos on top ~_~)]]<br />
<td><br />
[[Image:Thtest7.png|thumb|final spell of level, verily hard]]<br />
<td><br />
[[Image:Thtest3.png|thumb|Peak at some of the game code, and Utter Lunacy spell]]<br />
</tr></table><br />
<br />
I'll update more soon, working on [[Thsprite|spritelib]] a bit still, and got distracted making yet moar musics :D<br />
<br />
<br />
[[Category:NDS]]<br />
[[Category:C]]</div>Erishttp://blea.ch/wiki/index.php/Elf_linkingElf linking2019-08-12T22:13:20Z<p>Eris: /* Symbols */</p>
<hr />
<div><big>Adventures in dynamic linking</big><br />
__TOC__<br />
==What is this==<br />
One of the most common concerns when developing on embedded systems is memory limitations. In particular on the NDS there is 4mb of ram which is almost impossible to fit games with rich content. The solution so far is [[Nitrofs|NitroFS]] where you can store game and application data so that ram only contains the code necessary to run the game and most of the data is loaded as needed from external files. This works great for data. <br />
<br />
Loading animated clips, maps, or music for a new level or cut scene is just like loading and playing movies or mp3s. But what about code? <br />
<br />
To dynamically load new (or unload old) code into running program is a bit more complicated because code segments interact with each other, Take the functions below:<br />
<source lang="c"><br />
void someFunc(void) {<br />
printf("hai2u! \\^_^\n");<br />
}<br />
</source><br />
<br />
In this example there is a function named 'someFunc', some data "hai2u! \^_^\n", and a reference to an external function 'printf'. When that bit of code is loaded the program and data segments ''may'' be loaded into some arbitrary unpredictable location, so how does someFunc know the address of printf?? This process is called '''[http://en.wikipedia.org/wiki/Linker linking]''' because each section of code needs to be linked to the others.<br />
<br />
==Symbols==<br />
First it needs some way to identify locations in memory. This is accomplished with '''symbols'''. A symbol entry minimally contains the location of the symbol (within memory or withing a file), and a textual name for the symbol. It may also contain information about the type of symbol (program, data, global data, etc), who (or which process) owns the symbol, which section of the object file the symbol came from, group it belongs to, etc. <br />
<br />
<source lang="c"><br />
//Typical symbol table<br />
typedef struct _SYMBOL {<br />
char *name;<br />
char *value;<br />
SYM_TYPE type;<br />
UINT16 group;<br />
} SYMBOL;<br />
</source><br />
<br />
Many schemes exist for symbol table implementation, some use a hash table for quicker lookups, some use linked lists while others have a finite array. They all do the same thing, which is, to provide a database relating addresses to names. My implementation is based of VxWork's symLib. But anyways, what about linking?<br />
<br />
==Extended Linker Format (elf)==<br />
When the compiler runs it does not know where these sections will be in RAM, so it instead provides references to locations within the object file of data or other functions from this file, and indicates when a symbol's value is unknown and must be provided externally. The format of these outputted files is typically ELF or Extended Linker Format. <br />
<br />
The ELF file is divided into a number of parts, first there is the elf header (Elf32_Ehdr) which defines the number and location of the section and program segments. next there are the program segments which contain prelinked absolute data, and section segments. These are both described using program (Elf32_Shdr) and section (Elf32_Phdr) headers respectively. Definitions of these structures is in elf.h which varies from build to build of binutils/gcc toolchain. Because the elf format works equally well with all CPUs, and most operating systems there are many many variants such as 32 and 64 bit, arm, mips, x86 cpu etc. <br />
<br />
The specifics of which system a particular elf object file are for as well as which version of the toolchain was used to compile it is are found in the elf header. These should be checked for compatibility before linking. <br />
<br />
Sections within the object file contain data of various types. Some is actual data or code to be linked, others contain information about how to link the code or data, even others describe the symbol table, etc etc.<br />
<br />
Sections from a typical ELF file (found using objdump -h):<br />
<pre><br />
Sections:<br />
Idx Name Size VMA LMA File off Algn<br />
0 .text 0000003a 00000000 00000000 00000034 2**2<br />
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE<br />
1 .data 00000000 00000000 00000000 00000070 2**2<br />
CONTENTS, ALLOC, LOAD, DATA<br />
2 .bss 00000000 00000000 00000000 00000070 2**2<br />
ALLOC<br />
3 .debug_abbrev 0000007d 00000000 00000000 00000070 2**0<br />
CONTENTS, READONLY, DEBUGGING<br />
4 .debug_info 0000019f 00000000 00000000 000000ed 2**0<br />
CONTENTS, RELOC, READONLY, DEBUGGING<br />
5 .debug_line 0000003b 00000000 00000000 0000028c 2**0<br />
CONTENTS, RELOC, READONLY, DEBUGGING<br />
6 .rodata 00000018 00000000 00000000 000002c7 2**0<br />
CONTENTS, ALLOC, LOAD, READONLY, DATA<br />
7 .debug_frame 00000054 00000000 00000000 000002e0 2**2<br />
CONTENTS, RELOC, READONLY, DEBUGGING<br />
8 .debug_loc 00000058 00000000 00000000 00000334 2**0<br />
CONTENTS, READONLY, DEBUGGING<br />
9 .debug_pubnames 0000002d 00000000 00000000 0000038c 2**0<br />
CONTENTS, RELOC, READONLY, DEBUGGING<br />
10 .debug_aranges 00000020 00000000 00000000 000003b9 2**0<br />
CONTENTS, RELOC, READONLY, DEBUGGING<br />
11 .comment 0000002a 00000000 00000000 000003d9 2**0<br />
CONTENTS, READONLY<br />
12 .note.GNU-stack 00000000 00000000 00000000 00000403 2**0<br />
CONTENTS, READONLY<br />
</pre><br />
<br />
For most applications you can ignore the .debug* sections, these are not normally used for linking but instead for gdb. Sections within the file which are to be linked are marked as "LOAD" (SHF_ALLOC). Sections with an accompanying relocate table are marked as "RELOC" (SHF_ALLOC?), the allocation table seems to always follow in the section immediately following it.<br />
<br />
The definitions for headers are system and version specific, however mostly interchangeable. For instance for testing I used my /usr/include/'''elf.h''' from standard Ubuntu Linux distro and just added some ARM specific defines from another file and it worked fine. Another file of interest is elf32-arm.h (or elf32-x86.h) but more on that later... ^^<br />
<br />
==Linking==<br />
So first step in loading would be to identify all the loadable sections. The next step is to add all symbols of which the addresses are known from the file to the symbol table, such as any named addresses within the previously loaded sections.<br />
<br />
After loading all the loadable sections and adding known symbols can do final relocation. This involves modifying the relocatable sections marked with RELOC. <br />
<br />
Taking a look at the disassembly of the 'otherFunc' example can see (objdump -d):<br />
* otherFunc starts at 0x00000026 in it's section within the file<br />
* section .rodata + 0xd contains the string to print<br />
* puts has no value set (just -4)<br />
<br />
<source lang="asm"><br />
00000026 <otherFunc>:<br />
26: 55 push %ebp<br />
27: 89 e5 mov %esp,%ebp<br />
29: 83 ec 08 sub $0x8,%esp<br />
2c: c7 04 24 0d 00 00 00 movl $0xd,(%esp)<br />
2f: R_386_32 .rodata<br />
33: e8 fc ff ff ff call 34 <otherFunc+0xe><br />
34: R_386_PC32 puts<br />
38: c9 leave <br />
39: c3 ret <br />
</source><br />
<br />
What needs to now happen is the ram addresses of .rodata and puts functions need to be found and the values within otherFunc replaced with the proper ones. To assist in this is the relocation table section, found immediately following the section marked RELOC (not shown by objdump command?! but its there, trust me.. :P) Entries in this table define what address within the relocatable segment need external references, which symbol should be referenced and how the data should be modified. <br />
<br />
Relocation records for .text section (objdump -r)<br />
<pre><br />
RELOCATION RECORDS FOR [.text]:<br />
OFFSET TYPE VALUE <br />
00000010 R_386_32 .rodata<br />
00000015 R_386_PC32 puts<br />
0000002f R_386_32 .rodata<br />
00000034 R_386_PC32 puts<br />
</pre><br />
<br />
For example lets say:<br />
.rodata section was loaded into address 0x8000<br />
.text (program code) was loaded into 0x8100<br />
<br />
The relocation entry for .text address 0x2f specifies that at that adress there is a 32 bit reference to what was in the .rodata section.(the text "Hai2u! \^_^\n"). Since we have loaded them previously .text is now at 0x8100 so 0x2f becomes 0x8100+0x2f, and .rodata is now at 0x8000. These name/value pairs are also added to the system serial table. <br />
<br />
The linker needs to modify 0x812f to contain the proper address for .rodata (found by looking in the running system's symbol table since it was already added during a previous phase) which is 0x8000. But if you look the original value at that locaion is 0xd! This is because this value is intended to be added with whatever symbol value is requested, so finally... the proper address to write to 0x812f would be 0x8000+0xd or 0x800d :D<br />
<br />
For the value of 'puts', first it looks up where puts is in the system's symbol table. Since the relocation entry specifies it is R_386_PC32 this means the value is to be program counter relative (PC + value == call address). So to figure out the proper value it takes the address value of the symbol puts (for sake of demonstration lets say its at 0x70f4) minus the address value of the instruction (0x8134) and finally add on whatever original value was in the location... so: 0x70f4 - 0x8134 + 0xfffffffc (0xfffffffc == -4), or symaddr - relocaddr + original value; <br />
<br />
Now that function is loaded in ram and linked into all the other parts of the current system it needs. The otherFunc now can be called by looking up the symbol value address 'otherFunc' and casting it as a function:<br />
<source lang="c"><br />
typedef void(*_someFunc)(void);<br />
...<br />
((_someFunc)value)();<br />
</source><br />
<br />
Makes perfect sense right! u_u;;;;<br />
<br />
==ARM Thumb insanity==<br />
[[Image:Thlinker.png|right|Simple linking test. :D]]<br />
Immediately one problem became clear, while it worked fine on x86 code, even after adding the required relocation handling code for R_ARM_CALL and R_ARM_ABS32 (this was same as x86 abs32 btw :D) the arm9 linking test wasn't working properly. After digging a bit realized that libnds operates mostly in 16 bit Thumb mode. For this mode R_ARM_THM_PC22 relocation handling was needed.<br />
<br />
To get an idea how arm-eabi handles R_ARM_THM_PC22 i examined elf32-arm.h which contains the processor specific handling code and macros relating to relocation among other things. From this i immediately realized thumb being 16 bit uses two instructions for 'bl' each containing 11 bits representing the branch address and 5 bits for the branch high or branch low instrunctions. (0xf000 and 0xf800) Perfect sense right @_@)? <br />
<br />
<br />
<br />
Below is the source code that was linked into thlink (see image):<br />
<source lang="c"><br />
#include <stdio.h><br />
//Just filler so that otherFunc is offset for better testing<br />
int otherFunc(int argc, char **argv) {<br />
printf("otherFunc!\n");<br />
}<br />
<br />
int someFunc(void) {<br />
printf("Zomg! It Works! ^_^\n");<br />
}<br />
</source><br />
<br />
==Modules==<br />
Great!! Now you've got it all loaded and ran it and now dunt need it no more, so now what?! If only there was some scheme to keep track of which object files are loaded and what needs to be done to unload them. Well, this is what modules are for, I will probably base mine on the structure of [http://www.slac.stanford.edu/exp/glast/flight/sw/vxdocs/vxworks/ref/moduleLib.html moduleLib]. More on this later..</div>Erishttp://blea.ch/wiki/index.php/Elf_linkingElf linking2019-08-12T22:06:03Z<p>Eris: /* What is this */</p>
<hr />
<div><big>Adventures in dynamic linking</big><br />
__TOC__<br />
==What is this==<br />
One of the most common concerns when developing on embedded systems is memory limitations. In particular on the NDS there is 4mb of ram which is almost impossible to fit games with rich content. The solution so far is [[Nitrofs|NitroFS]] where you can store game and application data so that ram only contains the code necessary to run the game and most of the data is loaded as needed from external files. This works great for data. <br />
<br />
Loading animated clips, maps, or music for a new level or cut scene is just like loading and playing movies or mp3s. But what about code? <br />
<br />
To dynamically load new (or unload old) code into running program is a bit more complicated because code segments interact with each other, Take the functions below:<br />
<source lang="c"><br />
void someFunc(void) {<br />
printf("hai2u! \\^_^\n");<br />
}<br />
</source><br />
<br />
In this example there is a function named 'someFunc', some data "hai2u! \^_^\n", and a reference to an external function 'printf'. When that bit of code is loaded the program and data segments ''may'' be loaded into some arbitrary unpredictable location, so how does someFunc know the address of printf?? This process is called '''[http://en.wikipedia.org/wiki/Linker linking]''' because each section of code needs to be linked to the others.<br />
<br />
==Symbols==<br />
First it needs some way to identify locations in memory. This is accomplished with '''symbols'''. A symbol is a reference to a location in memory and minimally contains location of the symbol, and a textual name for the symbol. It may also contain information about the type of symbol (program, data, global data, etc), who (or which process) owns the symbol, which section of the object file the symbol came from, group it belongs to, etc. <br />
<br />
<source lang="c"><br />
//Typical symbol table<br />
typedef struct _SYMBOL {<br />
char *name;<br />
char *value;<br />
SYM_TYPE type;<br />
UINT16 group;<br />
} SYMBOL;<br />
</source><br />
<br />
Many schemes exist for symbol table implementation, some use a hash table for quicker lookups, some use linked lists while others have a finite array. They all do the same thing, which is, to provide a database relating addresses to names. My implementation is based of VxWork's symLib. But anyways, what about linking?<br />
<br />
==Extended Linker Format (elf)==<br />
When the compiler runs it does not know where these sections will be in RAM, so it instead provides references to locations within the object file of data or other functions from this file, and indicates when a symbol's value is unknown and must be provided externally. The format of these outputted files is typically ELF or Extended Linker Format. <br />
<br />
The ELF file is divided into a number of parts, first there is the elf header (Elf32_Ehdr) which defines the number and location of the section and program segments. next there are the program segments which contain prelinked absolute data, and section segments. These are both described using program (Elf32_Shdr) and section (Elf32_Phdr) headers respectively. Definitions of these structures is in elf.h which varies from build to build of binutils/gcc toolchain. Because the elf format works equally well with all CPUs, and most operating systems there are many many variants such as 32 and 64 bit, arm, mips, x86 cpu etc. <br />
<br />
The specifics of which system a particular elf object file are for as well as which version of the toolchain was used to compile it is are found in the elf header. These should be checked for compatibility before linking. <br />
<br />
Sections within the object file contain data of various types. Some is actual data or code to be linked, others contain information about how to link the code or data, even others describe the symbol table, etc etc.<br />
<br />
Sections from a typical ELF file (found using objdump -h):<br />
<pre><br />
Sections:<br />
Idx Name Size VMA LMA File off Algn<br />
0 .text 0000003a 00000000 00000000 00000034 2**2<br />
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE<br />
1 .data 00000000 00000000 00000000 00000070 2**2<br />
CONTENTS, ALLOC, LOAD, DATA<br />
2 .bss 00000000 00000000 00000000 00000070 2**2<br />
ALLOC<br />
3 .debug_abbrev 0000007d 00000000 00000000 00000070 2**0<br />
CONTENTS, READONLY, DEBUGGING<br />
4 .debug_info 0000019f 00000000 00000000 000000ed 2**0<br />
CONTENTS, RELOC, READONLY, DEBUGGING<br />
5 .debug_line 0000003b 00000000 00000000 0000028c 2**0<br />
CONTENTS, RELOC, READONLY, DEBUGGING<br />
6 .rodata 00000018 00000000 00000000 000002c7 2**0<br />
CONTENTS, ALLOC, LOAD, READONLY, DATA<br />
7 .debug_frame 00000054 00000000 00000000 000002e0 2**2<br />
CONTENTS, RELOC, READONLY, DEBUGGING<br />
8 .debug_loc 00000058 00000000 00000000 00000334 2**0<br />
CONTENTS, READONLY, DEBUGGING<br />
9 .debug_pubnames 0000002d 00000000 00000000 0000038c 2**0<br />
CONTENTS, RELOC, READONLY, DEBUGGING<br />
10 .debug_aranges 00000020 00000000 00000000 000003b9 2**0<br />
CONTENTS, RELOC, READONLY, DEBUGGING<br />
11 .comment 0000002a 00000000 00000000 000003d9 2**0<br />
CONTENTS, READONLY<br />
12 .note.GNU-stack 00000000 00000000 00000000 00000403 2**0<br />
CONTENTS, READONLY<br />
</pre><br />
<br />
For most applications you can ignore the .debug* sections, these are not normally used for linking but instead for gdb. Sections within the file which are to be linked are marked as "LOAD" (SHF_ALLOC). Sections with an accompanying relocate table are marked as "RELOC" (SHF_ALLOC?), the allocation table seems to always follow in the section immediately following it.<br />
<br />
The definitions for headers are system and version specific, however mostly interchangeable. For instance for testing I used my /usr/include/'''elf.h''' from standard Ubuntu Linux distro and just added some ARM specific defines from another file and it worked fine. Another file of interest is elf32-arm.h (or elf32-x86.h) but more on that later... ^^<br />
<br />
==Linking==<br />
So first step in loading would be to identify all the loadable sections. The next step is to add all symbols of which the addresses are known from the file to the symbol table, such as any named addresses within the previously loaded sections.<br />
<br />
After loading all the loadable sections and adding known symbols can do final relocation. This involves modifying the relocatable sections marked with RELOC. <br />
<br />
Taking a look at the disassembly of the 'otherFunc' example can see (objdump -d):<br />
* otherFunc starts at 0x00000026 in it's section within the file<br />
* section .rodata + 0xd contains the string to print<br />
* puts has no value set (just -4)<br />
<br />
<source lang="asm"><br />
00000026 <otherFunc>:<br />
26: 55 push %ebp<br />
27: 89 e5 mov %esp,%ebp<br />
29: 83 ec 08 sub $0x8,%esp<br />
2c: c7 04 24 0d 00 00 00 movl $0xd,(%esp)<br />
2f: R_386_32 .rodata<br />
33: e8 fc ff ff ff call 34 <otherFunc+0xe><br />
34: R_386_PC32 puts<br />
38: c9 leave <br />
39: c3 ret <br />
</source><br />
<br />
What needs to now happen is the ram addresses of .rodata and puts functions need to be found and the values within otherFunc replaced with the proper ones. To assist in this is the relocation table section, found immediately following the section marked RELOC (not shown by objdump command?! but its there, trust me.. :P) Entries in this table define what address within the relocatable segment need external references, which symbol should be referenced and how the data should be modified. <br />
<br />
Relocation records for .text section (objdump -r)<br />
<pre><br />
RELOCATION RECORDS FOR [.text]:<br />
OFFSET TYPE VALUE <br />
00000010 R_386_32 .rodata<br />
00000015 R_386_PC32 puts<br />
0000002f R_386_32 .rodata<br />
00000034 R_386_PC32 puts<br />
</pre><br />
<br />
For example lets say:<br />
.rodata section was loaded into address 0x8000<br />
.text (program code) was loaded into 0x8100<br />
<br />
The relocation entry for .text address 0x2f specifies that at that adress there is a 32 bit reference to what was in the .rodata section.(the text "Hai2u! \^_^\n"). Since we have loaded them previously .text is now at 0x8100 so 0x2f becomes 0x8100+0x2f, and .rodata is now at 0x8000. These name/value pairs are also added to the system serial table. <br />
<br />
The linker needs to modify 0x812f to contain the proper address for .rodata (found by looking in the running system's symbol table since it was already added during a previous phase) which is 0x8000. But if you look the original value at that locaion is 0xd! This is because this value is intended to be added with whatever symbol value is requested, so finally... the proper address to write to 0x812f would be 0x8000+0xd or 0x800d :D<br />
<br />
For the value of 'puts', first it looks up where puts is in the system's symbol table. Since the relocation entry specifies it is R_386_PC32 this means the value is to be program counter relative (PC + value == call address). So to figure out the proper value it takes the address value of the symbol puts (for sake of demonstration lets say its at 0x70f4) minus the address value of the instruction (0x8134) and finally add on whatever original value was in the location... so: 0x70f4 - 0x8134 + 0xfffffffc (0xfffffffc == -4), or symaddr - relocaddr + original value; <br />
<br />
Now that function is loaded in ram and linked into all the other parts of the current system it needs. The otherFunc now can be called by looking up the symbol value address 'otherFunc' and casting it as a function:<br />
<source lang="c"><br />
typedef void(*_someFunc)(void);<br />
...<br />
((_someFunc)value)();<br />
</source><br />
<br />
Makes perfect sense right! u_u;;;;<br />
<br />
==ARM Thumb insanity==<br />
[[Image:Thlinker.png|right|Simple linking test. :D]]<br />
Immediately one problem became clear, while it worked fine on x86 code, even after adding the required relocation handling code for R_ARM_CALL and R_ARM_ABS32 (this was same as x86 abs32 btw :D) the arm9 linking test wasn't working properly. After digging a bit realized that libnds operates mostly in 16 bit Thumb mode. For this mode R_ARM_THM_PC22 relocation handling was needed.<br />
<br />
To get an idea how arm-eabi handles R_ARM_THM_PC22 i examined elf32-arm.h which contains the processor specific handling code and macros relating to relocation among other things. From this i immediately realized thumb being 16 bit uses two instructions for 'bl' each containing 11 bits representing the branch address and 5 bits for the branch high or branch low instrunctions. (0xf000 and 0xf800) Perfect sense right @_@)? <br />
<br />
<br />
<br />
Below is the source code that was linked into thlink (see image):<br />
<source lang="c"><br />
#include <stdio.h><br />
//Just filler so that otherFunc is offset for better testing<br />
int otherFunc(int argc, char **argv) {<br />
printf("otherFunc!\n");<br />
}<br />
<br />
int someFunc(void) {<br />
printf("Zomg! It Works! ^_^\n");<br />
}<br />
</source><br />
<br />
==Modules==<br />
Great!! Now you've got it all loaded and ran it and now dunt need it no more, so now what?! If only there was some scheme to keep track of which object files are loaded and what needs to be done to unload them. Well, this is what modules are for, I will probably base mine on the structure of [http://www.slac.stanford.edu/exp/glast/flight/sw/vxdocs/vxworks/ref/moduleLib.html moduleLib]. More on this later..</div>Erishttp://blea.ch/wiki/index.php/MediaWiki:SidebarMediaWiki:Sidebar2012-02-02T04:46:32Z<p>Eris: </p>
<hr />
<div>* navigation<br />
** mainpage|mainpage<br />
** recentchanges-url|recentchanges<br />
** ProjectWiki:Site_support|Support this site<br />
** ProjectWiki:Contact|Contact<br />
<br />
* libraries & drivers<br />
** Nitrofs|Nitrofs driver<br />
** Thmp3|Mp3 player lib<br />
** Thsprite|Danmaku lib<br />
** Thbg|BG management<br />
** Thsound|Sound lib<br />
** Thsfx|Video effects Lib<br />
** Thfifo|FIFO/IPC lib<br />
** RngLib|Ring Buffer lib<br />
** Thsound|SoundFx Lib<br />
** :Category:LIBTHDS|libraries used by thds<br />
* Information<br />
** Elf_linking|Elf Linking<br />
** Thds/Bullet_code_bits|Shmups & Danmaku code bits<br />
* games & apps<br />
** Thds|Touhou Fangame<br />
** Nyanroll|Rick/Nyanroll<br />
** Caramelldansen|(゚∀゚) Caramell Dansen Create<br />
<br />
* irssi scripts<br />
** Cdwn|countdown<br />
** Ddate|discordian date<br />
* eggdrop scripts<br />
** Voiceops|Voiceops<br />
** VHost_listing_script|vhost shell script<br />
<br />
* Other Stuffs<br />
** PPM_Meter|PPM Meter<br />
** PH_Meter|PH Meter<br />
** Path_Case_Script|Path Case Script<br />
** Thds/Bullet_code_bits|Shmups/Danmaku code samples<br />
** ID3v1_reader|ID3v1 parser<br />
** 3DCube|3DCube<br />
** Musics|My Musics<br />
** MiscLinks|Links to other useful sites<br />
** Lesbian_movies_happy_endings|Happy Endings<br />
<br />
* Categories<br />
** :Category:Video|Video<br />
** :Category:NDS|Nintendo DS<br />
** :Category:C|C Language</div>Erishttp://blea.ch/wiki/index.php/MediaWiki:SidebarMediaWiki:Sidebar2012-02-02T04:43:57Z<p>Eris: </p>
<hr />
<div>* navigation<br />
** mainpage|mainpage<br />
** recentchanges-url|recentchanges<br />
** ProjectWiki:Site_support|Support this site<br />
** ProjectWiki:Contact|Contact<br />
<br />
* libraries & drivers<br />
** [[Nitrofs|Nitrofs driver]] <br />
** [[Thmp3|Mp3 player lib]]<br />
** [[Thsprite|Danmaku lib]]<br />
** [[Thbg|BG management]]<br />
** [[Thsound|Sound lib]]<br />
** [[Thsfx|Video effects Lib]]<br />
** [[Thfifo|FIFO/IPC lib]]<br />
** [[RngLib|Ring Buffer lib]]<br />
** [[Thsound|SoundFx Lib]]<br />
** [[:Category:LIBTHDS|libraries used by thds]]<br />
* Information<br />
** [[Elf_linking|Elf Linking]]<br />
** [[Thds/Bullet_code_bits|Shmups & Danmaku code bits]]<br />
* games & apps<br />
** [[Thds|Touhou Fangame]]<br />
** [[Nyanroll|Rick/Nyanroll]]<br />
** [[Caramelldansen|(゚∀゚) Caramell Dansen Create]]<br />
<br />
* irssi scripts<br />
** [[Cdwn|countdown]] <br />
** [[Ddate|discordian date]]<br />
* eggdrop scripts<br />
** [[Voiceops|Voiceops]]<br />
** [[VHost_listing_script|vhost shell script]]<br />
<br />
* Other Stuffs<br />
** [[PPM_Meter|PPM Meter]]<br />
** [[PH_Meter|PH Meter]]<br />
** [[Path_Case_Script|Path Case Script]]<br />
** [[Thds/Bullet_code_bits|Shmups/Danmaku code samples]]<br />
** [[ID3v1_reader|ID3v1 parser]]<br />
** [[3DCube|3DCube]]<br />
** [[Musics|My Musics]]<br />
** [[MiscLinks|Links to other useful sites]]<br />
** [[Lesbian_movies_happy_endings|Happy Endings]]<br />
<br />
* Categories<br />
** [[:Category:Video|Video]]<br />
** [[:Category:NDS|Nintendo DS]]<br />
** [[:Category:C|C Language]]</div>Erishttp://blea.ch/wiki/index.php/MediaWiki:SidebarMediaWiki:Sidebar2012-02-02T04:41:06Z<p>Eris: </p>
<hr />
<div>* navigation<br />
** mainpage|mainpage<br />
** recentchanges-url|recentchanges<br />
** ProjectWiki:Site_support|Support this site<br />
** ProjectWiki:Contact|Contact<br />
<br />
<div class='portlet' id='p-navigation'><br />
<font size=-1>&nbsp;nds stuffs</font><br />
<div class='pBody' id='p-NavTree'><br />
{| border="0" width="100%" <br />
! align="left" colspan="1" |<br />
|- valign="top"; <br />
|<br />
* libraries & drivers<br />
** [[Nitrofs|Nitrofs driver]] <br />
** [[Thmp3|Mp3 player lib]]<br />
** [[Thsprite|Danmaku lib]]<br />
** [[Thbg|BG management]]<br />
** [[Thsound|Sound lib]]<br />
** [[Thsfx|Video effects Lib]]<br />
** [[Thfifo|FIFO/IPC lib]]<br />
** [[RngLib|Ring Buffer lib]]<br />
** [[Thsound|SoundFx Lib]]<br />
** [[:Category:LIBTHDS|libraries used by thds]]<br />
* Information<br />
** [[Elf_linking|Elf Linking]]<br />
** [[Thds/Bullet_code_bits|Shmups & Danmaku code bits]]<br />
* games & apps<br />
** [[Thds|Touhou Fangame]]<br />
** [[Nyanroll|Rick/Nyanroll]]<br />
** [[Caramelldansen|(゚∀゚) Caramell Dansen Create]]<br />
|}<br />
</div><br />
</div><br />
<br />
<div class='portlet' id='p-navigation'><br />
<font size=-1>&nbsp;irc stuffs</font><br />
<div class='pBody' id='p-NavTree'><br />
{| border="0" width="100%" <br />
! align="left" colspan="1" |<br />
|- valign="top"; <br />
|<br />
* irssi scripts<br />
** [[Cdwn|countdown]] <br />
** [[Ddate|discordian date]]<br />
* eggdrop scripts<br />
** [[Voiceops|Voiceops]]<br />
* [[VHost_listing_script|vhost shell script]]<br />
|}<br />
</div><br />
</div><br />
<br />
<div class='portlet' id='p-navigation'><br />
<font size=-1>&nbsp;misc...</font><br />
<div class='pBody' id='p-NavTree'><br />
{| border="0" width="100%" <br />
! align="left" colspan="1" |<br />
|- valign="top"; <br />
|<br />
* [[PPM_Meter|PPM Meter]]<br />
* [[PH_Meter|PH Meter]]<br />
* [[Path_Case_Script|Path Case Script]]<br />
* [[Thds/Bullet_code_bits|Shmups/Danmaku code samples]]<br />
* [[ID3v1_reader|ID3v1 parser]]<br />
* [[3DCube|3DCube]]<br />
* [[Musics|My Musics]]<br />
* [[MiscLinks|Links to other useful sites]]<br />
* [[Lesbian_movies_happy_endings|Happy Endings]]<br />
|}<br />
</div><br />
</div><br />
<br />
<div class='portlet' id='p-navigation'><br />
<font size=-1>&nbsp;Categories</font><br />
<div class='pBody' id='p-NavTree'><br />
{| border="0" width="100%" <br />
! align="left" colspan="1" |<br />
|- valign="top"; <br />
|<br />
* [[:Category:Video|Video]]<br />
* [[:Category:NDS|Nintendo DS]]<br />
* [[:Category:C|C Language]]<br />
|}<br />
</div><br />
</div></div>Erishttp://blea.ch/wiki/index.php/MediaWiki:SidebarMediaWiki:Sidebar2012-02-02T04:38:38Z<p>Eris: </p>
<hr />
<div>* navigation<br />
** mainpage|mainpage<br />
** recentchanges-url|recentchanges<br />
** ProjectWiki:Site_support|Support this site<br />
** ProjectWiki:Contact|Contact<br />
{{:NavTree}}</div>Erishttp://blea.ch/wiki/index.php/Talk:Main_PageTalk:Main Page2012-01-21T11:56:40Z<p>Eris: Replacing page with '<big>Due to a buncha asshat spammage to this page (which was blank) it has been protected.</big>
Please login or start an alternate page for site discussion, thanks.. :D'</p>
<hr />
<div><big>Due to a buncha asshat spammage to this page (which was blank) it has been protected.</big><br />
<br />
Please login or start an alternate page for site discussion, thanks.. :D</div>Erishttp://blea.ch/wiki/index.php/MiscLinksMiscLinks2012-01-21T10:22:25Z<p>Eris: Protected "MiscLinks" [edit=autoconfirmed:move=autoconfirmed]</p>
<hr />
<div>Links to other useful sites here. Feel free to add more, just be sure they're 'useful' and relevant to this sites interests.<br><br />
Thank you. ^^<br />
__TOC__<br />
==Touhou==<br />
[http://en.wikipedia.org/wiki/Touhou wikipedia article on touhou]<br><br />
[http://touhou.wikia.com/ English Touhou wiki]<br><br />
[http://www.pooshlmer.com/wakaba/ Touhou Image Board]<br><br />
[http://www16.big.or.jp/~zun/ ZUN's site]<br><br />
<br />
==Music==<br />
[http://www16.big.or.jp/~zun/html/music_old.html ZUN's older works]<br><br />
[http://www.critical.ne.jp/~kaze/ Lots of VGM] :D <br><br />
[http://www.battleofthebits.org/ BotB]Battle of the Bits, just go there... :p<br><br />
[http://kaorin.pestermom.com/index.html Kao's Useless Brigade] Touhou remixes and original music.<br><br />
[http://8bitcollective.com/ The 8 bit collective] collection of original VGM/8bit arranges and compositions<br><br />
[http://www.musictheory.halifax.ns.ca/19triplets.html One of the best sites I've seen on 'how music works' (theory)]<br />
<br />
==Music Synthesis==<br />
[http://www.analoguesque.com/modsynthesis.htm analoguesque.com] FM Synthisis code/math examples<br><br />
[http://www.soundshock.se/ Soundshock] English FM Synth forum<br><br />
[http://www.shipbrook.com/jeff/sb.html www.shipbrook.com/jeff/sb.html]OPL2 Register Map<br><br />
[http://sue.niko.to/ps98/ sue.niko.to] Various Yamaha FM chip board schematics and prototype examples<br><br />
<br />
==Nintendo DS Homebrews==<br />
[http://meraman.dip.jp/index.php?FrontPage Meraman's wiki] mml/midi background music driver, tutorials, and links to other HB sites.<br><br />
[http://a128.wordpress.com/ a128's blog] Floating point library, exception handler.<br><br />
[http://devkitpro.org/ devkitpro/libnds] The most popular toolchain and library for NDS homebrew.<br><br />
[http://blog.dev-scene.com/lacey/ Lacey's Investimagations] (its spelled that way :P)<br><br />
[http://www.liranuna.com/ Lira Nuna's dev blog]<br><br />
<br />
==Linux Dev==<br />
[http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html Kernel Module Building]<br><br />
[http://www.fsl.cs.sunysb.edu/kernel-api/index.html Device driver structure and function referece]<br><br />
[http://tldp.org/LDP/tlk/dd/drivers.html more info on creating linux device drivers]<br><br />
[http://lwn.net/Articles/21835/ Kernel Makefile info]<br />
[http://www.console-dev.de/2009/08/16/callstack-trace-on-the-nintendo-ds/ Callstack Trace for DS]<br />
<br />
==FreeBSD==<br />
[http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/jails-application.html Jails Admin]<br />
<br />
==ImageProcessing==<br />
[http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT5/node3.html image processing]<br />
<br />
==Win32 API==<br />
[http://www.catch22.net/tuts/tips Most all the basics :D]<br />
<br />
==Art/Graphis==<br />
[http://www.obsidiandawn.com/fantasy-brushes Incredible set of Photoshop/Gimp brushes]</div>Erishttp://blea.ch/wiki/index.php/MiscLinksMiscLinks2012-01-21T10:22:18Z<p>Eris: Reverted edits by 109.230.216.225 (Talk); changed back to last version by Wikisysop</p>
<hr />
<div>Links to other useful sites here. Feel free to add more, just be sure they're 'useful' and relevant to this sites interests.<br><br />
Thank you. ^^<br />
__TOC__<br />
==Touhou==<br />
[http://en.wikipedia.org/wiki/Touhou wikipedia article on touhou]<br><br />
[http://touhou.wikia.com/ English Touhou wiki]<br><br />
[http://www.pooshlmer.com/wakaba/ Touhou Image Board]<br><br />
[http://www16.big.or.jp/~zun/ ZUN's site]<br><br />
<br />
==Music==<br />
[http://www16.big.or.jp/~zun/html/music_old.html ZUN's older works]<br><br />
[http://www.critical.ne.jp/~kaze/ Lots of VGM] :D <br><br />
[http://www.battleofthebits.org/ BotB]Battle of the Bits, just go there... :p<br><br />
[http://kaorin.pestermom.com/index.html Kao's Useless Brigade] Touhou remixes and original music.<br><br />
[http://8bitcollective.com/ The 8 bit collective] collection of original VGM/8bit arranges and compositions<br><br />
[http://www.musictheory.halifax.ns.ca/19triplets.html One of the best sites I've seen on 'how music works' (theory)]<br />
<br />
==Music Synthesis==<br />
[http://www.analoguesque.com/modsynthesis.htm analoguesque.com] FM Synthisis code/math examples<br><br />
[http://www.soundshock.se/ Soundshock] English FM Synth forum<br><br />
[http://www.shipbrook.com/jeff/sb.html www.shipbrook.com/jeff/sb.html]OPL2 Register Map<br><br />
[http://sue.niko.to/ps98/ sue.niko.to] Various Yamaha FM chip board schematics and prototype examples<br><br />
<br />
==Nintendo DS Homebrews==<br />
[http://meraman.dip.jp/index.php?FrontPage Meraman's wiki] mml/midi background music driver, tutorials, and links to other HB sites.<br><br />
[http://a128.wordpress.com/ a128's blog] Floating point library, exception handler.<br><br />
[http://devkitpro.org/ devkitpro/libnds] The most popular toolchain and library for NDS homebrew.<br><br />
[http://blog.dev-scene.com/lacey/ Lacey's Investimagations] (its spelled that way :P)<br><br />
[http://www.liranuna.com/ Lira Nuna's dev blog]<br><br />
<br />
==Linux Dev==<br />
[http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html Kernel Module Building]<br><br />
[http://www.fsl.cs.sunysb.edu/kernel-api/index.html Device driver structure and function referece]<br><br />
[http://tldp.org/LDP/tlk/dd/drivers.html more info on creating linux device drivers]<br><br />
[http://lwn.net/Articles/21835/ Kernel Makefile info]<br />
[http://www.console-dev.de/2009/08/16/callstack-trace-on-the-nintendo-ds/ Callstack Trace for DS]<br />
<br />
==FreeBSD==<br />
[http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/jails-application.html Jails Admin]<br />
<br />
==ImageProcessing==<br />
[http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT5/node3.html image processing]<br />
<br />
==Win32 API==<br />
[http://www.catch22.net/tuts/tips Most all the basics :D]<br />
<br />
==Art/Graphis==<br />
[http://www.obsidiandawn.com/fantasy-brushes Incredible set of Photoshop/Gimp brushes]</div>Erishttp://blea.ch/wiki/index.php/ID3v1_readerID3v1 reader2012-01-21T10:21:42Z<p>Eris: Protected "ID3v1 reader" [edit=sysop:move=sysop]</p>
<hr />
<div><big>Simple ID3v1 Reader</big><br />
__TOC__<br />
==What is this?==<br />
A simple and quick command line ID3v1 tag reader for getting artist, title, etc data from mp3s. Googling for a pre-existing one was taking too long so decided to write this one night. Most of the others had lots of excess features, like a GUI, pffft! Enjoy the redundancy! :P<br />
<br />
==Examples==<br />
'''Compile'''<br><br />
This is obvious, just copy the code below to main.c and:<br />
<source lang="bash"><br />
gcc -o id3 main.c<br />
</source><br />
<br />
'''Using'''<br><br />
<pre><br />
~/Projects/mp3tagread$ ./id3 /media/160gb/e/MP3s/Dead\ Prez\ -\ Hip-Hop.mp3 <br />
title: Hip-Hop<br />
artist: Dead Prez<br />
album: Lets Get Free<br />
year: 2001 <br />
comment: <br />
genre: 12<br />
</pre><br />
<br />
'''Getting just one field'''<br />
<pre><br />
~/Projects/mp3tagread$ ./id3 /media/160gb/e/MP3s/Dead\ Prez\ -\ Hip-Hop.mp3 | grep "^title\:"<br />
title: Hip-Hop<br />
</pre><br />
<br />
'''Translating SJIS to UTF-8'''<br><br />
Requires the recode command, but can be used to translate id3 tags :D<br />
<pre><br />
~/Projects/mp3tagread$ ./id3 ~/Music/th03_東方夢時空\ ~\ Phantasmagoria\ \<br />
of\ Dim.Dream/th03_08-夢消失 ~Lost\ \<br />
Dream.mp3 | grep "^title\:" | recode -f SJIS...UTF-8<br />
title: 夢消失 〜Lost Dream ZUN(太田順也) 東方夢時空<br />
</pre><br />
<br />
(please note: the last example is entirely why i wrote this :P)<br />
<br />
==Source Code==<br />
<source lang="c"><br />
/**************************************************************<br />
* quicke mp3 id3 tag reader... written in 8 mins by erisu :P<br />
***************************************************************/<br />
#include <stdio.h><br />
<br />
#define MP3ID3V1MAGIC "TAG"<br />
#define MP3ID3V1MAGIC_SIZE 3<br />
<br />
<br />
//This at last 128 (-3 for "TAG") bytes of file is the tag<br />
typedef struct _ID3V1_T {<br />
char magic[3];<br />
char title[30];<br />
char artist[30];<br />
char album[30];<br />
char year[4];<br />
char comment[30];<br />
char genre;<br />
#ifdef ARM //This rly should be like "NDS" or something<br />
} ID3V1_T;<br />
#else<br />
} ID3V1_T __attribute__((packed));<br />
#endif<br />
<br />
int main(int argc, char **argv) {<br />
ID3V1_T id3;<br />
FILE *file;<br />
if(argc==2) {<br />
file=fopen(argv[1],"rb");<br />
if(file) {<br />
fseek(file, -sizeof(id3), SEEK_END);<br />
fread(&id3, sizeof(id3), 1, file);<br />
fclose(file);<br />
if(strncmp(id3.magic, MP3ID3V1MAGIC, MP3ID3V1MAGIC_SIZE)==0) {<br />
printf("title: %s\n", id3.title);<br />
printf("artist: %s\n", id3.artist);<br />
printf("album: %s\n", id3.album);<br />
printf("year: %s\n", id3.year);<br />
printf("comment: %s\n", id3.comment);<br />
printf("genre: %d\n", id3.genre);<br />
} else {<br />
printf("not id3?! (or id3 not at end of file)\n");<br />
}<br />
} else {<br />
printf("unable to open %s u_u\n");<br />
} <br />
} else {<br />
printf("usage: %s FILENAME.mp3\n",argv[0]);<br />
}<br />
}<br />
</source></div>Erishttp://blea.ch/wiki/index.php/ID3v1_readerID3v1 reader2012-01-21T10:21:33Z<p>Eris: </p>
<hr />
<div><big>Simple ID3v1 Reader</big><br />
__TOC__<br />
==What is this?==<br />
A simple and quick command line ID3v1 tag reader for getting artist, title, etc data from mp3s. Googling for a pre-existing one was taking too long so decided to write this one night. Most of the others had lots of excess features, like a GUI, pffft! Enjoy the redundancy! :P<br />
<br />
==Examples==<br />
'''Compile'''<br><br />
This is obvious, just copy the code below to main.c and:<br />
<source lang="bash"><br />
gcc -o id3 main.c<br />
</source><br />
<br />
'''Using'''<br><br />
<pre><br />
~/Projects/mp3tagread$ ./id3 /media/160gb/e/MP3s/Dead\ Prez\ -\ Hip-Hop.mp3 <br />
title: Hip-Hop<br />
artist: Dead Prez<br />
album: Lets Get Free<br />
year: 2001 <br />
comment: <br />
genre: 12<br />
</pre><br />
<br />
'''Getting just one field'''<br />
<pre><br />
~/Projects/mp3tagread$ ./id3 /media/160gb/e/MP3s/Dead\ Prez\ -\ Hip-Hop.mp3 | grep "^title\:"<br />
title: Hip-Hop<br />
</pre><br />
<br />
'''Translating SJIS to UTF-8'''<br><br />
Requires the recode command, but can be used to translate id3 tags :D<br />
<pre><br />
~/Projects/mp3tagread$ ./id3 ~/Music/th03_東方夢時空\ ~\ Phantasmagoria\ \<br />
of\ Dim.Dream/th03_08-夢消失 ~Lost\ \<br />
Dream.mp3 | grep "^title\:" | recode -f SJIS...UTF-8<br />
title: 夢消失 〜Lost Dream ZUN(太田順也) 東方夢時空<br />
</pre><br />
<br />
(please note: the last example is entirely why i wrote this :P)<br />
<br />
==Source Code==<br />
<source lang="c"><br />
/**************************************************************<br />
* quicke mp3 id3 tag reader... written in 8 mins by erisu :P<br />
***************************************************************/<br />
#include <stdio.h><br />
<br />
#define MP3ID3V1MAGIC "TAG"<br />
#define MP3ID3V1MAGIC_SIZE 3<br />
<br />
<br />
//This at last 128 (-3 for "TAG") bytes of file is the tag<br />
typedef struct _ID3V1_T {<br />
char magic[3];<br />
char title[30];<br />
char artist[30];<br />
char album[30];<br />
char year[4];<br />
char comment[30];<br />
char genre;<br />
#ifdef ARM //This rly should be like "NDS" or something<br />
} ID3V1_T;<br />
#else<br />
} ID3V1_T __attribute__((packed));<br />
#endif<br />
<br />
int main(int argc, char **argv) {<br />
ID3V1_T id3;<br />
FILE *file;<br />
if(argc==2) {<br />
file=fopen(argv[1],"rb");<br />
if(file) {<br />
fseek(file, -sizeof(id3), SEEK_END);<br />
fread(&id3, sizeof(id3), 1, file);<br />
fclose(file);<br />
if(strncmp(id3.magic, MP3ID3V1MAGIC, MP3ID3V1MAGIC_SIZE)==0) {<br />
printf("title: %s\n", id3.title);<br />
printf("artist: %s\n", id3.artist);<br />
printf("album: %s\n", id3.album);<br />
printf("year: %s\n", id3.year);<br />
printf("comment: %s\n", id3.comment);<br />
printf("genre: %d\n", id3.genre);<br />
} else {<br />
printf("not id3?! (or id3 not at end of file)\n");<br />
}<br />
} else {<br />
printf("unable to open %s u_u\n");<br />
} <br />
} else {<br />
printf("usage: %s FILENAME.mp3\n",argv[0]);<br />
}<br />
}<br />
</source></div>Erishttp://blea.ch/wiki/index.php/MusicsMusics2012-01-21T10:20:56Z<p>Eris: Protected "Musics" [edit=sysop:move=sysop]</p>
<hr />
<div><big>'''My musics ♪( ^-^)ノ☆♪'''</big><br />
Here are mp3s, plz enjoy. <br />
[[Image:Musicstuffs.jpg|thumb|250px|...]]<br />
☆ [http://blea.ch/~eris/litter/mrvainvstouhou101.mp3 Mr.Vain Vs. Touhou]<br><br />
Dear friend of mine sent me the old 1990's techno hit Mr. Vain, which brought back flood of memories.. I started playing along with it and thought o wow i should make a Touhou style version, and here it is. Hope you find it amusing I do. :D<br />
<br />
[http://blea.ch/~eris/litter/tx81z+sk88pro-2.4-clip.mp3 Tx81Z Test]<br><br />
I just bought a used Yamaha TX81Z FM Tone Module and this is first song I created with it. I need practice editing the sounds more. It comes preset with a lot of rather boring plain tones. Think this turned out okay for first attempt with new sounds. <br />
<br />
☆ [http://blea.ch/~eris/litter/omg-1.1.mp3 OMG!]<br><br />
Made this one ~ July 2010. Really like how it turned out, is very well planned. <br />
<br />
☆ [http://blea.ch/~eris/litter/wtg-3.mp3 WayToGo!]<br><br />
This is one I am very happy with, especially the ending which u can hear <br />
[http://blea.ch/~eris/litter/wtg-endingnosquares.mp3 Just the here w/out the squarewaves,]<br />
ALL done on SC-88Pro.<br />
<br />
[http://blea.ch/~eris/litter/lotus_land_story_final-eq.mp3 Lotus Land Story]<br><br />
title track from Touhou04 Lotus Land Story. Rendered on SK-88Pro. Agonized over this one for a while as it is one of my favorites, finished it months ago but only now listening to it again and isn't so bad. ^_^;<br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/eternalofshrinemaiden2.1-eq-dyn.mp3 Eternal Shrine Maiden.mp3 (Alt. Arrange)]<br><br />
''Alternate arrange'' ... Pleasing sounding sk88pro arrangement of ESM with nice ending. <br><br />
☆ [http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.mp3 Eternal Shrine Maiden.mp3 (Synth Arrange)] or <br />
[http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.flac (Synth Arrange lossless .flac)]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on SK-88Pro. This is a re-recording made after cleaning up my sound system and noticing the previous release sounded horrible. u_u;; Less distortion now than [http://blea.ch/~eris/litter/eternalofshrinemaiden4.mp3 original release.] and also changed the drums quite a bit. May make one more go at it this time with particular attention to making the instruments more distinct. <br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/maple%20dream%20ds%20psg.0.3.5.mp3 Maple Dream]<br><br />
Another MML, this time an arrangement of the Maple Dream off the Phantasmagoria of Dim. Dream soundtrack. Rendered on Nintendo DS. Think this one turned out quite well!☆ ^__^<br><br />
* [http://blea.ch/~eris/litter/mapledream.bdt .bdt for NDS_BGMFILER].<br />
* [http://blea.ch/~eris/litter/mapledream.mml.txt MML source file].<br />
<br />
<br />
[http://blea.ch/~eris/litter/Pyongyang%20Solstice.mp3 Pyongyang Solstice]<br><br />
Sorta rockish sounding song made in late december. <br />
<br />
<br />
[http://blea.ch/~eris/litter/incomplete%20happiness.0.6.mp3 Incomplete Happiness]<br><br />
Excited about getting an SK-88pro synth, made this.<br />
<br />
<br />
[http://blea.ch/~eris/litter/eternalshrinemaiden-nds-psg.mp3 Eternal Shrine Maiden PSG]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on NDS using the NDS_BGMDRV.<br />
* [http://blea.ch/~eris/litter/eternalofshrinemaiden.bdt bdt data file] that may be played using [http://meraman.dip.jp/index.php?NDS_BGMFILER NDS_BGMFILER]. <br />
* [http://blea.ch/~eris/litter/eternalshrinemaiden3.mml.txt mml source].<br />
<br />
<br />
Errata:<br />
* [http://blea.ch/~eris/litter/idgi3.0.mp3 I Dont Get it.mp3]<br />
* [http://blea.ch/~eris/litter/BlackTheCandle2.mp3 Black Candle.mp3]<br />
* [http://blea.ch/~eris/litter/hmmmz4.4.mp3 hmmm.mp3]<br />
* [http://blea.ch/~eris/litter/nfi4.1.mp3 N.F.I.mp3]<br />
<br />
<br />
[http://blea.ch/~eris/litter/hmmmz4.4.mp3 SongNAme]<br><br />
This song is an attempt at creating a Touhouish style composition entirely from scratch. Saying attempt because I feel it falls short, but somehow it persuades me to post itself here. <br />
<br />
[http://blea.ch/~eris/litter/myfirst.mml.mp3 Myfirst.mml]<br><br />
My first experiment in MML, rendered on Nintendo DS. More information [[Thds#2008.10.19_.7E_MML_rant|here]]. ^^<br />
<br />
<br />
[http://www.octiva.net/planks/ Old music page here]<br><br />
Here are old music page. Songs here are from between 1994 to 2005.<br />
<br />
<br />
☆ = songs I likes the best :D</div>Erishttp://blea.ch/wiki/index.php/MusicsMusics2012-01-21T10:20:49Z<p>Eris: </p>
<hr />
<div><big>'''My musics ♪( ^-^)ノ☆♪'''</big><br />
Here are mp3s, plz enjoy. <br />
[[Image:Musicstuffs.jpg|thumb|250px|...]]<br />
☆ [http://blea.ch/~eris/litter/mrvainvstouhou101.mp3 Mr.Vain Vs. Touhou]<br><br />
Dear friend of mine sent me the old 1990's techno hit Mr. Vain, which brought back flood of memories.. I started playing along with it and thought o wow i should make a Touhou style version, and here it is. Hope you find it amusing I do. :D<br />
<br />
[http://blea.ch/~eris/litter/tx81z+sk88pro-2.4-clip.mp3 Tx81Z Test]<br><br />
I just bought a used Yamaha TX81Z FM Tone Module and this is first song I created with it. I need practice editing the sounds more. It comes preset with a lot of rather boring plain tones. Think this turned out okay for first attempt with new sounds. <br />
<br />
☆ [http://blea.ch/~eris/litter/omg-1.1.mp3 OMG!]<br><br />
Made this one ~ July 2010. Really like how it turned out, is very well planned. <br />
<br />
☆ [http://blea.ch/~eris/litter/wtg-3.mp3 WayToGo!]<br><br />
This is one I am very happy with, especially the ending which u can hear <br />
[http://blea.ch/~eris/litter/wtg-endingnosquares.mp3 Just the here w/out the squarewaves,]<br />
ALL done on SC-88Pro.<br />
<br />
[http://blea.ch/~eris/litter/lotus_land_story_final-eq.mp3 Lotus Land Story]<br><br />
title track from Touhou04 Lotus Land Story. Rendered on SK-88Pro. Agonized over this one for a while as it is one of my favorites, finished it months ago but only now listening to it again and isn't so bad. ^_^;<br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/eternalofshrinemaiden2.1-eq-dyn.mp3 Eternal Shrine Maiden.mp3 (Alt. Arrange)]<br><br />
''Alternate arrange'' ... Pleasing sounding sk88pro arrangement of ESM with nice ending. <br><br />
☆ [http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.mp3 Eternal Shrine Maiden.mp3 (Synth Arrange)] or <br />
[http://blea.ch/~eris/litter/eternal%20shrine%20maiden%2009.7.16.flac (Synth Arrange lossless .flac)]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on SK-88Pro. This is a re-recording made after cleaning up my sound system and noticing the previous release sounded horrible. u_u;; Less distortion now than [http://blea.ch/~eris/litter/eternalofshrinemaiden4.mp3 original release.] and also changed the drums quite a bit. May make one more go at it this time with particular attention to making the instruments more distinct. <br />
<br />
<br />
☆ [http://blea.ch/~eris/litter/maple%20dream%20ds%20psg.0.3.5.mp3 Maple Dream]<br><br />
Another MML, this time an arrangement of the Maple Dream off the Phantasmagoria of Dim. Dream soundtrack. Rendered on Nintendo DS. Think this one turned out quite well!☆ ^__^<br><br />
* [http://blea.ch/~eris/litter/mapledream.bdt .bdt for NDS_BGMFILER].<br />
* [http://blea.ch/~eris/litter/mapledream.mml.txt MML source file].<br />
<br />
<br />
[http://blea.ch/~eris/litter/Pyongyang%20Solstice.mp3 Pyongyang Solstice]<br><br />
Sorta rockish sounding song made in late december. <br />
<br />
<br />
[http://blea.ch/~eris/litter/incomplete%20happiness.0.6.mp3 Incomplete Happiness]<br><br />
Excited about getting an SK-88pro synth, made this.<br />
<br />
<br />
[http://blea.ch/~eris/litter/eternalshrinemaiden-nds-psg.mp3 Eternal Shrine Maiden PSG]<br><br />
from Touhou01 The Highly Responsive to Prayers, levels 1 ~ 4. Rendered on NDS using the NDS_BGMDRV.<br />
* [http://blea.ch/~eris/litter/eternalofshrinemaiden.bdt bdt data file] that may be played using [http://meraman.dip.jp/index.php?NDS_BGMFILER NDS_BGMFILER]. <br />
* [http://blea.ch/~eris/litter/eternalshrinemaiden3.mml.txt mml source].<br />
<br />
<br />
Errata:<br />
* [http://blea.ch/~eris/litter/idgi3.0.mp3 I Dont Get it.mp3]<br />
* [http://blea.ch/~eris/litter/BlackTheCandle2.mp3 Black Candle.mp3]<br />
* [http://blea.ch/~eris/litter/hmmmz4.4.mp3 hmmm.mp3]<br />
* [http://blea.ch/~eris/litter/nfi4.1.mp3 N.F.I.mp3]<br />
<br />
<br />
[http://blea.ch/~eris/litter/hmmmz4.4.mp3 SongNAme]<br><br />
This song is an attempt at creating a Touhouish style composition entirely from scratch. Saying attempt because I feel it falls short, but somehow it persuades me to post itself here. <br />
<br />
[http://blea.ch/~eris/litter/myfirst.mml.mp3 Myfirst.mml]<br><br />
My first experiment in MML, rendered on Nintendo DS. More information [[Thds#2008.10.19_.7E_MML_rant|here]]. ^^<br />
<br />
<br />
[http://www.octiva.net/planks/ Old music page here]<br><br />
Here are old music page. Songs here are from between 1994 to 2005.<br />
<br />
<br />
☆ = songs I likes the best :D</div>Erishttp://blea.ch/wiki/index.php/Lesbian_movies_happy_endingsLesbian movies happy endings2012-01-21T10:19:57Z<p>Eris: Protected "Lesbian movies happy endings" [edit=autoconfirmed:move=autoconfirmed]</p>
<hr />
<div>==English Feature Movies==<br />
Romantic lesbian movies with happy ending (ie: two women end up together)<br />
# Desert Hearts (1985) http://www.imdb.com/title/tt0089015/<br />
# The Incredibly True Adventure of Two Girls in Love (1995) http://www.imdb.com/title/tt0113416/ http://en.wikipedia.org/wiki/The_Incredibly_True_Adventure_of_Two_Girls_in_Love<br />
# When Night Is Falling (1995) http://www.imdb.com/title/tt0114916/ http://en.wikipedia.org/wiki/When_Night_Is_Falling<br />
# Bound (1996) http://www.imdb.com/title/tt0115736/<br />
# All Over Me (1997) http://www.imdb.com/title/tt0118586/ http://en.wikipedia.org/wiki/All_Over_Me<br />
# But I'm a Cheerleader (1999) http://www.imdb.com/title/tt0179116/<br />
# Chutney Popcorn (1999) http://www.imdb.com/title/tt0126240/ http://en.wikipedia.org/wiki/Chutney_Popcorn<br />
# Between Two Women (2000) http://www.imdb.com/title/tt0319056/<br />
# D.E.B.S. (2004) http://www.imdb.com/title/tt0367631/ http://en.wikipedia.org/wiki/D.E.B.S._(2004_film)<br />
# Saving Face (2004) http://www.imdb.com/title/tt0384504/ http://en.wikipedia.org/wiki/Saving_Face<br />
# Imagine Me & You (2005) http://www.imdb.com/title/tt0421994/ http://en.wikipedia.org/wiki/Imagine_Me_%26_You<br />
# The Gymnast (2006) http://www.imdb.com/title/tt0473074/ (ambiguous, but positive)<br />
# Nina's Heavenly Delights (2006) http://www.imdb.com/title/tt0435706/<br />
# Puccini For Beginners (2006) http://www.imdb.com/title/tt0492481/ http://en.wikipedia.org/wiki/Puccini_for_Beginners<br />
# I Can't Think Straight (2007) http://www.imdb.com/title/tt0830570/<br />
# With Every Heartbeat/Kyss Mig (2011) http://www.imdb.com/title/tt1859522/<br />
<br />
==Non-English Movies==<br />
# Show Me Love / Fucking Åmål (1998) http://www.imdb.com/title/tt0150662/<br />
# Producing Adults / Lapsia ja aikuisia http://www.imdb.com/title/tt0366701/ http://en.wikipedia.org/wiki/Producing_Adults<br />
<br />
==Made for TV and TV Episodes==<br />
# Tipping the Velvet (2002) (TV) http://www.imdb.com/title/tt0324264/<br />
# Nikki and Nora (2004) (TV) http://www.imdb.com/title/tt1320104/ (unaired TV pilot)<br />
# Fingersmith (2005) (TV) http://www.imdb.com/title/tt0423651/<br />
# "Without a Trace" TV episode "Check Your Head" (Season 4, Episode 17) (2006) http://www.imdb.com/title/tt0757046/<br />
# "Ghost Whisperer" TV episode "Slam" (Season 3, Episode 11) (2008) http://www.imdb.com/title/tt1143390/<br />
<br />
==Subplots==<br />
# If These Walls Could Talk 2 (2000) (TV) http://www.imdb.com/title/tt0206036/ http://en.wikipedia.org/wiki/If_These_Walls_Could_Talk_2 ("1972" and "2000" subplots)<br />
# What's Cooking? (2000) http://www.imdb.com/title/tt0197096/ http://en.wikipedia.org/wiki/What%27s_Cooking%3F<br />
# Eulogy (2004) http://en.wikipedia.org/wiki/Eulogy_(film)<br />
<br />
==Honorable mentions==<br />
# http://en.wikipedia.org/wiki/Fried_Green_Tomatoes_(film)<br />
<br />
==At least no one died==<br />
# Personal Best (1982)<br />
# Lianna (1983) http://en.wikipedia.org/wiki/Lianna<br />
# The Bostonians (1984)<br />
# Losing Chase (1996)<br />
# The Truth About Jane (2000) (TV) http://www.imdb.com/title/tt0256459/ http://www.afterellen.com/archive/ellen/Movies/thetruthaboutjane.html<br />
# A Girl Thing (2001) (TV) http://www.imdb.com/title/tt0249603/ http://www.afterellen.com/archive/ellen/Movies/agirlthing.html<br />
# Gray Matters (2007) http://www.imdb.com/title/tt0375785/ http://en.wikipedia.org/wiki/Gray_Matters<br />
# The Guitar (2008)<br />
<br />
==Ending unverified==<br />
* An Unexpected Love (2003) (TV) http://www.imdb.com/title/tt0329679/ http://www.afterellen.com/archive/ellen/TV/unexpectedlove.html<br />
* Better Than Chocolate (1999) http://www.imdb.com/title/tt0168987/ http://en.wikipedia.org/wiki/Better_Than_Chocolate http://www.afterellen.com/movies/2007/8/betterthanchocolate<br />
* Unveiled / Fremde Haut (2005) http://www.imdb.com/title/tt0428672/ http://en.wikipedia.org/wiki/Fremde_Haut<br />
* Mango Kiss (2004) http://en.wikipedia.org/wiki/Mango_Kiss http://www.afterellen.com/archive/ellen/Movies/112004/mangokiss.html<br />
* Red Doors (2006) http://www.imdb.com/title/tt0415234/ http://en.wikipedia.org/wiki/Red_Doors http://www.afterellen.com/archive/ellen/Movies/2005/8/reddoors.html<br />
* Leaving Normal<br />
* Floored by Love<br />
* Late Bloomers (1996) http://www.imdb.com/title/tt0116834/<br />
* Bobbie's Girl (2002) (TV) http://www.imdb.com/title/tt0317179/<br />
* http://en.wikipedia.org/wiki/Bar_Girls<br />
* http://en.wikipedia.org/wiki/Love_and_Other_Catastrophes<br />
* Girl Play (2004) http://en.wikipedia.org/wiki/Girl_Play<br />
* Standing Still http://www.imdb.com/title/tt0360016/<br />
* The Girl (2000) http://www.imdb.com/title/tt0249538/ <br />
* April's Shower (2006) http://en.wikipedia.org/wiki/April's_Shower<br />
* Out Of Season<br />
* Intentions<br />
* Exes & Ohs<br />
* The L-Word<br />
* Watching you (4 Shorts 2003) The Ten Rules, 4PM, Interviews With My Next Girlfriend<br />
<br />
==Doubtful re: ending==<br />
* http://en.wikipedia.org/wiki/It's_in_the_Water<br />
* Things You Can Tell Just by Looking at Her http://en.wikipedia.org/wiki/Things_You_Can_Tell_Just_by_Looking_at_Her</div>Erishttp://blea.ch/wiki/index.php/Lesbian_movies_happy_endingsLesbian movies happy endings2012-01-21T10:19:49Z<p>Eris: </p>
<hr />
<div>==English Feature Movies==<br />
Romantic lesbian movies with happy ending (ie: two women end up together)<br />
# Desert Hearts (1985) http://www.imdb.com/title/tt0089015/<br />
# The Incredibly True Adventure of Two Girls in Love (1995) http://www.imdb.com/title/tt0113416/ http://en.wikipedia.org/wiki/The_Incredibly_True_Adventure_of_Two_Girls_in_Love<br />
# When Night Is Falling (1995) http://www.imdb.com/title/tt0114916/ http://en.wikipedia.org/wiki/When_Night_Is_Falling<br />
# Bound (1996) http://www.imdb.com/title/tt0115736/<br />
# All Over Me (1997) http://www.imdb.com/title/tt0118586/ http://en.wikipedia.org/wiki/All_Over_Me<br />
# But I'm a Cheerleader (1999) http://www.imdb.com/title/tt0179116/<br />
# Chutney Popcorn (1999) http://www.imdb.com/title/tt0126240/ http://en.wikipedia.org/wiki/Chutney_Popcorn<br />
# Between Two Women (2000) http://www.imdb.com/title/tt0319056/<br />
# D.E.B.S. (2004) http://www.imdb.com/title/tt0367631/ http://en.wikipedia.org/wiki/D.E.B.S._(2004_film)<br />
# Saving Face (2004) http://www.imdb.com/title/tt0384504/ http://en.wikipedia.org/wiki/Saving_Face<br />
# Imagine Me & You (2005) http://www.imdb.com/title/tt0421994/ http://en.wikipedia.org/wiki/Imagine_Me_%26_You<br />
# The Gymnast (2006) http://www.imdb.com/title/tt0473074/ (ambiguous, but positive)<br />
# Nina's Heavenly Delights (2006) http://www.imdb.com/title/tt0435706/<br />
# Puccini For Beginners (2006) http://www.imdb.com/title/tt0492481/ http://en.wikipedia.org/wiki/Puccini_for_Beginners<br />
# I Can't Think Straight (2007) http://www.imdb.com/title/tt0830570/<br />
# With Every Heartbeat/Kyss Mig (2011) http://www.imdb.com/title/tt1859522/<br />
<br />
==Non-English Movies==<br />
# Show Me Love / Fucking Åmål (1998) http://www.imdb.com/title/tt0150662/<br />
# Producing Adults / Lapsia ja aikuisia http://www.imdb.com/title/tt0366701/ http://en.wikipedia.org/wiki/Producing_Adults<br />
<br />
==Made for TV and TV Episodes==<br />
# Tipping the Velvet (2002) (TV) http://www.imdb.com/title/tt0324264/<br />
# Nikki and Nora (2004) (TV) http://www.imdb.com/title/tt1320104/ (unaired TV pilot)<br />
# Fingersmith (2005) (TV) http://www.imdb.com/title/tt0423651/<br />
# "Without a Trace" TV episode "Check Your Head" (Season 4, Episode 17) (2006) http://www.imdb.com/title/tt0757046/<br />
# "Ghost Whisperer" TV episode "Slam" (Season 3, Episode 11) (2008) http://www.imdb.com/title/tt1143390/<br />
<br />
==Subplots==<br />
# If These Walls Could Talk 2 (2000) (TV) http://www.imdb.com/title/tt0206036/ http://en.wikipedia.org/wiki/If_These_Walls_Could_Talk_2 ("1972" and "2000" subplots)<br />
# What's Cooking? (2000) http://www.imdb.com/title/tt0197096/ http://en.wikipedia.org/wiki/What%27s_Cooking%3F<br />
# Eulogy (2004) http://en.wikipedia.org/wiki/Eulogy_(film)<br />
<br />
==Honorable mentions==<br />
# http://en.wikipedia.org/wiki/Fried_Green_Tomatoes_(film)<br />
<br />
==At least no one died==<br />
# Personal Best (1982)<br />
# Lianna (1983) http://en.wikipedia.org/wiki/Lianna<br />
# The Bostonians (1984)<br />
# Losing Chase (1996)<br />
# The Truth About Jane (2000) (TV) http://www.imdb.com/title/tt0256459/ http://www.afterellen.com/archive/ellen/Movies/thetruthaboutjane.html<br />
# A Girl Thing (2001) (TV) http://www.imdb.com/title/tt0249603/ http://www.afterellen.com/archive/ellen/Movies/agirlthing.html<br />
# Gray Matters (2007) http://www.imdb.com/title/tt0375785/ http://en.wikipedia.org/wiki/Gray_Matters<br />
# The Guitar (2008)<br />
<br />
==Ending unverified==<br />
* An Unexpected Love (2003) (TV) http://www.imdb.com/title/tt0329679/ http://www.afterellen.com/archive/ellen/TV/unexpectedlove.html<br />
* Better Than Chocolate (1999) http://www.imdb.com/title/tt0168987/ http://en.wikipedia.org/wiki/Better_Than_Chocolate http://www.afterellen.com/movies/2007/8/betterthanchocolate<br />
* Unveiled / Fremde Haut (2005) http://www.imdb.com/title/tt0428672/ http://en.wikipedia.org/wiki/Fremde_Haut<br />
* Mango Kiss (2004) http://en.wikipedia.org/wiki/Mango_Kiss http://www.afterellen.com/archive/ellen/Movies/112004/mangokiss.html<br />
* Red Doors (2006) http://www.imdb.com/title/tt0415234/ http://en.wikipedia.org/wiki/Red_Doors http://www.afterellen.com/archive/ellen/Movies/2005/8/reddoors.html<br />
* Leaving Normal<br />
* Floored by Love<br />
* Late Bloomers (1996) http://www.imdb.com/title/tt0116834/<br />
* Bobbie's Girl (2002) (TV) http://www.imdb.com/title/tt0317179/<br />
* http://en.wikipedia.org/wiki/Bar_Girls<br />
* http://en.wikipedia.org/wiki/Love_and_Other_Catastrophes<br />
* Girl Play (2004) http://en.wikipedia.org/wiki/Girl_Play<br />
* Standing Still http://www.imdb.com/title/tt0360016/<br />
* The Girl (2000) http://www.imdb.com/title/tt0249538/ <br />
* April's Shower (2006) http://en.wikipedia.org/wiki/April's_Shower<br />
* Out Of Season<br />
* Intentions<br />
* Exes & Ohs<br />
* The L-Word<br />
* Watching you (4 Shorts 2003) The Ten Rules, 4PM, Interviews With My Next Girlfriend<br />
<br />
==Doubtful re: ending==<br />
* http://en.wikipedia.org/wiki/It's_in_the_Water<br />
* Things You Can Tell Just by Looking at Her http://en.wikipedia.org/wiki/Things_You_Can_Tell_Just_by_Looking_at_Her</div>Erishttp://blea.ch/wiki/index.php/DdateDdate2012-01-21T10:17:47Z<p>Eris: Protected "Ddate" [edit=sysop:move=sysop]</p>
<hr />
<div><big>PERL Discordian Date Script for Irssi IRC Client</big><br />
== Whats it do? ==<br />
When u type !ddate in a channel it responds like:<br />
<@erisia> !ddate<br />
<@eris> Today is Pungenday, day 46 in the season of The Aftermath,3173.<br />
<br />
Should display Discordian holy days as well! :P (tho I've never actually checked it on a holy day)<br />
<br />
== Releases ==<br />
[[http://blea.ch/~eris/litter/ddate.txt Download latest release. Version FIVE :P]] <br /><br />
<br />
== Install ==<br />
Download ddate.txt from the link above, remove the .txt extention and copy to ur .irssi/scripts/ dir (or .irssi/scripts/autorun/ :)<br />
<source lang="bash"><br />
wget http://blea.ch/~eris/litter/ddate.txt<br />
mv ddate.txt ~/.irssi/scripts/<br />
</source><br />
load the script (from inside of irssi):<br />
/script load ddate.pl<br />
and then type<br />
/set cdwn <br />
in irssi to see the settings. ^^<br />
<br />
== Header Text ==<br />
<source lang="perl"><br />
#This program takes no arguments. It doesn't take shit from _anyone_.<br />
#<br />
#It returns today's date in the Discordian calendar format. It also<br />
#tells you if today is a Holyday.<br />
#<br />
#This program is written in perl to maximize the amount of chaos in<br />
#the implementation.<br />
</source><br />
<br />
Hail Eris! -><-</div>Erishttp://blea.ch/wiki/index.php/DdateDdate2012-01-21T10:17:40Z<p>Eris: </p>
<hr />
<div><big>PERL Discordian Date Script for Irssi IRC Client</big><br />
== Whats it do? ==<br />
When u type !ddate in a channel it responds like:<br />
<@erisia> !ddate<br />
<@eris> Today is Pungenday, day 46 in the season of The Aftermath,3173.<br />
<br />
Should display Discordian holy days as well! :P (tho I've never actually checked it on a holy day)<br />
<br />
== Releases ==<br />
[[http://blea.ch/~eris/litter/ddate.txt Download latest release. Version FIVE :P]] <br /><br />
<br />
== Install ==<br />
Download ddate.txt from the link above, remove the .txt extention and copy to ur .irssi/scripts/ dir (or .irssi/scripts/autorun/ :)<br />
<source lang="bash"><br />
wget http://blea.ch/~eris/litter/ddate.txt<br />
mv ddate.txt ~/.irssi/scripts/<br />
</source><br />
load the script (from inside of irssi):<br />
/script load ddate.pl<br />
and then type<br />
/set cdwn <br />
in irssi to see the settings. ^^<br />
<br />
== Header Text ==<br />
<source lang="perl"><br />
#This program takes no arguments. It doesn't take shit from _anyone_.<br />
#<br />
#It returns today's date in the Discordian calendar format. It also<br />
#tells you if today is a Holyday.<br />
#<br />
#This program is written in perl to maximize the amount of chaos in<br />
#the implementation.<br />
</source><br />
<br />
Hail Eris! -><-</div>Erishttp://blea.ch/wiki/index.php/3DCube3DCube2012-01-21T10:16:55Z<p>Eris: Protected "3DCube" [edit=sysop:move=sysop]</p>
<hr />
<div><big>Image Processing Software</big><br />
<br />
__TOC__<br />
==What is it?==<br />
{| border="0" width="100%"<br />
! align="center" colspan="2" valign="top"|<br />
|- valign="top"; <br />
|<br />
3D Cube is an optical metrology system for acquiring measurements from image data. The objective of this project is to quickly determine the volumetric data of an object using high resolution camera with as little operator intervention as possible. Currently the system will detect and measure most objects with a single click, however the program may be adjusted to compensate for the environment, improve speed, selectivity, and desired accuracy.<br />
<br />
Currently the only supported input format is .png files. The software may be easily adapted to accept images directly from high resolution cameras or video sources as required.<br />
<br />
Background clutter, writing, etc... will not affect detection so long as there are no other rectangles in the image larger than the one being measured. By default the rectangles can be at any angle between -30 and 30 degrees and still be detected accurately. The box must be generally centered in middle of the image however a great amount of offset is allowed, so long as the each edge of the box is in a different quadrant of the screen measurements will not be affected.<br />
<br />
The images to right are some examples of output. <br />
<br />
3DCude software contains completely original code written specifically for the project. Only the standard Win32 and LibPNG libraries were used. <br />
<br />
|<br />
{| border="0" width="100%"<br />
! align="center" colspan="2" valign="top"|<br />
|- valign="top"; <br />
|<br />
[[Image:Irregularbox.png|thumb|Measurements of irregularly shaped box]]<br />
|-<br />
[[Image:Boxwithmeasurements.png|thumb|Box and its measurements...]]<br />
|}<br />
|<br />
{| border="0" width="100%"<br />
! align="center" colspan="2" valign="top"|<br />
|- valign="top"; <br />
|<br />
[[Image:Qvcbox.png|thumb|Another misshapen box]]<br />
|-<br />
[[Image:Akyusperfectmeasure.png|thumb|Perfect measurement of CD]]<br />
|}<br />
|}<br />
<br />
==How does it work?==<br />
{| border="0" width="100%"<br />
! align="center" colspan="2" valign="top"|<br />
|- valign="top"; <br />
|<br />
In the most basic sense, the system first identifies all straight edges within the image using various filters and the well documented Hough Transform which is able to detect lines even in otherwise cluttered images. Next it finds the largest rectangle formed by these lines and from that the size of the box can be determined in pixels. This combined with height information obtained either via lasers, stereoscopic cameras, or using multiple light sources and shadows can be then used to obtain volumetric information in future versions.<br />
<br />
The process actually involves about two dozen individual procedures. During each step a variety of settings may be adjusted or even performed manually in order to allow less or more perfect rectangles to be found. In this way accuracy can be increased depending on the application. Some of these steps may be observed during program's operation such as binary conversion of the image.<br />
<br />
For purposes of discussion these procedures can be grouped into these major steps: <br />
* Preprocessing<br />
* Transformation<br />
* Post-processing.<br />
* and measuring.<br />
|<br />
[[Image:Brooklyn_B.png|150px|center|thumb|Original image of Brookyln bridge before binary conversion.]]<br />
|<br />
[[Image:Bbridgelines.png|thumb|150px|Lines found in image after binary conversion and applying the rough transform.]]<br />
|}<br />
[[Image:Rubicsbinary.png|thumb|right|120px|Binary image of cube after high-pass filtering.]]<br />
'''Preprocessing'''<br><br />
The process begins by obtaining an edge enhanced binary image—where the pixels are either totally black or totally white—using 3x3 kernel based blur and high-pass filters. This results in an image where the edges of objects are clearly visible.<br />
<br />
At this time it is possible to apply additional filters such as thinning, erodes, medians, etc to further enhance the desired edges or compensate for noise and/or clutter in the images. Some of these filters are provided in 3DCube but are not at present utilized by default, they may however be applied manually in order to experiment with various processing techniques.<br />
<br />
[[Image:Rubicshough.png|thumb|right|Demonstration of Hough's inner workings. Image on right represent votes for potential lines, bright spots represent most likely line parameters and have more votes while darker areas have less votes. This representation is commonly refered to as 'Hough space'.]]<br />
'''Transformation'''<br><br />
Next the image is translated into Hough space as shown in the image on right. This is done by calculating all possible lines intersecting each white pixel in the binary source image. Lines are represented use rho (distance), theta (angle) parameterization which corrosponds to a distance and angle perpendicular from the top left of source image. In this way every possible line may be represented by only 2 parameters (rho/theta). In the Hough space accumulator image X coordinate is the angle (theta), and Y coord is the distance (rho). Each possible line intersecting each white pixel gets a 'vote' in the Hough space accumulator. As a the white pixels in a straight line are processed, lines common to each pixel accumulate more votes. This can be observed in image on right as the brighter spots, called ''local maxima''.<br />
<br />
With the Rubic's cube image its very easy to see the 4 bright spots representing lines at 71 degrees and the 5 bright spots representing lines at 161 degrees (right angle of 71 degrees). There are 5 spots at 161 degrees because of the shadow cast by the flash. <br />
<br />
'''Postprocessing'''<br><br />
Now that the Hough space image contains line vote informations, it too may be processed as an image to further enhance the votes. <br />
<br />
Next 3DCube must decide which are important lines and which are random clutter. It does this using a variety of proprietary procedures which determine the threshold for what is considered an accepted vote, detecting related lines, and finally for determining which rectangle formed by the lines is most likely the target to be measured.<br />
<br />
'''Measuring'''<br><br />
Finally the coordinates designating the corner of the box are located using the matrix below, which finds the intersection of two lines described as rho/theta (r1, θ1 and r2, θ2): <br />
<pre><br />
AX = b, where<br />
<br />
A = [cos θ1 sin θ1] b = |r1| X = |x|<br />
[cos θ2 sin θ2] |r2| |y|<br />
</pre><br />
<br />
From two points on opposite sides (x1,y1 and x2,y2) it is possible to calculate the distance between them using:<br />
<pre><br />
sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));<br />
</pre><br />
<br />
==Can it find other shapes?==<br />
{| border="0" width="100%"<br />
! align="center" colspan="2" valign="top"|<br />
|- valign="top"; <br />
|<br />
It is possible with some reprogramming to allow accepting any numbers of sides, even circles. In some cases, this may slow the process down. <br />
<br />
The images on the right shows how other images may be detected. <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
|<br />
[[Image:S3500057.png|thumb|Original star image.]]<br />
|<br />
[[Image:Starpnk.png|thumb|Lines found from image.]]<br />
|}<br />
<br />
==Download==<br />
[[Image:3dcubestart.png|thumb|3D Cube's startup screen.]] <br />
3DCube is written for Windows but will run fine and was even developed under Wine on linux. currently offered in executable format only. The archive contains the .exe as well as several images for testing and evaluation. Any image in the PNG file format may be used.<br />
<br />
3DCube executable may be downloaded [http://blea.ch/~eris/win32application.rar here] in rar archive format.<br />
<br />
Since the file contains several test image, total size is 57MB. Please allow some time for download to complete.<br />
<br />
==Operation==<br />
Simply unrar the archive, and click on win32application.exe. To open images click the Open Image button, to process an image click the button labeled Automagic.<br />
<br />
==Advanced Operations==<br />
'''The Operations Menu'''<br><br />
[[Image:Dropdown.png|thumb|100px|Operations menu]]<br />
The operations menu also offers many filters, many of which should be familiar to users of image editing programs. Including:<br />
* Subtract ~ Displays the difference between two equally sized images (Images 1 and 2)<br />
* Revert ~ to original image<br />
* Histogram EQ ~ Auto adjust image brightness<br />
* Amplify ~ Adjust brightness and contrast of image<br />
* Blur<br />
* Sharpen<br />
* High-pass ~ This is essentally an edge enhancement tool, typically applied after one or more blur cycles and results in a binary image.<br />
* Erode ~ Finds minimum value in a 3x3 neighborhood. Shrinks objects<br />
* Median ~ Finds the median value of pixels in a 3x3 neighborhood. Good for speckle and noise reduction.<br />
* Dilate ~ Blur maximum value in 3x3 neighborhood. Expands objects.<br />
* Random ~ randomly selects a pixel out of 3x3 neighboorhood<br />
* Threshold ~ Convert to binary based on pixel intensity alone.<br />
* Thin ~ reduces binary lines to smallest possible width<br />
* Hough Transform ~ convert image into hough space, and back.<br />
<br />
'''Hough Dialog'''<br><br />
[[Image:Houghdialog.png|thumb|100px|Hough dialog box.]]<br />
By default the settings are configured to find even irregularly shaped rectangles as quickly as possible. By adjusting the controls in the Hough dialog it is possible to adjust these parameters for many different situations. <br />
<br />
It is also possible to select that all found lines, or all found corners be displayed after conversion which is useful when adjusting settings.<br />
<br />
[[Category:Computer Vision]]<br />
[[Category:Geometry]]<br />
[[Category:Measurement]]</div>Erishttp://blea.ch/wiki/index.php/3DCube3DCube2012-01-21T10:16:48Z<p>Eris: </p>
<hr />
<div><big>Image Processing Software</big><br />
<br />
__TOC__<br />
==What is it?==<br />
{| border="0" width="100%"<br />
! align="center" colspan="2" valign="top"|<br />
|- valign="top"; <br />
|<br />
3D Cube is an optical metrology system for acquiring measurements from image data. The objective of this project is to quickly determine the volumetric data of an object using high resolution camera with as little operator intervention as possible. Currently the system will detect and measure most objects with a single click, however the program may be adjusted to compensate for the environment, improve speed, selectivity, and desired accuracy.<br />
<br />
Currently the only supported input format is .png files. The software may be easily adapted to accept images directly from high resolution cameras or video sources as required.<br />
<br />
Background clutter, writing, etc... will not affect detection so long as there are no other rectangles in the image larger than the one being measured. By default the rectangles can be at any angle between -30 and 30 degrees and still be detected accurately. The box must be generally centered in middle of the image however a great amount of offset is allowed, so long as the each edge of the box is in a different quadrant of the screen measurements will not be affected.<br />
<br />
The images to right are some examples of output. <br />
<br />
3DCude software contains completely original code written specifically for the project. Only the standard Win32 and LibPNG libraries were used. <br />
<br />
|<br />
{| border="0" width="100%"<br />
! align="center" colspan="2" valign="top"|<br />
|- valign="top"; <br />
|<br />
[[Image:Irregularbox.png|thumb|Measurements of irregularly shaped box]]<br />
|-<br />
[[Image:Boxwithmeasurements.png|thumb|Box and its measurements...]]<br />
|}<br />
|<br />
{| border="0" width="100%"<br />
! align="center" colspan="2" valign="top"|<br />
|- valign="top"; <br />
|<br />
[[Image:Qvcbox.png|thumb|Another misshapen box]]<br />
|-<br />
[[Image:Akyusperfectmeasure.png|thumb|Perfect measurement of CD]]<br />
|}<br />
|}<br />
<br />
==How does it work?==<br />
{| border="0" width="100%"<br />
! align="center" colspan="2" valign="top"|<br />
|- valign="top"; <br />
|<br />
In the most basic sense, the system first identifies all straight edges within the image using various filters and the well documented Hough Transform which is able to detect lines even in otherwise cluttered images. Next it finds the largest rectangle formed by these lines and from that the size of the box can be determined in pixels. This combined with height information obtained either via lasers, stereoscopic cameras, or using multiple light sources and shadows can be then used to obtain volumetric information in future versions.<br />
<br />
The process actually involves about two dozen individual procedures. During each step a variety of settings may be adjusted or even performed manually in order to allow less or more perfect rectangles to be found. In this way accuracy can be increased depending on the application. Some of these steps may be observed during program's operation such as binary conversion of the image.<br />
<br />
For purposes of discussion these procedures can be grouped into these major steps: <br />
* Preprocessing<br />
* Transformation<br />
* Post-processing.<br />
* and measuring.<br />
|<br />
[[Image:Brooklyn_B.png|150px|center|thumb|Original image of Brookyln bridge before binary conversion.]]<br />
|<br />
[[Image:Bbridgelines.png|thumb|150px|Lines found in image after binary conversion and applying the rough transform.]]<br />
|}<br />
[[Image:Rubicsbinary.png|thumb|right|120px|Binary image of cube after high-pass filtering.]]<br />
'''Preprocessing'''<br><br />
The process begins by obtaining an edge enhanced binary image—where the pixels are either totally black or totally white—using 3x3 kernel based blur and high-pass filters. This results in an image where the edges of objects are clearly visible.<br />
<br />
At this time it is possible to apply additional filters such as thinning, erodes, medians, etc to further enhance the desired edges or compensate for noise and/or clutter in the images. Some of these filters are provided in 3DCube but are not at present utilized by default, they may however be applied manually in order to experiment with various processing techniques.<br />
<br />
[[Image:Rubicshough.png|thumb|right|Demonstration of Hough's inner workings. Image on right represent votes for potential lines, bright spots represent most likely line parameters and have more votes while darker areas have less votes. This representation is commonly refered to as 'Hough space'.]]<br />
'''Transformation'''<br><br />
Next the image is translated into Hough space as shown in the image on right. This is done by calculating all possible lines intersecting each white pixel in the binary source image. Lines are represented use rho (distance), theta (angle) parameterization which corrosponds to a distance and angle perpendicular from the top left of source image. In this way every possible line may be represented by only 2 parameters (rho/theta). In the Hough space accumulator image X coordinate is the angle (theta), and Y coord is the distance (rho). Each possible line intersecting each white pixel gets a 'vote' in the Hough space accumulator. As a the white pixels in a straight line are processed, lines common to each pixel accumulate more votes. This can be observed in image on right as the brighter spots, called ''local maxima''.<br />
<br />
With the Rubic's cube image its very easy to see the 4 bright spots representing lines at 71 degrees and the 5 bright spots representing lines at 161 degrees (right angle of 71 degrees). There are 5 spots at 161 degrees because of the shadow cast by the flash. <br />
<br />
'''Postprocessing'''<br><br />
Now that the Hough space image contains line vote informations, it too may be processed as an image to further enhance the votes. <br />
<br />
Next 3DCube must decide which are important lines and which are random clutter. It does this using a variety of proprietary procedures which determine the threshold for what is considered an accepted vote, detecting related lines, and finally for determining which rectangle formed by the lines is most likely the target to be measured.<br />
<br />
'''Measuring'''<br><br />
Finally the coordinates designating the corner of the box are located using the matrix below, which finds the intersection of two lines described as rho/theta (r1, θ1 and r2, θ2): <br />
<pre><br />
AX = b, where<br />
<br />
A = [cos θ1 sin θ1] b = |r1| X = |x|<br />
[cos θ2 sin θ2] |r2| |y|<br />
</pre><br />
<br />
From two points on opposite sides (x1,y1 and x2,y2) it is possible to calculate the distance between them using:<br />
<pre><br />
sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));<br />
</pre><br />
<br />
==Can it find other shapes?==<br />
{| border="0" width="100%"<br />
! align="center" colspan="2" valign="top"|<br />
|- valign="top"; <br />
|<br />
It is possible with some reprogramming to allow accepting any numbers of sides, even circles. In some cases, this may slow the process down. <br />
<br />
The images on the right shows how other images may be detected. <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
|<br />
[[Image:S3500057.png|thumb|Original star image.]]<br />
|<br />
[[Image:Starpnk.png|thumb|Lines found from image.]]<br />
|}<br />
<br />
==Download==<br />
[[Image:3dcubestart.png|thumb|3D Cube's startup screen.]] <br />
3DCube is written for Windows but will run fine and was even developed under Wine on linux. currently offered in executable format only. The archive contains the .exe as well as several images for testing and evaluation. Any image in the PNG file format may be used.<br />
<br />
3DCube executable may be downloaded [http://blea.ch/~eris/win32application.rar here] in rar archive format.<br />
<br />
Since the file contains several test image, total size is 57MB. Please allow some time for download to complete.<br />
<br />
==Operation==<br />
Simply unrar the archive, and click on win32application.exe. To open images click the Open Image button, to process an image click the button labeled Automagic.<br />
<br />
==Advanced Operations==<br />
'''The Operations Menu'''<br><br />
[[Image:Dropdown.png|thumb|100px|Operations menu]]<br />
The operations menu also offers many filters, many of which should be familiar to users of image editing programs. Including:<br />
* Subtract ~ Displays the difference between two equally sized images (Images 1 and 2)<br />
* Revert ~ to original image<br />
* Histogram EQ ~ Auto adjust image brightness<br />
* Amplify ~ Adjust brightness and contrast of image<br />
* Blur<br />
* Sharpen<br />
* High-pass ~ This is essentally an edge enhancement tool, typically applied after one or more blur cycles and results in a binary image.<br />
* Erode ~ Finds minimum value in a 3x3 neighborhood. Shrinks objects<br />
* Median ~ Finds the median value of pixels in a 3x3 neighborhood. Good for speckle and noise reduction.<br />
* Dilate ~ Blur maximum value in 3x3 neighborhood. Expands objects.<br />
* Random ~ randomly selects a pixel out of 3x3 neighboorhood<br />
* Threshold ~ Convert to binary based on pixel intensity alone.<br />
* Thin ~ reduces binary lines to smallest possible width<br />
* Hough Transform ~ convert image into hough space, and back.<br />
<br />
'''Hough Dialog'''<br><br />
[[Image:Houghdialog.png|thumb|100px|Hough dialog box.]]<br />
By default the settings are configured to find even irregularly shaped rectangles as quickly as possible. By adjusting the controls in the Hough dialog it is possible to adjust these parameters for many different situations. <br />
<br />
It is also possible to select that all found lines, or all found corners be displayed after conversion which is useful when adjusting settings.<br />
<br />
[[Category:Computer Vision]]<br />
[[Category:Geometry]]<br />
[[Category:Measurement]]</div>Erishttp://blea.ch/wiki/index.php/PinkHelloKittyDesktopPinkHelloKittyDesktop2012-01-21T10:16:07Z<p>Eris: Protected "PinkHelloKittyDesktop" [edit=sysop:move=sysop]</p>
<hr />
<div><big>How to make a pink herro kitteh desktop</big><br />
==What is it?==<br />
[[Image:ScreenshotPnk2.jpg|thumb|Totally ossum pink hello kitty desktop]]<br />
Get asked lots about this desktop theme so thought to post a sort of how-to. I'm using Gnome and Ubuntu, so if your not, might has some problems. <br />
<br />
Don't be shy! If you see something that could improve, problems, suggestions, or out of date information, correct it please so others can avoid these problems. There is also the discussion page if you have any questions. ^_^<br />
<br />
==Bikkuri! bikkuri!==<br />
Desktop is made up of a few elements:<br />
Firstly is the [http://www.gnome-look.org/content/show.php/bikkuri+UI?content=48968 Bikkuri bikkuri theme]. This is probably the most important part. Download the theme from the the gnome-look site and install per the instructions. ^^<br />
<br />
Since the instructions are sorta hard to find... After downloading the tar.bz2 file:<br />
* open with archive manager<br />
* click extract and select your home directory<br />
<br />
Then, if you want it installed only for this user type into terminal:<br />
<source lang="bash"><br />
mv ~/bikkuri\ UI ~/.themes/<br />
</source><br />
<br />
Or if you want it available for all users:<br />
<source lang="bash"><br />
sudo mv Desktop/bikkuri\ UI /usr/share/themes/<br />
</source><br />
<br />
Then goto the System->Preferences->Appearance and it should show up under the Themes tab.. :D<br />
<br />
==Pastel'd Out Gartoon Icons==<br />
[[Image:Iconsample.png|thumb|Sample of Gartoon-Pastel icons]]<br />
Secondly is the [http://blea.ch/wiki/images/1/1d/Gartoon-pastels.tar.bz2 pastel Gartoon icon set]. Modified the original gartoon set to be more pink and cute! :D<br />
<br />
You should untar this and place in your ~/.icons directory (or /usr/share/icons/ for system-wide cuteness)<br />
<source lang="bash"><br />
wget http://blea.ch/wiki/images/1/1d/Gartoon-pastels.tar.bz2<br />
tar -jxf Gartoon-pastels.tar.bz2<br />
mv gartoon-pastels .icons/<br />
</source><br />
<br />
Then again goto menu System->Preferences->Appearance select Customize then the icons tab, selecting ofc Gartoon-pastels.<br />
<br />
==HK Background==<br />
[[Image:Fairy1kitty1600x1200.jpg|thumb|The background image]]<br />
Another important element. Actually am not really much of a hellos kitty fan, was originally going for a darker moons and stars theme at first but once i found bikkuri and this wallpaper knew what must be done. :p <br />
<br />
Click on the thumbnail, or just right click [http://blea.ch/wiki/images/0/00/Fairy1kitty1600x1200.jpg here] and 'save as' to wherever you normally put your images.<br />
<br />
Then right click on some blank bit of desktop, select Change Desktop Background, add new background, etc etc. Select 'Scaled' to make the image fit. Meh desktop used to be 1600x1200 till the poor monitor blew up, now have 1680x1050 but still used Scaled so that it appears proper proportions.<br />
<br />
==Mareen's Print and Donald Fonts==<br />
[[Image:Fontselect.png|thumb|Gnome font selection box]]<br />
This really makes it purdy and pleasing to look at. You can download it [http://blea.ch/wiki/images/c/c0/Mareensprint.tar.bz2 here] or execute these shell commands:<br />
<source lang="bash"><br />
mkdir ~/.fonts #if this does not already exist no harm in trying...<br />
wget http://blea.ch/wiki/images/c/c0/Mareensprint.tar.bz2<br />
tar -jxf Mareensprint.tar.bz2<br />
mv mareensprint.TTF ~/.fonts<br />
wget http://blea.ch/wiki/images/8/8a/Donald.tar.bz2<br />
tar -jxf Donald.tar.bz2<br />
mv DONARG__.TTF ~/.fonts<br />
sudo fc-cache -f -v #rebuild font cache<br />
</source><br />
<br />
Then from system menu, go to System->Preferences->Font (Seems on current Ubuntu this has moved to a tab under System->Preferences->Appearance). Set Application, Document, Window Title font to Mareen's Print. Set Desktop to Donald. (Just now uploaded donald font, hope its the right one, if not lemme know plz.) ~_~<br />
<br />
Should mention that some fonts and icons will not change untill after reboot..<br />
<br />
==Gdesklet's StarterBar==<br />
[[Image:Gdesks.png|thumb|top|The Gdesklets StarterBar ver 0.31.3]]<br />
Okais for the docking bar at the bottom i used gdesklet's StarterBar ver 0.31.3, its description is "An eye-candy starter bar for GNOME" and really it is! The icons get bigger as you hover over them and will bounce bounce after you click them. Okais, this section is not going to be in much detail, as installed this over a year ago and kind of forgot how, but... <br />
<br />
type this at the terminal window:<br />
<source lang="bash"><br />
sudo apt-get install gdesklets gdesklets-data<br />
gdesklets start<br />
</source><br />
* Right clicky the puzzle pieces icon that hopefully just appeared in the top right of your top bar, like where the volume control is (this may have changed in newer ubuntus they LOVE to change stuff). <br />
* Select 'Manage Desklets'<br />
* search by catagory it should be under 'Toolbar/Launchers'<br />
* select the starter bar and voila! it should create an empty bar, move this to the bottom of screen. :D<br />
<br />
You add new launchers to it using the right mouse button, and clickying 'new starter'. To move the bar around either use the third mouse button (works here) or hold alt and use the left mouse button. I prefer it on the bottom but you can put it on the sides or top if you wish.<br />
<br />
You will want to add gdeskets to your startup, so from the system menu click system->preferences->session, select the startup programs tab, click "add" button, and type:<br />
gdesklets start<br />
<br />
in the box, that should make it restart each time.<br />
<br />
Also right click on the desktop and set the font to Maureen's Print for consistency.<br />
<br />
==Gnome Panel Goodness==<br />
Hmmmz, should mention the gnome panel now. By default ubuntu/gnome comes with a panel at the top and one at the bottom, the one at the top is mostly empty, the one at the bottom has the screen switcher, trashcan icon, and windows list. <br />
<br />
I prefer the windows list to be at the top, just right click on the empty space of the top bar, and you should get an option to add stuff. Add the windows list, the trashcan, desktop button, at least... screen switcher is optional unless you really use it, since i use beryl dont need it. <br />
<br />
While your there may want to add and configure the Weather icon, its just nice to know the local temp. XD<br />
<br />
==YummiYogurt XMMS Theme==<br />
[[Image:Yummiyogurtxmms.png|thumb|The wuvry yummi yogurt theme!!]]<br />
Lastly there is the insanely wonderful xmms theme YummiYogurt. O wow! Just realized they have it [http://www.winamp.com/skins/details/144633 here] for Winamp Too! But the one you want for xmms which runs natively in ubuntu is [http://themes.freshmeat.net/projects/yummiyogurtxmms/ here].<br />
<br />
If you need to install xmms type in terminal, if you have it already skip this bit:<br />
<source lang="bash"><br />
sudo apt-get install xmms<br />
</source><br />
<br />
To install the theme itself type in terminal:<br />
<source lang="bash"><br />
wget http://themes.freshmeat.net/redir/yummiyogurtxmms/31700/url_tgz/yummiyogurtxmms-default-1.tar.gz<br />
tar -zxf yummiyogurtxmms-default-1.tar.gz<br />
mv yummiyogurt ~/.xmms/Skins/<br />
</source><br />
<br />
Then right click in xmms select options->skin browser.. and hopefully the yummiyogurt theme is listen, ofc select that and done! :D</div>Erishttp://blea.ch/wiki/index.php/PinkHelloKittyDesktopPinkHelloKittyDesktop2012-01-21T10:16:01Z<p>Eris: </p>
<hr />
<div><big>How to make a pink herro kitteh desktop</big><br />
==What is it?==<br />
[[Image:ScreenshotPnk2.jpg|thumb|Totally ossum pink hello kitty desktop]]<br />
Get asked lots about this desktop theme so thought to post a sort of how-to. I'm using Gnome and Ubuntu, so if your not, might has some problems. <br />
<br />
Don't be shy! If you see something that could improve, problems, suggestions, or out of date information, correct it please so others can avoid these problems. There is also the discussion page if you have any questions. ^_^<br />
<br />
==Bikkuri! bikkuri!==<br />
Desktop is made up of a few elements:<br />
Firstly is the [http://www.gnome-look.org/content/show.php/bikkuri+UI?content=48968 Bikkuri bikkuri theme]. This is probably the most important part. Download the theme from the the gnome-look site and install per the instructions. ^^<br />
<br />
Since the instructions are sorta hard to find... After downloading the tar.bz2 file:<br />
* open with archive manager<br />
* click extract and select your home directory<br />
<br />
Then, if you want it installed only for this user type into terminal:<br />
<source lang="bash"><br />
mv ~/bikkuri\ UI ~/.themes/<br />
</source><br />
<br />
Or if you want it available for all users:<br />
<source lang="bash"><br />
sudo mv Desktop/bikkuri\ UI /usr/share/themes/<br />
</source><br />
<br />
Then goto the System->Preferences->Appearance and it should show up under the Themes tab.. :D<br />
<br />
==Pastel'd Out Gartoon Icons==<br />
[[Image:Iconsample.png|thumb|Sample of Gartoon-Pastel icons]]<br />
Secondly is the [http://blea.ch/wiki/images/1/1d/Gartoon-pastels.tar.bz2 pastel Gartoon icon set]. Modified the original gartoon set to be more pink and cute! :D<br />
<br />
You should untar this and place in your ~/.icons directory (or /usr/share/icons/ for system-wide cuteness)<br />
<source lang="bash"><br />
wget http://blea.ch/wiki/images/1/1d/Gartoon-pastels.tar.bz2<br />
tar -jxf Gartoon-pastels.tar.bz2<br />
mv gartoon-pastels .icons/<br />
</source><br />
<br />
Then again goto menu System->Preferences->Appearance select Customize then the icons tab, selecting ofc Gartoon-pastels.<br />
<br />
==HK Background==<br />
[[Image:Fairy1kitty1600x1200.jpg|thumb|The background image]]<br />
Another important element. Actually am not really much of a hellos kitty fan, was originally going for a darker moons and stars theme at first but once i found bikkuri and this wallpaper knew what must be done. :p <br />
<br />
Click on the thumbnail, or just right click [http://blea.ch/wiki/images/0/00/Fairy1kitty1600x1200.jpg here] and 'save as' to wherever you normally put your images.<br />
<br />
Then right click on some blank bit of desktop, select Change Desktop Background, add new background, etc etc. Select 'Scaled' to make the image fit. Meh desktop used to be 1600x1200 till the poor monitor blew up, now have 1680x1050 but still used Scaled so that it appears proper proportions.<br />
<br />
==Mareen's Print and Donald Fonts==<br />
[[Image:Fontselect.png|thumb|Gnome font selection box]]<br />
This really makes it purdy and pleasing to look at. You can download it [http://blea.ch/wiki/images/c/c0/Mareensprint.tar.bz2 here] or execute these shell commands:<br />
<source lang="bash"><br />
mkdir ~/.fonts #if this does not already exist no harm in trying...<br />
wget http://blea.ch/wiki/images/c/c0/Mareensprint.tar.bz2<br />
tar -jxf Mareensprint.tar.bz2<br />
mv mareensprint.TTF ~/.fonts<br />
wget http://blea.ch/wiki/images/8/8a/Donald.tar.bz2<br />
tar -jxf Donald.tar.bz2<br />
mv DONARG__.TTF ~/.fonts<br />
sudo fc-cache -f -v #rebuild font cache<br />
</source><br />
<br />
Then from system menu, go to System->Preferences->Font (Seems on current Ubuntu this has moved to a tab under System->Preferences->Appearance). Set Application, Document, Window Title font to Mareen's Print. Set Desktop to Donald. (Just now uploaded donald font, hope its the right one, if not lemme know plz.) ~_~<br />
<br />
Should mention that some fonts and icons will not change untill after reboot..<br />
<br />
==Gdesklet's StarterBar==<br />
[[Image:Gdesks.png|thumb|top|The Gdesklets StarterBar ver 0.31.3]]<br />
Okais for the docking bar at the bottom i used gdesklet's StarterBar ver 0.31.3, its description is "An eye-candy starter bar for GNOME" and really it is! The icons get bigger as you hover over them and will bounce bounce after you click them. Okais, this section is not going to be in much detail, as installed this over a year ago and kind of forgot how, but... <br />
<br />
type this at the terminal window:<br />
<source lang="bash"><br />
sudo apt-get install gdesklets gdesklets-data<br />
gdesklets start<br />
</source><br />
* Right clicky the puzzle pieces icon that hopefully just appeared in the top right of your top bar, like where the volume control is (this may have changed in newer ubuntus they LOVE to change stuff). <br />
* Select 'Manage Desklets'<br />
* search by catagory it should be under 'Toolbar/Launchers'<br />
* select the starter bar and voila! it should create an empty bar, move this to the bottom of screen. :D<br />
<br />
You add new launchers to it using the right mouse button, and clickying 'new starter'. To move the bar around either use the third mouse button (works here) or hold alt and use the left mouse button. I prefer it on the bottom but you can put it on the sides or top if you wish.<br />
<br />
You will want to add gdeskets to your startup, so from the system menu click system->preferences->session, select the startup programs tab, click "add" button, and type:<br />
gdesklets start<br />
<br />
in the box, that should make it restart each time.<br />
<br />
Also right click on the desktop and set the font to Maureen's Print for consistency.<br />
<br />
==Gnome Panel Goodness==<br />
Hmmmz, should mention the gnome panel now. By default ubuntu/gnome comes with a panel at the top and one at the bottom, the one at the top is mostly empty, the one at the bottom has the screen switcher, trashcan icon, and windows list. <br />
<br />
I prefer the windows list to be at the top, just right click on the empty space of the top bar, and you should get an option to add stuff. Add the windows list, the trashcan, desktop button, at least... screen switcher is optional unless you really use it, since i use beryl dont need it. <br />
<br />
While your there may want to add and configure the Weather icon, its just nice to know the local temp. XD<br />
<br />
==YummiYogurt XMMS Theme==<br />
[[Image:Yummiyogurtxmms.png|thumb|The wuvry yummi yogurt theme!!]]<br />
Lastly there is the insanely wonderful xmms theme YummiYogurt. O wow! Just realized they have it [http://www.winamp.com/skins/details/144633 here] for Winamp Too! But the one you want for xmms which runs natively in ubuntu is [http://themes.freshmeat.net/projects/yummiyogurtxmms/ here].<br />
<br />
If you need to install xmms type in terminal, if you have it already skip this bit:<br />
<source lang="bash"><br />
sudo apt-get install xmms<br />
</source><br />
<br />
To install the theme itself type in terminal:<br />
<source lang="bash"><br />
wget http://themes.freshmeat.net/redir/yummiyogurtxmms/31700/url_tgz/yummiyogurtxmms-default-1.tar.gz<br />
tar -zxf yummiyogurtxmms-default-1.tar.gz<br />
mv yummiyogurt ~/.xmms/Skins/<br />
</source><br />
<br />
Then right click in xmms select options->skin browser.. and hopefully the yummiyogurt theme is listen, ofc select that and done! :D</div>Erishttp://blea.ch/wiki/index.php/PPM_MeterPPM Meter2012-01-21T10:14:44Z<p>Eris: Protected "PPM Meter" [edit=sysop:move=sysop]</p>
<hr />
<div><big>EC/TDS/PPM Meter On Limited Budget</big><br />
__TOC__<br />
You may also be interested in the [[pH_Meter]] meter page.<br />
<br />
==Design Goal==<br />
Make a EC/TDS/PPM meter thats nice and quite accurate while costing me little or at least next to nothing that i can connect to a microprocessor or voltmeter.<br />
<br />
This is a wiki'd version of the [http://www.octiva.net/projects/ppm/ original document] so it can be updated and corrected more easily. :D Please check out the original (and clicky the adverts at bottom for me!!) if your curious.<br />
<br />
==Measuring PPM/EC/TDS==<br />
TDS is the measuring of the amount of salts in a solution. For alot of applications the amount of salt is indicitive of the levels of other stuff in a solution. TDS/PPM meters sold for gardening and aquariums figure the amount of salt in Parts Per Million by measuring the Electrical Conductivity of the solution under test. So a PPM/TDS meter is a EC meter that converts the EC value into PPM values. There are alot of descriptions online about why and how to measure PPM/TDS or EC so [http://www.google.com/search?q=TDS+EC+PPM+Microsiemens+Measuring google] for them if you want alot more details.<br />
<br />
EC is a measure of Electrical Conductivity from two probes 1cm apart. 1 EC is = 1 microsiemens, to convert from EC to siemens multiply by 1E-6. EC can be converted to PPM by multiplying by 500. PPM can be converted to EC by dividing by 500. To convert from siemens to Ohms is s=1/ohms, you can also go the other way and do ohm=1/s for siemens to ohms. Siemens is also known as Mhos, which comes from ohm written backward.<br />
<br />
The number 500 used to convert between PPM and EC is called the Conversion Factor. Different salts will have different conversion factors because some conduct better or worse than others. NaCl's is 500, this seems to be the most common standard used, and is what was used for the calibration solutions.<br />
<br />
If EC/PPM is just measuring the Conductance (or resistance) then why not use a volt/ohm meter directly?? Because they pass DC current thru the probes and you cannot measure conductivity of salts with DC current because it will rip the molecules apart, and since the molecules are what conducts the electricity you get a constantly changing reading that is useless. Overcome this by using an AC signal. If the frequency is high enough (>1khz it seems) the molecules dont have time to move apart before they are pulled in the opposite direction. Sort of like how high AC current will throw a person off of it, where as DC forces them to hold on and get shocked to death or something.<br />
<br />
{| <br />
|- align="center"<br />
| [[Image:MW-DCscreenshot.jpg]] || [[Image:MW-ACscreenshot.jpg]]<br />
|- align="center"<br />
| DC Molecular Workbench model || AC Molecular Workbench model<br />
|}<br />
<br />
[[Image:MW-SaltWaterKey.jpg|left]]<br />
The screenshots above are from [http://mw.concord.org/modeler/ Molecular Workbench (its free!!)] and show what happens to NaCl and H2O molecules when exposed to AC and DC fields. If you [http://www.octiva.net/projects/ppm/MW-SaltWaterACDC.rar download the models] you can press play and watch the atoms move around. Normally the molecules look about the same as in the AC simulation staying in about the same spot. When AC is applied they just shake back and forth. With the DC simulation you can see the sodium and chloride atoms are attracted to the simulated charged plates at top + and bottom - of the model container.<br />
<br />
==Temperature==<br />
{| align="right" border="1" width=25%<br />
|+ Measured Conductivity at different Temperatures<br />
|-<br />
! EC || Temp C<br />
|- align="center"<br />
| 3.43 || 13.72<br />
|- align="center"<br />
| 4.16 || 22<br />
|- align="center"<br />
| 4.73 || 30<br />
|}<br />
<br />
Something very important, temperature will effect the conductivity! The chart on the right shows the same solution measured at 3 different temperatures. If your connecting this to a microprocessor you can use a thermistor to compensate. If not then make sure the calibration solution is about the same temperature as the solution to be tested. One way this can be done taking a sample from the fish tank or whatever and letting it set until its room temperature. If your temperature will vary by only a few degrees then it may not even be a problem.<br />
<br />
If your looking for more information you can probably find it on the [http://www.coleparmer.com/techinfo/techinfo.asp?htmlfile=Conductivity.htm Cole Parmer site on EC meters].<br />
<br />
How to properly compensate for temperature can be found on the [[Temperature_probe]] page. I've not tried it yet but looks very promising!<br />
<br />
==How to Make Calibration Solutions==<br />
[[Image:MakingSaltWater2-small.JPG|right]]<br />
Needing something to calibrate the meter, a friend suggested i measure out salt by weight, and put that into a measured volume of water. Most calibration solutions have a mixuture of 2 or more types of salts such as sodium chloride (NaCl) and potassium chloride (KCl). However all i have around the house is NaCl table salt so...<br />
<br />
Looking around the net, i found that 1mg of solute per 1L of water would equal 1ppm. So to get a 2Kppm solution would need to put 2g of salt into 1L of purified water.. or just put 1g of salt into .5L of purified water. The water MUST be purified, pure water has allmost no conductivity, compared to tap water which has all sorts of contamination (tapwater here reads about 80ppm). So get some distilled water for this.<br />
<br />
Once you have the 2K solution from 1g into .5L, you can put some of that in a jar, the pour out the rest till you have only 250ml, pour in purified water till you get 500ml again, then you have 1000ppm! Keep doing this if you want to create a range of solutions, just be carefull to measure perfect and STIR IT UP WELL.<br />
<br />
Thats about all the stuff you need to know to start building a ppm/ec meter. Now for....<br />
<br />
==The Circuit==<br />
There were alot of design considerations such as needing to pass a minimum amount of current and voltage thru the solution while keeping a good s/n ratio. But most most important it had to use stuff i had laying around the house and be pretty accurate.<br />
<br />
The circuit outputs a DC voltage equal to the EC value of the solution being tested. So like 4v on the meter means an EC of 4, 2v means EC of 2, .5V = .5 EC blah blah. To convert EC value to PPM just multiply by 500, so like 4 EC = 2000PPM, .5 EC = 250PPM. Also the output can be connected to an A/D converter without alot much grrrrr.<br />
<br />
<br />
Schematic diagram of functional EC meter<br />
<br />
[[Image:Schematic-Only.jpg]]<br />
<br />
[[:Image:Schematic.jpg|Click here for the full more readable schematic and notes]]<br />
<br />
[http://as220.org/~noah/ppm.sch gEDA schematic]<br />
[http://as220.org/~noah/ppm-eagle.sch Eagle schematic]<br />
[http://as220.org/~noah/ppm-eagle.brd Eagle board]<br />
<br />
There are three main parts to the circuit. The sine wave oscillator, the gain loop, and the AC to DC converter.<br />
<br />
The Oscillator: As i hopefully already explained you must use an AC signal to measure conductance of salts in a solution so you realize the need for the oscillator to generate a nice clean sine wave (See Photo). The oscillator circuit used here is a very common [http://en.wikipedia.org/wiki/Wien_bridge Wien bridge] design.<br />
<br />
[[Image:PrettySineWave.jpg|right|Nice Pretty Sine Wave]]<br />
Part substitution: You can change around the part values in the oscillator a good bit just remember to make sure the output frequency is above 1Khz, lower freqs seem to give more unstable readings. Adjusting V1 will change the output level a bit but its not recommended, best to change the value of D1 and D2 to a zener with lower Zv. I just used 5.1V zeners because its what i had and they worked well running from regulated +/- 12v supply. If you are planning to use with 9V batteries use lower values for sure.<br />
<br />
The Gain Loop: This is where all fun stuff occurs. To measure conductance i looked at it as an unknown resistance. The probe makes up one leg of the voltage divider across the op-amp's gain loop. So long as there is no conductance between the probes, the op-amp's output will equal whatever is on the + input pin 5. As conductance increases the amount of negative feedback (which is what determines op-amp gain) decreases because some of the signal is being sinked to ground via the probe. Less feedback means more gain and more amplification.<br />
<br />
The advantage of using the feedback loop is it doesn't take nearly as much current to pass thru the solution and you get a large variation in output. If the probe was just part of a simple voltage divider without being in a gain loop would need to pass about 100 times more current thru the solution, or else pass a smaller signal and then you have noise issues. The disadvantage is that there is ALWAYS at least a gain of +1 in a non-inverting amp that must be nulled out later. Also sucky is that uneven changes between the + and - supply voltages will cause a small amount of offset drift. This offset issue bothers me :(, feel could have done it better but whatever this works and took a few days already blah.<br />
<br />
Part substitution: Changing the value of R7 is yet another, and probably the best, way to compensate for different probes. If readings are too high lower the resistance, if they are too low raise R7's value a bit.<br />
<br />
AC to DC converter: Lastly there is the AC to DC converter. You can just measure the output of the gain-loop stage then do alot of math to figure out EC/PPM, but it would be ALOT nicer if the output was zeroed, scaled, and stuff. The first op-amp is configured to convert the AC signal level into a DC voltage with adjustable gain for scale. You cannot just use a diode or even a bridge rectifier alone because of the constant voltage drop of .7v or so creates alot of problems. The solution is to put a bridge into a feedback loop, as the input voltage changes so does the current across the resistor (R8) connected to the DC side of the bridge. With current change comes a proportional DC voltage change that can be measured across the resistor.<br />
<br />
[[Image:DifferentialOutput.jpg|right|Differential Output]]<br />
Problem with voltage across the bridge is that its differential, there is still a sine wave present when measured with ground as a reference. The Differential Output picture shows a scope connected to the +/- terminals of the bridge. A DC meter across the bridge will measure the difference between the two wave forms. In the picture you can see there is a consistent difference between the top and bottom wave form of about 2 of the little grid squares. Scope is set up where each grid square equals 1 volt, so a meter on the bridge would see a constant difference of and display 2V.<br />
<br />
This would almost work by itself except you need an offset and most A/D converters do not have differential inputs and require a input referenced to ground. So the final part of the circuit is a simple differential amp, also here is where the offset it adjusted. The output is now ready to go to a volt meter or to an A/D input! A note about the offset, blah it really needs to be compensated for earlier because as the gain adjustment of previous stage changes so does the offset just a little bit.<br />
<br />
==Adjustment==<br />
There are 3 pots in the circuit needing attention. To adjust the first V1 hook a meter or better yet a scope up between ground and pin 1 on op-amp. Adjust V1 till there is no output, then slowly turn the opposite direction untill oscillation occurs and the meter reads something while in AC mode or the scope has a nice pretty sine wave. If you adjust it too far the wave will be ugly looking, so do it slowly!<br />
<br />
Next put V2 in the middle and adjust V3 so the output @ ECv (pin 14) is 0vdc. Wipe off the probe with a paper towel then put it into a 2Kppm calibration solution. Adjust V2 so that meter reads 4vdc. Again dry and wipe probe and repeat the adjustment of V3 back to 0vdc. You will need to go back and forth (about 3 or 4 times here) between adjusting these two pots before it scales properly. Should read 4vdc (meaning 4 EC) with 2Kppm solution and 0vdc with the probe dried off. If your unable to get it to scale properly you probably need to change the value of R7 as described in the schematic because your probe is too different from mine. Mine reads within about .05 EC of what i am expecting with clean probes.<br />
<br />
==The Probe==<br />
[[Image:Probes-small.jpg]]<br />
<br />
This was a bit tricky. At first i tried copper wire, push pins and various other things. With these experiments i determined that you need to expose a small and consistant amount of the probes to the solution at a consistant distance. I accomplished this by using alot of hot glue and/or insulation on the wire so that only the tips of the wires would touch the water. Then I realized that the stupid readings drift like crazy untill you clean the probe again, and even cleaning the probe sometimes didnt help because probably some chemical reaction with the stuff in the solutions. I kept trying to think of something that would be a great conductor without corroding in the solution, and came up with GOLD! I used a few types of gold plated audio connectors before i found some bananna jacks that seemed to work best. I covered them so again only the tips are exposed to the solution at about 1cm apart and was able to get consistant readings over and over especially if i cleaned the tip before and after each test.<br />
<br />
So, use gold plated probes, make sure a small and consistant amount of probe touches the solution, and clean the probes after and before each use. Using these guidelines should get you a nice reliable probe, I had wanted to find a nice premade and ez to find connector that i could suggest, but nothing laying around here is very common. Gold plated RCA plugs seem to be the worst probably because these cheep things are only plated enough to look gold colored. Was looking for a nice gold plated 1/8" phone jack or something but nothing was laying about here blah. If the meter cannot seem to be adjusted right (is allways too high a reading) try increasing the spacing of the probe or changing values of R7. If reading too low try moving probes closer or exposing more probe material.<br />
<br />
Here are a few probes I tried (picture at top of section). The part you measure with on all probes are facing bottom of picture. From Left to Right: 12AWG house wire with ground removed, sewing pins surrounded by hot glue except the tips (this was WORST of all), gold plated RCA jack with center filled in by glue (was not very stable, i think very thin gold plating), and finally the best of the whole lot is the two gold plated bananna jacks covered with heat shrink and hot glue exposing only the tips.<br />
<br />
I've been asked about and have considered myself just leaving the probe submerged and possibly reading it constantly. This seems a bad idea, allthough probably with experimentation you could make it work. The main problem would be from the probe corroding which would occure faster with the circuit in operation. Maybe you could get a nice gold probe and have a circuit to either power up or connect the probe only when needed? Dunno really. For observations on this topic see updates below.<br />
<br />
[[Image:Newppmprobe2.jpg|thumb|Newer probe design featuring enclosed electrodes]]<br />
Since writing the above paragraph have used the same probe for nearly 2 years, it worked fine with occasional cleaning. ^^<br />
<br />
Reader suggestions have included using nickle, and graphite. Both of which seem good suggestions. See the discussion pages for more information. <br />
<br />
===New and Improved Probe Design===<br />
2008.09.02<br />
[[Image:Newppmprobe.jpg|thumb|Another view of newer probe design]]<br />
Recently decided to create a new probe because in an attempt to fix0r some problems with the old one. The contacts (formally gold plated) were still in excellent condition, but the main problem was the reading would often change depending on how close the probe was to the edges of a particular container. To new probe design solves these problems by surrounding the probe's electrodes within a plastic container.<br />
<br />
The probe was made using the end of a syringe however the ends of a fat marker or other similar items may work as well. Two wires emerge from from the top and were soldered onto two 1cm square pieces of copper (with sticky stuff on the reverse). The top of the probe where wires entered is sealed with hot glue (prolly silicone would work better). Two small holes were drilled near the top, without them air pockets are created that may screw up readings. u_u<br />
<br />
Note the syringe itself is marked in cubic centimeters, and remember that commercial probes measure the conductivity between two 1cm square probes in a 1cubic centimeter chamber. ^^ This probe is (probably) very much likely close to a commercial probe in its readings. Cannot test this exactly because don't have a real factory made probe to compare with.<br />
<br />
Tests using the probe seemed very successful. \^_^/ For one thing no matter where in the test samples the probe was placed the readings were all the same! This is a great improvement over the previous design. The circuit itself needs a bit of adjustment because of course with a different probe. As mentioned in the circuit section the feedback resistor on the gain stage needs changing due to the newer probe having larger surface area. Have not yet actually done this >_> but will when i make next batch of changes to the probe. Which should also include the lovely temperature compensation circuit proposed on the talk page. (thank you!)<br />
<br />
==Construction==<br />
Since most of the parts for this were scavenged from old junk there is not much point in discussing construction techniques in depth (That and I'm getting tired of writing sooo much). Construction is not critical so long as all the wires go the the right spot it should work.<br />
<br />
These pictures show the prototype and the 'finished' module squeezed onto a small piece of perferated board. Eventually this one will go into a box with PSU, microcontroller, and a bunch of other I/O. So put on a .156" connector for the power/ouput and a RCA jack for the probe so it could be removed easily.<br />
<br />
{| align="center"<br />
| [[Image:protocircuit.jpg]] || [[Image:circuitcloserup.jpg]]<br />
|- align="center"<br />
| Prototyped version || More permanent version<br />
|}<br />
<br />
==Operation==<br />
<br />
After Calibrating with the 2Kppm (4 EC) solution, tested with the 1K (2 EC) solution. Also tried it with a few other values down to 250ppm, seemed to worked well. Btw, you may notice my meter is falling apart, if you feel this information is of use and have a spare meter or something please send thanks.<br />
<br />
{| align="center"<br />
| [[Image:Reading2K.jpg|thumb|340px|Reading 2000PPM]] || [[Image:Reading1K.jpg|thumb|360px|Reading 1000PPM]]<br />
|}<br />
<br />
There are other ways to do this. For instance if the probe were to be connected across or in place of R1 or R2 the frequency of the oscilator will vary a bit depending on conductivity of the solution and the values of C1, C2, etc. Connecting the oscilator output to a microcontroller will allow you to determine the conductivity by the frequency without the need for the other 3 op-amp stages.<br />
<br />
This is not done at all, ill post more as its completed.<br />
<br />
==Long Term Observations==<br />
<br />
2006-09-22-Observations: I've been using this thing for about 5 months now, keeping the probe submerged all of the time. This worked great for a few weeks, but slowly it started to get cruddy every 3-4 days and readings were off by up to 100ppm. Wiping off the probe gets it back to within about +/-40ppm but before I take a critical reading (like when refilling the tank it's monitoring) will allways clean and recalibrate. Looking at it, the probe's once smooth and shiney gold surface now seems dull, cruddy, and pited.<br />
<br />
The probe is holding up alot better than i first thought it would being constantly submerged. If used intermittently it would probably stay stable without recalibration longer.<br />
<br />
Found places that sell just the ppm probe itself and i have a feeling using one of these will increase the meter's accuracy and stability greatly. Also an email from someone who has worked at places where EC meters were manufactured suggested that i use nickle instead of gold. But i've not had a chance to check either of these.<br />
<br />
<br />
[[Image:finishedmeter.JPG|right]]<br />
Someone hinted to me that this could be an even more useful circuit if only it would operate off a single polarity power source. I need another one of these so in the process of building it may make a few mods.<br />
<br />
Also, to make things easier and alot more ereet I have installed the circuit in this box and connected it to the adc input of a microcontroller. By doing this i can zero/calibrate it using software simply pushing a few buttons.<br />
It has a rs-232 port, and USB too so can connect it to a computer for loging or possibly automating some process. I'll put up more documentation on this part of things soon.<br />
Note: The display is reading ppm on the left and ph on the right, with the probes in calibration solutions.<br />
<br />
==Microcontroller Code==<br />
Here is a snippet of the meter's code. (Rest of the code is [http://blea.ch/~eris/litter/ppm/ here]) These command functions are called via the shell or assigned to button presses and use fixed point maths:<br />
<br />
<source lang="c"><br />
/* zeroppm command */<br />
int c_zeroPpm(int argc,char **args) {<br />
m_cfg.ppmoset=readADC(ADC_CH0); //Read ADC channel 0, store as offset<br />
meterSave(m_cfg); //Save settings to eeprom<br />
return(m_cfg.ppmoset);<br />
}<br />
<br />
/* scaleppm command, if argument calibrates to ARG1 ppm, otherwise defaults to 1000 */<br />
int c_scalePpm(int argc,char **args) {<br />
if(argc==1) {<br />
printf("usage: calibppm PPM\r\n");<br />
return(ERROR);<br />
}<br />
if(argc==0) { // calcuate scale using CALIBPPM/(ADC-offset)<br />
m_cfg.ppmscale=((long)(((long)100000)/(readADC(ADC_CH0)-m_cfg.ppmoset)));<br />
}<br />
if(argc==2) { //same but with arg1 as calib, note the *100 for fixed point<br />
m_cfg.ppmscale=((long)(((long)numtoint(args[1])*100)/(readADC(ADC_CH0)-m_cfg.ppmoset)));<br />
} <br />
meterSave(m_cfg); //Save settings to eeprom<br />
return(m_cfg.ppmscale);<br />
}<br />
<br />
/* readppm */<br />
int c_readPpm(int argc,char **args) {<br />
long ppm;<br />
ppm=((long)(readADC(ADC_CH0)-m_cfg.ppmoset)*m_cfg.ppmscale)/100;<br />
//display the results<br />
printf("PPM: %04i\r\n",(int)ppm); //print upper 4 digits of ppm value (/100)<br />
return(ppm);<br />
}<br />
</source><br />
<br />
==Other Stuff==<br />
Thanks to all u pplz who've emailed me! Part of motivation for wikifing was all the great suggestions and good questions wish i coulda easily thrown in, not to mention the [[Talk:PPM_Meter]] page! \^_^/!!<br />
<br />
This article was originally written late 2005/early 2006..<br />
<br />
==Disclaimer==<br />
Good Luck!<br />
Be carefull, dont do anything stupid and shock yourself to death.<br />
<br />
Disclaimer: I am not responsible for what you do.<br />
<br />
Experiment, learn, improvise, take what is otherwise junk from your enviroment and making of it something more.</div>Erishttp://blea.ch/wiki/index.php/PPM_MeterPPM Meter2012-01-21T10:14:33Z<p>Eris: </p>
<hr />
<div><big>EC/TDS/PPM Meter On Limited Budget</big><br />
__TOC__<br />
You may also be interested in the [[pH_Meter]] meter page.<br />
<br />
==Design Goal==<br />
Make a EC/TDS/PPM meter thats nice and quite accurate while costing me little or at least next to nothing that i can connect to a microprocessor or voltmeter.<br />
<br />
This is a wiki'd version of the [http://www.octiva.net/projects/ppm/ original document] so it can be updated and corrected more easily. :D Please check out the original (and clicky the adverts at bottom for me!!) if your curious.<br />
<br />
==Measuring PPM/EC/TDS==<br />
TDS is the measuring of the amount of salts in a solution. For alot of applications the amount of salt is indicitive of the levels of other stuff in a solution. TDS/PPM meters sold for gardening and aquariums figure the amount of salt in Parts Per Million by measuring the Electrical Conductivity of the solution under test. So a PPM/TDS meter is a EC meter that converts the EC value into PPM values. There are alot of descriptions online about why and how to measure PPM/TDS or EC so [http://www.google.com/search?q=TDS+EC+PPM+Microsiemens+Measuring google] for them if you want alot more details.<br />
<br />
EC is a measure of Electrical Conductivity from two probes 1cm apart. 1 EC is = 1 microsiemens, to convert from EC to siemens multiply by 1E-6. EC can be converted to PPM by multiplying by 500. PPM can be converted to EC by dividing by 500. To convert from siemens to Ohms is s=1/ohms, you can also go the other way and do ohm=1/s for siemens to ohms. Siemens is also known as Mhos, which comes from ohm written backward.<br />
<br />
The number 500 used to convert between PPM and EC is called the Conversion Factor. Different salts will have different conversion factors because some conduct better or worse than others. NaCl's is 500, this seems to be the most common standard used, and is what was used for the calibration solutions.<br />
<br />
If EC/PPM is just measuring the Conductance (or resistance) then why not use a volt/ohm meter directly?? Because they pass DC current thru the probes and you cannot measure conductivity of salts with DC current because it will rip the molecules apart, and since the molecules are what conducts the electricity you get a constantly changing reading that is useless. Overcome this by using an AC signal. If the frequency is high enough (>1khz it seems) the molecules dont have time to move apart before they are pulled in the opposite direction. Sort of like how high AC current will throw a person off of it, where as DC forces them to hold on and get shocked to death or something.<br />
<br />
{| <br />
|- align="center"<br />
| [[Image:MW-DCscreenshot.jpg]] || [[Image:MW-ACscreenshot.jpg]]<br />
|- align="center"<br />
| DC Molecular Workbench model || AC Molecular Workbench model<br />
|}<br />
<br />
[[Image:MW-SaltWaterKey.jpg|left]]<br />
The screenshots above are from [http://mw.concord.org/modeler/ Molecular Workbench (its free!!)] and show what happens to NaCl and H2O molecules when exposed to AC and DC fields. If you [http://www.octiva.net/projects/ppm/MW-SaltWaterACDC.rar download the models] you can press play and watch the atoms move around. Normally the molecules look about the same as in the AC simulation staying in about the same spot. When AC is applied they just shake back and forth. With the DC simulation you can see the sodium and chloride atoms are attracted to the simulated charged plates at top + and bottom - of the model container.<br />
<br />
==Temperature==<br />
{| align="right" border="1" width=25%<br />
|+ Measured Conductivity at different Temperatures<br />
|-<br />
! EC || Temp C<br />
|- align="center"<br />
| 3.43 || 13.72<br />
|- align="center"<br />
| 4.16 || 22<br />
|- align="center"<br />
| 4.73 || 30<br />
|}<br />
<br />
Something very important, temperature will effect the conductivity! The chart on the right shows the same solution measured at 3 different temperatures. If your connecting this to a microprocessor you can use a thermistor to compensate. If not then make sure the calibration solution is about the same temperature as the solution to be tested. One way this can be done taking a sample from the fish tank or whatever and letting it set until its room temperature. If your temperature will vary by only a few degrees then it may not even be a problem.<br />
<br />
If your looking for more information you can probably find it on the [http://www.coleparmer.com/techinfo/techinfo.asp?htmlfile=Conductivity.htm Cole Parmer site on EC meters].<br />
<br />
How to properly compensate for temperature can be found on the [[Temperature_probe]] page. I've not tried it yet but looks very promising!<br />
<br />
==How to Make Calibration Solutions==<br />
[[Image:MakingSaltWater2-small.JPG|right]]<br />
Needing something to calibrate the meter, a friend suggested i measure out salt by weight, and put that into a measured volume of water. Most calibration solutions have a mixuture of 2 or more types of salts such as sodium chloride (NaCl) and potassium chloride (KCl). However all i have around the house is NaCl table salt so...<br />
<br />
Looking around the net, i found that 1mg of solute per 1L of water would equal 1ppm. So to get a 2Kppm solution would need to put 2g of salt into 1L of purified water.. or just put 1g of salt into .5L of purified water. The water MUST be purified, pure water has allmost no conductivity, compared to tap water which has all sorts of contamination (tapwater here reads about 80ppm). So get some distilled water for this.<br />
<br />
Once you have the 2K solution from 1g into .5L, you can put some of that in a jar, the pour out the rest till you have only 250ml, pour in purified water till you get 500ml again, then you have 1000ppm! Keep doing this if you want to create a range of solutions, just be carefull to measure perfect and STIR IT UP WELL.<br />
<br />
Thats about all the stuff you need to know to start building a ppm/ec meter. Now for....<br />
<br />
==The Circuit==<br />
There were alot of design considerations such as needing to pass a minimum amount of current and voltage thru the solution while keeping a good s/n ratio. But most most important it had to use stuff i had laying around the house and be pretty accurate.<br />
<br />
The circuit outputs a DC voltage equal to the EC value of the solution being tested. So like 4v on the meter means an EC of 4, 2v means EC of 2, .5V = .5 EC blah blah. To convert EC value to PPM just multiply by 500, so like 4 EC = 2000PPM, .5 EC = 250PPM. Also the output can be connected to an A/D converter without alot much grrrrr.<br />
<br />
<br />
Schematic diagram of functional EC meter<br />
<br />
[[Image:Schematic-Only.jpg]]<br />
<br />
[[:Image:Schematic.jpg|Click here for the full more readable schematic and notes]]<br />
<br />
[http://as220.org/~noah/ppm.sch gEDA schematic]<br />
[http://as220.org/~noah/ppm-eagle.sch Eagle schematic]<br />
[http://as220.org/~noah/ppm-eagle.brd Eagle board]<br />
<br />
There are three main parts to the circuit. The sine wave oscillator, the gain loop, and the AC to DC converter.<br />
<br />
The Oscillator: As i hopefully already explained you must use an AC signal to measure conductance of salts in a solution so you realize the need for the oscillator to generate a nice clean sine wave (See Photo). The oscillator circuit used here is a very common [http://en.wikipedia.org/wiki/Wien_bridge Wien bridge] design.<br />
<br />
[[Image:PrettySineWave.jpg|right|Nice Pretty Sine Wave]]<br />
Part substitution: You can change around the part values in the oscillator a good bit just remember to make sure the output frequency is above 1Khz, lower freqs seem to give more unstable readings. Adjusting V1 will change the output level a bit but its not recommended, best to change the value of D1 and D2 to a zener with lower Zv. I just used 5.1V zeners because its what i had and they worked well running from regulated +/- 12v supply. If you are planning to use with 9V batteries use lower values for sure.<br />
<br />
The Gain Loop: This is where all fun stuff occurs. To measure conductance i looked at it as an unknown resistance. The probe makes up one leg of the voltage divider across the op-amp's gain loop. So long as there is no conductance between the probes, the op-amp's output will equal whatever is on the + input pin 5. As conductance increases the amount of negative feedback (which is what determines op-amp gain) decreases because some of the signal is being sinked to ground via the probe. Less feedback means more gain and more amplification.<br />
<br />
The advantage of using the feedback loop is it doesn't take nearly as much current to pass thru the solution and you get a large variation in output. If the probe was just part of a simple voltage divider without being in a gain loop would need to pass about 100 times more current thru the solution, or else pass a smaller signal and then you have noise issues. The disadvantage is that there is ALWAYS at least a gain of +1 in a non-inverting amp that must be nulled out later. Also sucky is that uneven changes between the + and - supply voltages will cause a small amount of offset drift. This offset issue bothers me :(, feel could have done it better but whatever this works and took a few days already blah.<br />
<br />
Part substitution: Changing the value of R7 is yet another, and probably the best, way to compensate for different probes. If readings are too high lower the resistance, if they are too low raise R7's value a bit.<br />
<br />
AC to DC converter: Lastly there is the AC to DC converter. You can just measure the output of the gain-loop stage then do alot of math to figure out EC/PPM, but it would be ALOT nicer if the output was zeroed, scaled, and stuff. The first op-amp is configured to convert the AC signal level into a DC voltage with adjustable gain for scale. You cannot just use a diode or even a bridge rectifier alone because of the constant voltage drop of .7v or so creates alot of problems. The solution is to put a bridge into a feedback loop, as the input voltage changes so does the current across the resistor (R8) connected to the DC side of the bridge. With current change comes a proportional DC voltage change that can be measured across the resistor.<br />
<br />
[[Image:DifferentialOutput.jpg|right|Differential Output]]<br />
Problem with voltage across the bridge is that its differential, there is still a sine wave present when measured with ground as a reference. The Differential Output picture shows a scope connected to the +/- terminals of the bridge. A DC meter across the bridge will measure the difference between the two wave forms. In the picture you can see there is a consistent difference between the top and bottom wave form of about 2 of the little grid squares. Scope is set up where each grid square equals 1 volt, so a meter on the bridge would see a constant difference of and display 2V.<br />
<br />
This would almost work by itself except you need an offset and most A/D converters do not have differential inputs and require a input referenced to ground. So the final part of the circuit is a simple differential amp, also here is where the offset it adjusted. The output is now ready to go to a volt meter or to an A/D input! A note about the offset, blah it really needs to be compensated for earlier because as the gain adjustment of previous stage changes so does the offset just a little bit.<br />
<br />
==Adjustment==<br />
There are 3 pots in the circuit needing attention. To adjust the first V1 hook a meter or better yet a scope up between ground and pin 1 on op-amp. Adjust V1 till there is no output, then slowly turn the opposite direction untill oscillation occurs and the meter reads something while in AC mode or the scope has a nice pretty sine wave. If you adjust it too far the wave will be ugly looking, so do it slowly!<br />
<br />
Next put V2 in the middle and adjust V3 so the output @ ECv (pin 14) is 0vdc. Wipe off the probe with a paper towel then put it into a 2Kppm calibration solution. Adjust V2 so that meter reads 4vdc. Again dry and wipe probe and repeat the adjustment of V3 back to 0vdc. You will need to go back and forth (about 3 or 4 times here) between adjusting these two pots before it scales properly. Should read 4vdc (meaning 4 EC) with 2Kppm solution and 0vdc with the probe dried off. If your unable to get it to scale properly you probably need to change the value of R7 as described in the schematic because your probe is too different from mine. Mine reads within about .05 EC of what i am expecting with clean probes.<br />
<br />
==The Probe==<br />
[[Image:Probes-small.jpg]]<br />
<br />
This was a bit tricky. At first i tried copper wire, push pins and various other things. With these experiments i determined that you need to expose a small and consistant amount of the probes to the solution at a consistant distance. I accomplished this by using alot of hot glue and/or insulation on the wire so that only the tips of the wires would touch the water. Then I realized that the stupid readings drift like crazy untill you clean the probe again, and even cleaning the probe sometimes didnt help because probably some chemical reaction with the stuff in the solutions. I kept trying to think of something that would be a great conductor without corroding in the solution, and came up with GOLD! I used a few types of gold plated audio connectors before i found some bananna jacks that seemed to work best. I covered them so again only the tips are exposed to the solution at about 1cm apart and was able to get consistant readings over and over especially if i cleaned the tip before and after each test.<br />
<br />
So, use gold plated probes, make sure a small and consistant amount of probe touches the solution, and clean the probes after and before each use. Using these guidelines should get you a nice reliable probe, I had wanted to find a nice premade and ez to find connector that i could suggest, but nothing laying around here is very common. Gold plated RCA plugs seem to be the worst probably because these cheep things are only plated enough to look gold colored. Was looking for a nice gold plated 1/8" phone jack or something but nothing was laying about here blah. If the meter cannot seem to be adjusted right (is allways too high a reading) try increasing the spacing of the probe or changing values of R7. If reading too low try moving probes closer or exposing more probe material.<br />
<br />
Here are a few probes I tried (picture at top of section). The part you measure with on all probes are facing bottom of picture. From Left to Right: 12AWG house wire with ground removed, sewing pins surrounded by hot glue except the tips (this was WORST of all), gold plated RCA jack with center filled in by glue (was not very stable, i think very thin gold plating), and finally the best of the whole lot is the two gold plated bananna jacks covered with heat shrink and hot glue exposing only the tips.<br />
<br />
I've been asked about and have considered myself just leaving the probe submerged and possibly reading it constantly. This seems a bad idea, allthough probably with experimentation you could make it work. The main problem would be from the probe corroding which would occure faster with the circuit in operation. Maybe you could get a nice gold probe and have a circuit to either power up or connect the probe only when needed? Dunno really. For observations on this topic see updates below.<br />
<br />
[[Image:Newppmprobe2.jpg|thumb|Newer probe design featuring enclosed electrodes]]<br />
Since writing the above paragraph have used the same probe for nearly 2 years, it worked fine with occasional cleaning. ^^<br />
<br />
Reader suggestions have included using nickle, and graphite. Both of which seem good suggestions. See the discussion pages for more information. <br />
<br />
===New and Improved Probe Design===<br />
2008.09.02<br />
[[Image:Newppmprobe.jpg|thumb|Another view of newer probe design]]<br />
Recently decided to create a new probe because in an attempt to fix0r some problems with the old one. The contacts (formally gold plated) were still in excellent condition, but the main problem was the reading would often change depending on how close the probe was to the edges of a particular container. To new probe design solves these problems by surrounding the probe's electrodes within a plastic container.<br />
<br />
The probe was made using the end of a syringe however the ends of a fat marker or other similar items may work as well. Two wires emerge from from the top and were soldered onto two 1cm square pieces of copper (with sticky stuff on the reverse). The top of the probe where wires entered is sealed with hot glue (prolly silicone would work better). Two small holes were drilled near the top, without them air pockets are created that may screw up readings. u_u<br />
<br />
Note the syringe itself is marked in cubic centimeters, and remember that commercial probes measure the conductivity between two 1cm square probes in a 1cubic centimeter chamber. ^^ This probe is (probably) very much likely close to a commercial probe in its readings. Cannot test this exactly because don't have a real factory made probe to compare with.<br />
<br />
Tests using the probe seemed very successful. \^_^/ For one thing no matter where in the test samples the probe was placed the readings were all the same! This is a great improvement over the previous design. The circuit itself needs a bit of adjustment because of course with a different probe. As mentioned in the circuit section the feedback resistor on the gain stage needs changing due to the newer probe having larger surface area. Have not yet actually done this >_> but will when i make next batch of changes to the probe. Which should also include the lovely temperature compensation circuit proposed on the talk page. (thank you!)<br />
<br />
==Construction==<br />
Since most of the parts for this were scavenged from old junk there is not much point in discussing construction techniques in depth (That and I'm getting tired of writing sooo much). Construction is not critical so long as all the wires go the the right spot it should work.<br />
<br />
These pictures show the prototype and the 'finished' module squeezed onto a small piece of perferated board. Eventually this one will go into a box with PSU, microcontroller, and a bunch of other I/O. So put on a .156" connector for the power/ouput and a RCA jack for the probe so it could be removed easily.<br />
<br />
{| align="center"<br />
| [[Image:protocircuit.jpg]] || [[Image:circuitcloserup.jpg]]<br />
|- align="center"<br />
| Prototyped version || More permanent version<br />
|}<br />
<br />
==Operation==<br />
<br />
After Calibrating with the 2Kppm (4 EC) solution, tested with the 1K (2 EC) solution. Also tried it with a few other values down to 250ppm, seemed to worked well. Btw, you may notice my meter is falling apart, if you feel this information is of use and have a spare meter or something please send thanks.<br />
<br />
{| align="center"<br />
| [[Image:Reading2K.jpg|thumb|340px|Reading 2000PPM]] || [[Image:Reading1K.jpg|thumb|360px|Reading 1000PPM]]<br />
|}<br />
<br />
There are other ways to do this. For instance if the probe were to be connected across or in place of R1 or R2 the frequency of the oscilator will vary a bit depending on conductivity of the solution and the values of C1, C2, etc. Connecting the oscilator output to a microcontroller will allow you to determine the conductivity by the frequency without the need for the other 3 op-amp stages.<br />
<br />
This is not done at all, ill post more as its completed.<br />
<br />
==Long Term Observations==<br />
<br />
2006-09-22-Observations: I've been using this thing for about 5 months now, keeping the probe submerged all of the time. This worked great for a few weeks, but slowly it started to get cruddy every 3-4 days and readings were off by up to 100ppm. Wiping off the probe gets it back to within about +/-40ppm but before I take a critical reading (like when refilling the tank it's monitoring) will allways clean and recalibrate. Looking at it, the probe's once smooth and shiney gold surface now seems dull, cruddy, and pited.<br />
<br />
The probe is holding up alot better than i first thought it would being constantly submerged. If used intermittently it would probably stay stable without recalibration longer.<br />
<br />
Found places that sell just the ppm probe itself and i have a feeling using one of these will increase the meter's accuracy and stability greatly. Also an email from someone who has worked at places where EC meters were manufactured suggested that i use nickle instead of gold. But i've not had a chance to check either of these.<br />
<br />
<br />
[[Image:finishedmeter.JPG|right]]<br />
Someone hinted to me that this could be an even more useful circuit if only it would operate off a single polarity power source. I need another one of these so in the process of building it may make a few mods.<br />
<br />
Also, to make things easier and alot more ereet I have installed the circuit in this box and connected it to the adc input of a microcontroller. By doing this i can zero/calibrate it using software simply pushing a few buttons.<br />
It has a rs-232 port, and USB too so can connect it to a computer for loging or possibly automating some process. I'll put up more documentation on this part of things soon.<br />
Note: The display is reading ppm on the left and ph on the right, with the probes in calibration solutions.<br />
<br />
==Microcontroller Code==<br />
Here is a snippet of the meter's code. (Rest of the code is [http://blea.ch/~eris/litter/ppm/ here]) These command functions are called via the shell or assigned to button presses and use fixed point maths:<br />
<br />
<source lang="c"><br />
/* zeroppm command */<br />
int c_zeroPpm(int argc,char **args) {<br />
m_cfg.ppmoset=readADC(ADC_CH0); //Read ADC channel 0, store as offset<br />
meterSave(m_cfg); //Save settings to eeprom<br />
return(m_cfg.ppmoset);<br />
}<br />
<br />
/* scaleppm command, if argument calibrates to ARG1 ppm, otherwise defaults to 1000 */<br />
int c_scalePpm(int argc,char **args) {<br />
if(argc==1) {<br />
printf("usage: calibppm PPM\r\n");<br />
return(ERROR);<br />
}<br />
if(argc==0) { // calcuate scale using CALIBPPM/(ADC-offset)<br />
m_cfg.ppmscale=((long)(((long)100000)/(readADC(ADC_CH0)-m_cfg.ppmoset)));<br />
}<br />
if(argc==2) { //same but with arg1 as calib, note the *100 for fixed point<br />
m_cfg.ppmscale=((long)(((long)numtoint(args[1])*100)/(readADC(ADC_CH0)-m_cfg.ppmoset)));<br />
} <br />
meterSave(m_cfg); //Save settings to eeprom<br />
return(m_cfg.ppmscale);<br />
}<br />
<br />
/* readppm */<br />
int c_readPpm(int argc,char **args) {<br />
long ppm;<br />
ppm=((long)(readADC(ADC_CH0)-m_cfg.ppmoset)*m_cfg.ppmscale)/100;<br />
//display the results<br />
printf("PPM: %04i\r\n",(int)ppm); //print upper 4 digits of ppm value (/100)<br />
return(ppm);<br />
}<br />
</source><br />
<br />
==Other Stuff==<br />
Thanks to all u pplz who've emailed me! Part of motivation for wikifing was all the great suggestions and good questions wish i coulda easily thrown in, not to mention the [[Talk:PPM_Meter]] page! \^_^/!!<br />
<br />
This article was originally written late 2005/early 2006..<br />
<br />
==Disclaimer==<br />
Good Luck!<br />
Be carefull, dont do anything stupid and shock yourself to death.<br />
<br />
Disclaimer: I am not responsible for what you do.<br />
<br />
Experiment, learn, improvise, take what is otherwise junk from your enviroment and making of it something more.</div>Erishttp://blea.ch/wiki/index.php/NitrofsNitrofs2012-01-21T10:13:42Z<p>Eris: Changed protection level for "Nitrofs" [edit=sysop:move=sysop]</p>
<hr />
<div><big>Nitrofs Filesystem Driver for Nintendo DS</big><br />
__TOC__<br />
==What is it?==<br />
<span style=color:red>Important!!!!</span>; Small bug found in ndstool that may affect the nitrofs, read more [[Talk:Nitrofs#Bug_in_ndstool|here]].<br />
<br />
Nitrofs is a driver that allows accessing of files from a read-only nitro-filesystem appended to the end of a .nds file. This is how commercial carts store additional data and allows the homebrew app to only load into RAM what is currently needed by the game. In this way data such as large audio files, stage/level specific graphics, can be used without running out of memory. <br />
<br />
Since all the game data is stored in one file along with the game or application itself there is no need to ask the end user to copy over alot of seperate files and clutter up their flashcard. :D Additionally this makes it slightly more difficult for inexperienced morons to change the graphics or audio of your game and call it their own than if all the data files were exposed as individual files on the flash card.<br />
<br />
Am happy to announce that an implementation of this driver is finally included in the latest version of [http://www.devkitpro.org/ libnds]!!! It is now part of [http://www.devkitpro.org/libfilesystem/libfilesystem-091/ libfilesystem]. Yay \(^_^)/ <br />
<br />
If NitroFS is to be used with DeSmuME the following settings are required:&lt;br&gt;<br />
Emulation→GBA Slot→Compact Flash→folder&lt;br&gt;<br />
The most up-to-date information can be found at the [http://wiki.desmume.org/index.php?title=Faq desmume faq]<br />
*[https://www.cs.kent.ac.uk/projects/refactor-fp/fp-design/antivirus_Comparison_thoughts_58 free virus protection download]<br />
<br />
==Releases==<br />
<br />
<span style="color:red">Latest release</span> : <br />
[http://blea.ch/wiki/images/b/b7/Nitrotstprojectv0.8-turbo.tar.bz2 NitroFs Driver v0.8-turbo.tar.bz2] | <br />
[http://blea.ch/wiki/images/0/0c/Nitrotstprojectv0.7-turbo.tar.bz2 Nitrofs Driver v0.7-turbo.tar.bz2]<br><br />
Previous releases : [http://blea.ch/wiki/images/4/4f/Nitrotstprojectv0.4.tar.bz2 Nitrofs Driver v0.4.tar.bz2] <br><br />
<br />
The project archive contains three source files:<br />
<br />
[http://svn.blea.ch/thdslib/trunk/thdslib/source/arm9/source/nitrofs.c nitrofs.c] - The nitro filesystem source.<br />
<br />
[http://svn.blea.ch/thdslib/trunk/thdslib/source/arm9/include/nitrofs.h nitrofs.h] - The nitro filesystem header. This should only be included into the file where you have your nitroFSInit() call.<br />
<br />
[http://blea.ch/~eris/litter/nitrofs/files/main.c main.c] - A working example that demonstrates using the filesystem, reading directories, and reading from a embedded audio file. In this case a wuvry song from the game [http://en.touhouwiki.net/wiki/Lotus_Land_Story Lotus Land Story] by [http://en.touhouwiki.net/wiki/ZUN Zun] which has the filename Th04_01.raw. Please enjoy.<br />
<br />
The archive also contains an entire working example project and can be built by typing 'make' in the nitrotst directory as you would any other project using devkitPro. <br />
<br />
Functional executable file of the latest test release in .nds format, as well as copies of the previous archives and raw source files, can be found [http://blea.ch/~eris/litter/nitrofs/files/ here] and may be useful for evaluation and testing. <br />
<br />
===Change Log===<br />
'''v0.2'''<br />
* Now the .nds file should work with both emulators and flashcards. (thx wintermutes) :DD <br />
* Fixed bug in fseek. SEEK_CUR should now work properly.<br />
'''v0.3'''<br />
* ftell() now works as expected (v0.3)<br />
* Put back support for .gba and .sc.nds formatted files, now both .nds and .gba files should work in emulation <br />
* added stat() support <br />
'''v0.3.1'''<br />
* added SEEK_END support.. <br />
'''v0.4'''<br />
* added errno values for several functions<br />
* added chdir functionality <br />
'''v0.5.turbo'''<br />
* corrected SEEK_END so that the position argument is utilized <br />
* greatly improved file opening speed by around 106ms in dldi mode by reusing the .nds filehandle created at init for all subsequent operations. <br />
'''v0.6.turbo'''<br />
* added full "." and ".." support. dirnext() will return . and .. first, and all relevent operations will support . and .. in pathnames.<br />
'''v0.7.turbo'''<br />
* added errno values for several functions<br />
'''v0.8.turbo'''<br />
* fixed problem with false GBA detection causing failures to initalize nitrofs properly<br />
* added documentation for auto-selection of filename<br />
<br />
The latest 'turbo' release as mentioned improves file and directory opening and closing times, by using a single filehandle to access the .nds file when in FAT/DLDI mode. This is great for situations requiring reading a lot of seperate small files which most users will probaby desire, however it does take slightly longer when reading from multiple files '''at once'''. Details are [[Talk:Nitrofs#Multiple_vs_Single_FAT_filehandles_when_in_.nds_mode|here on the discussion page]].<br />
<br />
Older updates and more information on nitrofs can be found on the [[Talk:Nitrofs|Discussion page]]. Feel free to ask questions, report bugs, or comments here. ^^<br />
<br />
==Creating the filesystem==<br />
You place all the stuff you want to have on the filesystem into a directory. For this example we have a directory named "MyNitroFS".<br />
This directory, its subdirectories, and all contents are then converted into nitro filesystem format and appended onto your executable using ndstool's -d option. Like So:<br />
ndstool -c myhomebrew.nds -d MyNitroFS<br />
<br />
Thats it, now all the stuffs in MyNitroFS dir is elegantly appended into one nice pretty file. XD<br />
<br />
<span style="color:red">Important!!!!</span> Bug found in ndstool affecting nitrofs, read more [[Talk:Nitrofs#Bug_in_ndstool|here]].<br />
<br />
<span style="color:red">Note:</span> Do not use the -o option with ndstool for embedding wifi logos, this will break emulator support!<br />
<br />
While its no longer necessary, if for whatever reason you need to use a .sc.nds or .ds.gba formatted file, dsbuild be used:<br />
dsbuild myhomebrew.nds -o myhomebrew.ds.gba<br />
<br />
In such a case nitrofs will automagically switch to gba mode and read the filesystem from gba's ROM space instead. This requires no changes to the code at all. ^^<br />
<br />
==Makefile Options==<br />
One complaint has always been, that without argv[0] support determining the filename required a #define or magical string within the file. Had knowns about the -D compiler option and that $(TARGET) is set to the name of the project directory, but only recently realized simply adding to arm9/Makefile: *<br />
CFLAGS+=$(INCLUDE) -DARM9 '''-DNDSFILENAME=\"$(''TARGET'').nds\"'''<br />
<br />
or for arm9 only builds: *<br />
CFLAGS+=$(INCLUDE) -DARM9 '''-DNDSFILENAME=\"$(''notdir $(OUTPUT)'').nds\"'''<br />
<br />
This is equivalent to:<br />
<source lang="c"><br />
#define NDSFILENAME "nameofmy.nds"<br />
</source><br />
within the .c file calling nitroFSInit(), which may still be used if desired.<br />
<br />
* May need to tweak the examples for different Makefiles<br />
<br />
==Reading from nitrofs==<br />
Firstly, you'll need this includes:<br />
<source lang="c"><br />
#include <nds.h><br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <fcntl.h><br />
#include <unistd.h><br />
#include "nitrofs.h" //only needed in the file where nitroFSInit() function is called.<br />
#include <fat.h><br />
</source><br />
<br />
Then you will need to initialize the FAT driver, and the nitrofs driver:<br />
<source lang="c"><br />
fatInitDefault();<br />
nitroFSInit("myndsfile.nds"); //See Notes Below<br />
</source><br />
*Replace 'myndsfile.nds' with the name of your .nds file so the driver knows where to find it. There may be problems if the end user places the homebrew file in an odd place like in an /apps/ directory. You could try to avoid this using the argv[0] argument passed to main() here (which points to the current file) however as of this writing it is not supported on all cards or loaders. So for now its prolly safest to just inform the end user that the file must be placed in the root directory of the card. <br />
<br />
''Some card's loaders will copy bits of the header to GBA slot RAM if present when loading which would previously confuse nitroFSInit() causing it attempt to read off GBA instead of fat. To solve this problem first made nitroFSInit check for a non NULL filename and then to try to read from FAT before reading from GBA. ''<br />
<source lang="c"><br />
nitroFSInit(NULL); //Force nitrofs to read from GBA slot<br />
</source><br />
<br />
Lastly open a file as you would on any other system specifying nitro: as the drive:<br />
<source lang="c"><br />
fd=open("nitro:/Th04_01.raw",O_RDONLY);<br />
read(fd, myBuffer, mybufferSize);<br />
close(fd);<br />
</source><br />
(Author's Note: Really dislike that they did not use Unix style nodes for drives and devices such as '/dev/device' or '/media/drive'. Instead opting for DOS 'drive:' style.. but jaja.. it works :D )<br />
<br />
You may want to add some error checking and reporting in case the filename or filepath passed to nitroFSInit are incorrect, the card does not support DLDI. This can be done somewhat like this:<br />
<source lang="c"><br />
//Path to this executable containing nitrofs (if not defined already in Makefile)<br />
#ifndef NDSFILENAME<br />
#define NDSFILENAME "myndsfile.nds"<br />
#endif<br />
<br />
int fd;<br />
int nitroOk; //make sure nitroFs started ok<br />
bool imfat; //indicate fat driver loaded properly<br />
printf("initalizing fat\n");<br />
if(fatInitDefault()) {<br />
printf("Success...\n");<br />
nitroOk=nitroFSInit(NDSFILENAME);<br />
imfat=true;<br />
} else {<br />
nitroOk=nitroFSInit(NULL);<br />
imfat=false;<br />
}<br />
printf("initalizing nitrofs\n");<br />
if(nitroOk) {<br />
printf("Success...\n");<br />
fd=open("nitro:/myreadonlynitrofsfile.txt", O_RDONLY);<br />
if(fd>=0) {<br />
len=read(fd,sample,st.st_size);<br />
close(fd);<br />
} else {<br />
printf("read only file open failed\n");<br />
}<br />
} else {<br />
printf("Failed... (normal for some emulators. Dont worry, yet :p)\n");<br />
printf("Failed...\n");<br />
if(imfat) { //error if fat was initialized...<br />
printf("Cannot open %s please check filename and path are correct.\n",FILENAME);<br />
} else { //error if fat/dldi failed<br />
printf("FAT/DLDI error, please to ensure your card supports DLDI.\n\n");<br />
}<br />
}<br />
</source><br />
<br />
==FAQ==<br />
===Isn't there already a way to do this?===<br />
The previous solutions for appending filesystems to .nds files were kinda suxy. For one thing they were not always compatible with most emulators and cards, or did not use the stdio subsystem as a proper filesystem driver should, instead requiring nonstandard open/close/read calls.<br />
<br />
Before there were pretty much two options, GBFS and EFS. GBFS would work on emulators, but not off slot-1 cards, EFS would work off slot1 using DLDI but was was not compatible with most emulators. If you wanted to run your game on emulators AND off slot-1 flash cards you had to use two seperate libraries and use alot of #ifdef #else #endif type stuff because they used different function names<s>, as well as neither (afaik) used stdio calls</s>.<br />
<br />
Since nitrofs v0.1 was released EFS has been updated to use stdio calls and fallback to gba reads. <br />
<br />
===Why can't you make it read/write instead of read only?===<br />
Because if DLDI/FAT is not enabled (as is on emulators), it attempts to read it in slot-2 gba mode which is read only. This project was partly created to help solve compatibility issues between different cards and emulators as well as do things in a way that more closely resembles a factory cart which is read only as well. Some people just want to do things in way that more closely resembles actual Nintendo libraries and possibly have dreams of one day doing a commercial release of their homebrew. [http://blog.dev-scene.com/lacey/2008/02/07/filesystem-choices/] <_< <br />
<br />
----<br />
[[Category:NDS]]<br />
[[Category:Drivers]]<br />
[[Category:C]]<br />
[[Category:LIBTHDS]]</div>Eris