Sadale - Electronics, Games, Music and More!

Welcome to the website of a one-man amateur research and development center! Started off with game development, Sadale had developed various products, including electronic products, games, websites, desktop program, apps, music, etc. Sadale aims to become a cyber entity capable for creating literally anything possible using computers.

This website is a blog that mainly contains documentation of the progress of my projects as well as their release announcements. It also contains non-googleable solutions to some problems that I've encountered. Scroll down to read the blogposts.

All of the products mentioned in this website are my own work, unless stated otherwise.

Core value: Development in Stability

Showcase - Electronics

Showcase - Games

Showcase - Music

Showcase - Misc

Next Project

Donate with PayPal button If you'd like to support this website and the products that I'm developing, please consider making donation using this button. Thanks! :)

廣東話版網頁介紹

薩地魯 - 電子野, 網頁, 遊戲, 音樂, 仲有其他作品!

歡迎嚟到薩地魯嘅網站. 曾經係業餘遊戲開發者, 今日薩地魯利用佢嘅業餘時間, 乜都整餐懵. 包括電子野, 遊戲, 音樂, 研究項目等等.

呢個網站主要用來blog低薩地魯開發嘅作品同埋係Google搵唔到嘅問題嘅解決方案. 作品列表請見上面嘅網頁介紹嘅英文版.

絕大部分嘅blogpost只有英文版. 當然, 都有D有廣東話版嘅.

核心文化: 穩定為先, 開發為本

nimi mute pi toki pona

jan Sate - ona li pali e musi pi ilo sona e kalama musi e ijo ante!

kama pona! ni li lipu pi jan Sate. tenpo pini la jan Sate li pali e musi pi ilo sona. tenpo ni la jan Sate li pali e ali.

pali pi jan Sate li lon sewi pi lipu ni kepeken toki Inli.

lipu ni li jo e nimi mute pi pali pi jan Sate. ona mute li lon kepeken toki Inli. taso lipu ni li jo e ona lili pi toki pona. sina wile lukin e nimi mute lon toki pona la o pilin e nena ni!

jan Sate li pali tan musi tan mani ala.

?????
Website Description in a language that you don't understand

Recent Blogposts

Future Distribution of Ilo Nanpa with Time-Efficient Production Method

Sept. 30, 2019, 11:04 a.m. Behind the Scenes Electronics ilo nanpa

Future Distribution of Ilo Nanpa

Hey guys! I'll be distributing new units of ilo nanpa! Previously, ilo nanpa was distributed in irregular batches. From now on, I'll be shipping a batch at approximately the end of each month (unless I run out of stock).

With time-efficient production method, the time-cost of unit production is reduced by quite a lot. Therefore, I'm lowering the average donation target per unit from $30 to $20 for all of the new units produced, including international shipping fee.

For each donation made, I'd add the amount to the donation pool. For each unit shipped, I'd deduct $20 from the pool. The fund available in the donation pool will be used for giveaways, or for subsidizing those who're donating less.

For a donation of $25 per unit or above, you'll be enlisted as one of the honored donors in the official website of ilo nanpa.

Future Distribution: Procedure of Getting Ilo Nanpa

If you're interested, here's the procedure of getting a unit of ilo nanpa:

  1. Contact me, using either the contact method in the official website of ilo nanpa, or using any social media that I'm active in. Please provide the following information:
    • Recipient address and recipient name
    • Your intended total donation amount (If you wish to donate less or even get it for free, especially if you aren't in the workforce, it's ok to write down less than $20, or even $0. You'll still get a unit if there's enough fund available from the donation pool. If you donate more than $25, you'll be enlisted as honored donor)
    • Your name/nickname and optionally contact method/website if you're eligible to be a honored donor and if you wish to be named
    • The quantity of units that you wish to get. If it isn't mentioned, it'd be assumed that you're interested in getting one unit.
  2. Wait for my reply. I'll confirm if any unit is reserved for you based on these factors:
    • If ilo nanpa is in stock
    • Your donation amount and the available fund in the donation pool. Given that it's in stock, a donation of >$20 will secure you a unit.
    • In the reply, I'll provide the following information to you:
      • The donation link and the amount to be donated
      • The quantity of units reserved for you
      • The approximate shipping date
  3. After the donation is made, I'll ship the unit(s) to you on the shipping date. It'll be shipped as a registered parcel.

Future Distribution: Procedure of Donating without Getting Ilo Nanpa

If you wish to add funds to the donation pool without getting a unit of ilo nanpa, just donate to me using the donate button in the homepage of my website and contact me. The donation will be 100% used for subsidizing the recipients who are donating less or not donating (i.e. giveaway). If you wish to be named, a donation of $5 would enlist you as one of the honored donors.

Future Distribution: Website Updated with Distribution Information

The official website of ilo nanpa has been updated to show the number of units in stock, units distributed and the amount of fund available in the donation pool.

Future Distribution: Where'd the Donation be Used?

Here's the breakdown of the spending of donation for each unit:

  • ~$3 for material cost, including PCB, electronic components, soldering material and packaging
  • ~$5 for international shipping fee
  • ~$12 labor cost for new units (takes 45 minutes per unit), and $22 for old units using old production method (takes 2 hours per unit. In fact, 2 hours of time's worth far, far more than $22 to me)
    • Cost for renting VPS, purchasing new equipment, etc. is drawn from labor cost. I've been taking the money from my own wallet for funding my hobby for years. It'd be awesome if it can get fully or partially funded by donation.

I'd like to take this opportunity to thank all of the previous donors. With the donated amount, I've purchased new equipment, which allows me to produce ilo nanpa more efficiently.

Behind the Scenes: Time-Efficient Production Method

As I'm rather new in electronics world, my current technical ability of assembling electronic parts is rather rudimentary. I've been assembling electronic devices by soldering the components onto the PCB using soldering iron one-by-one, which is extremely time consuming.

Before this project, I only had to assemble one, or perhaps a couple of prototype units for my projects. So the time inefficiency wasn't an issue. However, this had changed since the completion of the ilo napna project. I have to manually solder a handful of units of the device in order to distribute them to Toki Pona speakers. And it took me two hours to produce a unit of the device, which was dog slow. And the demand just isn't high enough to justify outsourcing the assembly process.

Time-Efficient Production Method: Solder Paste Stencil-Based Soldering

As the previous production method was time consuming, I looked into more time-efficient production alternatives. After some Google-Fu, I've found that solder paste stencil-based soldering is probably the way to go for the following reasons:

  • Faster assembly. Instead of soldering the components one-by-one, I can solder all of them in one go
  • Low cost. The equipment and material required for using the stencil isn't expensive at all
  • Space efficiency. I wouldn't need any huge-ass machinery to perform the production

Time-Efficient Production Method: Equipment and Material Purchased

I've purchased the following equipment and material for experimenting with this production method:

  • Solder paste (duh! It's **solder paste** stencil-based soldering!)
  • PCB with its stencil (duh! It's solder paste **stencil**-based soldering!)
  • Tweezers for placing the components
  • Hot air gun (DKT 8032, with adjustable airflow and temperature)
    • Ideally I should get a toaster oven or reflow skillet. However, I don't have the space for that. Welcome to Hong Kong. It's one of the crowdest cities on the earth. :(
  • Heat-resistant mat so that the hot air gun won't burn the soldering platform

I've purchased a new batch of ilo nanpa boards. This time, the boards are panelized so that four units of the device can be produced for each PCB. After soldering them, I'd break up the PCB and I'll get four devices from a board. Here's the photo showing a jar of solder paste, panelized PCB and a stencil on a heat-resistant mat:

a jar of solder paste, panelized PCB and a stencil on a heat-resistant mat

Not all components can be soldered by this technique. Only SMD components can be soldered in this way. Fortunately, most of the components of ilo nanpa are SMD components. The only components that require using soldering iron are the USB port, programming port and the battery holder.

Time-Efficient Production Method: Procedure of Production using Solder Paste Stencil

I mostly just followed this solder stencil tutorial on Youtube. Except that I'm using hot air gun instead of reflow skillet for soldering the components onto the PCB.

Here's how I'm producing the devices using this new production method:

  1. Prepare the material and equipment, including PCB, electronic parts, soldering iron, hot air gun, etc.
  2. Put the soldering stencil above the panelized PCB. Apply solder paste onto it using putty knife
  3. Take away the soldering stencil
  4. Place the components onto the panelized PCB using tweezers
  5. Solder the SMD components onto the PCB using hot air gun
  6. Break the panelized PCB of ilo nanpa into 4 smaller boards
  7. Solder the DIP components using soldering iron
  8. Attach the battery holder to the back of the unit
  9. Program the unit using STLink
  10. Perform setup and quality control using factory mode of the device. Debug and rework if it fails the quality control

In step 2, since some spare PCBs are required for using the stencil, the 10 thought-to-be-useless wrong ilo musi boards that I ordered long time ago is now somehow useful. They're perfect to be used for holding the ilo nanpa PCB workpiece in place so that I can apply solder paste using the stencil easily.

At the end of step 3, here's a photo showing a work-in-progress panelized PCB. Take a close look and you'll see there's a layer of gray solder paste applied on each of its pads:

A photo showing PCB with solder paste on all of its pads

As for the hot air gun in step 5, it's empirically found that setting the air flow to 2/8 and the temperature to 3/8 works well for soldering the components.

Time-Efficient Production Method: Result

This new production method works very well. Despite that the stencil is a bit expensive, it has cut down the production time by quite a lot. Before using this method, I produced ilo nanpa at a rate of a unit per two hours. After using this method, I managed to produce four units within 2.5 hours, with an additional 0.5 hours of setup and cleanup time.

A photo showing four units of assembled ilo nanpa devices

This production method is very helpful for producing several units of electronic devices in timely manner. For a demand of 20-ish units, it seems to me that it's the go-to method for production. I'm very glad to have learned it. I'll continue be using this method for small scale production.


Sadale Had Entered Limited Operation Mode

Sept. 22, 2019, 11:27 a.m. Meta

Hey guys! It's been quite a while since my last blogpost. I've got a bad news for you guys. Sadale had entered limited operation mode. Due to copyright concerns, Sadale will not perform further research and development work until this mess is cleared.

What happened?

After I stopped freelancing, it took me a while to land on a day job. In fact, I've got two offers. The first offer is offering 30% more salary than my first day job. And the second one is 60% more than my first day job. After briefly working for the company who made the first offer to me, I decided to switch to the second one. Mostly as a tactical move to get me decent compensation in all of my future jobs. As it goes on, it's found that this company I'm working for is rather awesome, tho.

Anyway, here's the problem. For both of the offers, the contract is claiming the copyright ownership of stuffs that I work on outside my work hours.

- Wait what?

Yes. They're claiming it. I pointed that out immediately after receiving the contract for both companies. And, well, I was verbally told that the work that I do outside the work hour wouldn't have their copyright assigned to the company. I didn't further fight for that because I pretty much needed a job after I was done with freelancing. Anyway I think that verbal commitment isn't trustworthy because that isn't in black and white. And I'm sure that the guy who told me that I can retain the copyright ownership of the stuffs that I work on outside my work hours isn't the only guy who could sue me.

Consequence of the Bullshit Clause of the Contract

Since I've signed that bullshit contract, it means that the company I'm working for may have the right to claim any further R&D work I do, even outside my work hours, which is bullshit. I mean, I'm not using my work hours, nor the company's resource, nor the company's connection for my personal projects. I'm not even competing with the company I'm working for.

I've asked my supervisor to disclaim the products that I develop on project-basis by email. After going thru some troubles, this had went thru. However, I'm not entirely sure if the emails would be legally binding. I really have to consult a lawyer, just to be safe.

Here's the problem. I pretty much need the copyright for everything that I develop outside work hours because I share and publish my works, often under open source licenses for software and electronics, and creative common license for music and other creative works. Since I've signed the contract, I'm no longer able to develop anything outside work hours without risking getting the copyright of the stuffs claimed by the company I'm working for, unfortunately. :(

The wordings of the copyright clause in the contact of the day job that I had before I started freelancing was different. It was worded in a way that they'd only be claiming the copyright of the stuffs that I was ordered to do at work. That why copyright was never a concern until I've taken this day job.

Moving on

To avoid getting the copyright of personal projects claimed by the company I'm working for, Sadale had entered limited operation mode. Until consulting a lawyer, I'll not work on any copyrightable stuffs outside my work hours.

The current company I'm working for is having a rather awesome work culture. I think that I'm probably able to learn far more from working for this company than the day job that I had before I started freelancing. In short run, I'll continue to work for this company. I'm stopping all of the development work of all of my personal projects. I can't even join events like Global Game Jam with this clause in effect as it'll generate copyrightable, god damn it!

Depending on the advise of lawyer consultation session, I may have to look for another job to get this sorted out in long run. I could also try fighting for the clause. However, considered that it was such an ordeal to get the copyright disclaiming email (which may not even be legally binding) to get thru, I wouldn't be optimistic on fighting for rewording of the clause.

However, works that don't generate copyrightable can go on. For example, I'm particularly interested in solder paste stencil-based soldering. It has been taking me like two freaking hours to produce a unit of ilo nanpa (the Toki Pona calculator). And the demand of the device is just far too low for outsourcing the assembly process because that'd be cost inefficient. With stencil-based soldering, it should save me quite a bit of time on producing the units. As production method isn't copyrightable, practicing the soldering technique will work even with this bullshit clause being in effect.

Perhaps I'll also take time on learning new stuffs, like learning music composition techniques, and perhaps also learning drawing. This will be done by mostly following tutorials available online. I'll expect all of the stuffs that I make for the purpose of learning will have copyright assigned to the company I'm working for. Anyway I won't care because those are just work done by following the tutorials and they won't be publish-worthy. On the bright side, after this copyright crap get sorted out, I'll be a much more capable individual. Then I'll be able to produce stuffs that has far better quality than I am able to now.

To avoid any potential dispute, I've decided not to work on the portable game console ilo musi any further until this situation is fixed. Not even for non-copyrightable works like units production and testing. Therefore, the original target completion date of ilo musi project by the end of 2019 will not happen. This project is now completely suspended. :(

For now, I'm going to focus all of my power on preparing for the upcoming Maker Faire. I'll be exhibiting ilo nanpa in Maker Faire Shenzhen 2019. This will be the first exhibition in my life! I'll probably be producing extra units of ilo nanpa so that they can be exhibited during the event. As the exhibition preparation is quite a bit of work, I'll look for free lawyer consultation session from the government some time after the end of the Maker Faire.


Portable Game Console Project "ilo musi" - Third Prototype, PCB, Menu, Clock Calibration, Software Release and Suspension of Development

Hey guys. Sorry for not updating you guys about this portable game console project for an extended period of time. I have been rather busy lately.

The previous blogpost of this game console was about the Stay In game developed for the 4th Alakajam. This blogpost aims to document the update of the portable game console project since the last blogpost! :)

Name of the Portable Game Console - ilo musi!

This project had come a long way without having an official name. From now on, "ilo musi" will be the name of this portable game console! It means "amusing device" or "playful device" or "toy" in Toki Pona language. This name is chosen mainly because it is unique, and it is meaningful. As this game console is a minimalist one, this name also map well to the ideology of minimalism of Toki Pona.

Hardware Update - Third Prototype of Hardware, with PCB!

I've drawn a PCB for this project! And this is the first PCB I've ever designed in my life! I've done this PCB almost five months ago. But I didn't have the time to blog about this. :)

A photo of a hand holding a piece of PCB of ilo musi

This PCB was designed using KiCAD. The main reason of using this PCB software is that it's FOSS. To learn drawing a PCB, I went thru the official getting started documentation of KiCAD. After going thru the tutorial, I managed to draw the PCB for the game console. It's easier than I thought it'd be. :)

Hardware: [Resolved] Terrible Mistake of MicroSD Pinout of PCB Design

I've made a mistake on designing the PCB. I messed up the pinout of the microSD card as I thought that it would be identical to full-side SD card. Then I designed the circuit based on the pin-mapping of the full-size SD card. It turns out that they're different.

  • Here's the pinout of full-size SD card layout in SPI mode: CS, DI, VSS1, VDD, SCLK, VSS2, DO, UNUSED, UNUSED

  • And here's the pinout of microSD card layout in SPI mode: UNUSED, CS, DI, VDD, SCLK, VSS, DO, UNUSED

Notice how there's an extra VSS1 in the full-size SD card. I didn't notice that and I messed up. Too bad! I realized this mistake after sending my design to the PCB fab. :'(

I asked about how much would it cost to modify the design. The PCB fab told me that it's already in production. So it wasn't possible to change the design anymore. I ordered another batch of PCB with the new design. And now I've got 10 wrong ilo musi PCBs laying around:

A photo of 10 wrong PCB of ilo musi packed in bubble wrap

Oh well. Lesson learned: Review the design carefully before sending it for PCB fabrication.

Hardware: Other issues in the current prototype

With the microSD issue fixed, the current PCB is working properly. Anyway, there're still some minor issues with the PCB:

  • The silk screen for the right button label is covered by a soldering pad
  • There's no fiducial marks. It's required for the ease of automated mass production
  • The header JP1 should be renamed to J10
  • The pins of the crystal is obstructing one of the battery holders
  • The mounting holes below the headphone jack is too large
  • More decoupling capacitors are needed for reliable power supply

Hardware: Specs Changes since Second Revision of Hardware

The microcontroller had been upgraded from STM32F030K6T6 to STM32F030C6T6. STM32F030C6T6 has more GPIO pins compared with STM32F030K6T6. And it is easier to upgrade to another pin-compatible microcontroller with STM32F030C6T6, which is the main reason of this change. With STM32F030C6T6, it'd be possible to upgrade the RAM and flash space of the microcontroller without modifying the PCB.

As a result of the microcontroller upgrade, the amount of spare GPIO had been increased from 12 pins to 22 pins. Now there're 22 user-accessible GPIO pins that can be accessed by the games developed for this game console! :)

In the final product, the following specs is to be expected:

  • A microcontroller of STM32F0x0 value line. Probably STM32F030C6T6 if the flash wearing isn't an issue, or STM32F030CCT6 if flash wearing is an issue
  • Selectable USB/battery power
  • Selectable Buzzer/Audio jack audio output
  • Volume adjustment knob
  • microSD card slot
  • 22 GPIOs for game-specific hardware expansion
    • No driver would be provided for interfacing with GPIO by the bootloader firmware. The user has to develop their own GPIO driver or use a library like STM32F0 LL.

Software News

Software News: Game Selection Menu

The game-selection menu of ilo musi is implemented! Its purpose? You guessed it. It's used for selecting a game on the microSD card. With game selection menu, it's possible to store multiple games on the same microSD card. Then the player can choose a ROM from the microSD card and play it! The menu also load system configurations and has feature designed for the ease of game development.

A photo of ilo musi's game selection menu

Software News: Menu: Game Selection

As shown on the picture above, the player can choose the game using the menu. The menu can be navigated using key UP and key DOWN. Key 1 is used for starting the game, and key 2 is used for refreshing the microSD card (useful for changing the microSD card).

This portable game console supports microSD card formatted as FAT32 filesystem. The file names are shown as 8.3 filename. Directory navigation is possible.

Upon the game is selected, self-flashing would be performed. After that, the program counter would be jumped from the bootloader to the game. Then it'd be up to the game to handle what to do.

Software News: Menu: Debugging Games

As for the procedure of new game development, first, prepare the game resources, including graphical assets and whatever needed and pack the game ROM as "DEBUGRES.IMG". After that, put the file "DEBUGRES.IMG" file somewhere on the microSD card (can be put onto the root directory). Then program the game code to the microcontroller using ISP. Then the game console would be reset. Then the developer would navigate to the directory containing the "DEBUGRES.IMG". If the file is available in the directory, the game console would not perform self-flashing and jump to the game right away. Since the self-flashing part is skipped, this allows the developer to run debugger for the source code of the game with the updated game code that the developer had just flashed using ISP without repacking the game ROM. This "DEBUGRES.IMG" feature makes the life of the game developers easier.

Software News: Menu: Contrast Adjustment and Internal Clock Calibration Values

It is possible to perform contrast adjustment using the menu by pressing key LEFT and key RIGHT. This would adjust the brightness of the pixels on the LCD. The contrast adjustment value is stored on the option bytes of the microcontroller so that it'd persist after reboot.

Along with contrast adjustment value, the clock calibration trimming value is also stored in the option bytes. The option bytes are loaded by the menu on boot. We'll get to the clock calibration trimming value in the next section of this blogpost.

There're only two option bytes in the microcontroller. The two 5-bit calibration trimming values takes 10 bits. That leaves 6 bits for contrast adjustment, which is good enough as the range of adjustment is from -10 to +2. Needless to say, some bitwise manipulation is required to put three different values into two option bytes. And this has been taken care of. :)

Software News: Clock Calibration "Game"

In most of the cases, the internal clock just works fine. According to the datasheet of STM32F030C6T6, the main clock (HSI) of the microcontroller typically has an error of ±5% at full temperature range (and ±1% at 25°C). This 5% of error often wouldn't be a major issue. If the game is running 5% slower or faster, it'd barely be noticeable. However, for things like asynchronous communication, particularly UART, 5% of error would be an major problem. We'd want to control the error to within 2% or so for reliable UART communication. For this reason, some clock calibration mechanism is required.

I've thought about including clock calibration mechanism in the game selection menu. However, it takes quite a bit of code size for clock calibration. For this reason, I made a "game" dedicated for performing clock calibration.

A 32.768kHz crystal soldered onto the device serves as a reference clock source for performing the calibration. This crystal is assumed to have almost no error, which actually is the case because the error we're looking at would be 0.01%-ish. With this clock source, the clock calibration "game" would be able to calibrate the clock by setting the trimming values (i.e. calibration value) of the main clock (HSI) and the ADC clock (HSI14) appropriately. After that, the game would measure the frequency of the low frequency internal clock (LSI) and show it on the screen, which isn't possible to get calibrated. Finally, the calibrated values are saved to the option bytes so that it'd be loaded by the game selection menu upon the game console is booted, which makes the calibration persists across power cycles.

Software Released!

The software of this game console had been released!

Software Release: Template Game

To facilitate development of new game for this game console, I've prepared a new game template! It's a skeleton code with simple structure that would be useful for most of the games. It includes code for graphical assets loading, input handling, clean screen, frame limiting and a simple game object management library.

The Github repository containing the template game for ilo musi can be found here

Software Release: Python Scripts

A few Python scripts were developed to facilitate working with custom music, graphic and ROM format of ilo musi.

The Github repository containing the Python scripts can be found here

Software Release: Bootloader and Game ROMs

The bootloader is the core of the game console. It contains the game menu and the system library of the game, which all game ROMs would depend on.

The Github repository containing the bootloader and game ROMs can be found here. Currently only the binary is released because there are probably still some bugs in the bootloader. The source code of the bootloader will be eventually made available.

Bad News - Project Development Suspended!

Since I'm done with freelancing, I've got two day job offers. To my surprise, the employment agreements of both companies have a clause saying that the copyright of all work I do while I'm employed would go to the company. The local law here say that the copyright of the stuffs that employees do during "course of employment" would go to the employer, and it'd go to the author otherwise. It means that I'd hold the copyright of hobbyist projects that I work outside work hours. But I'm not sure if the agreement would override the law.

For the existing work that I've done on this project, the copyright is definitely mine. To avoid legal dispute, the development of this game console had been suspended since I've got the day job. I'm trying to come up with an agreement on copyright arrangement of this project with my employer. My employer had verbally agreed that I'd hold the copyright of this project. But still, the paperwork isn't done yet. Hopefully everything would go thru.

In case of non-agreement on paperwork, I could just distribute this game console anyway. Despite that limitations stated above, this game console is currently perfectly playable. So it's possible to distribute it without any further copyrightable development work. Another way to do that is to hand over this project to someone else. Someone had expressed interest in hacking on this project. So I'd imagine it wouldn't be difficult to look for contributors. I could also look for a new job. But the friendly coworkers, awesome culture and decent compensation of the company are just too much for me to give up. And this kind of clause is probably more than common in employment agreements. So switching to another job may not help at all.

Meanwhile, I think I may look for legal consultation from professional lawyer on the actual copyright ownership of hobbyist projects. I know that I've signed the employment agreement. However, it wouldn't make sense if all the stuffs I make outside work hours would be copyrighted by the employer. That way I technically wouldn't even be able to post any text or photo or video to any blog or chatroom or social media without infringing the copyright of my employer. And that's just bullshit. What I really need to know is if the employment agreement would override the local copyright law. If it doesn't, I'd be all good to work on this project without any new agreement with my current employer.

Anyway, the non-copyrightable work of this project can go on without any problem, including some testing that doesn't generate copyrightable material, production efficiency research and distribution of this game console.

What's next?

I'll be continue working on this game console.

No copyrightable would be generated for these tasks. I can work on these straight away:

  • Test for flash write cycles
  • Look into more efficient production method
    • With an expected demand of 10~50 units, the production speed of a unit per two hours is just far too slow. And this amount of demand is too little for outsourcing the production to PCB assembly. I think I'll look into stencil-based SMD soldering technique so that I can do efficient production at home.
  • Distribute the device!
    • A distribution model similar to Ilo Nanpa will be adopted. It'll be a donation-based distribution model to cover the material and production cost. This distribution model is proven to be effective for small demand.

New copyrightable material would be generated for these tasks. I have to check for the copyright ownership of the stuffs that I work on before working on these, or I could ask someone else to do these for me:

  • Test for GPIO functionality
  • Revise PCB
  • Prepare for release of bootloader soure code
    • There are probably still some minor bugs and formatting issues to be fixxed
  • Maybe a hardware case for the game console
  • Perhaps also an emulator so that games developed for this game console can be run on browsers

I aim to get this project done by the end of this year (not including the emulator). Let's pray and hope the copyright crap would get resolved so that the development can resume. Stay tuned! :)


International Asynchronous Rock Paper Scissors Tournament 2019 is Around the Corner!

March 31, 2019, 12:44 p.m. RPS

Hey guys! As usual, we're going to have International Asynchronous Rock Paper Scissors Tournament on April Fool's day!

This year I've passed the host to ikatokai.com. And we've managed to get 9 supporting organizations around the world!

This event will be held from 2019-04-01 00:00:00 UTC to 2019-04-01 23:59:59 UTC. During any time of the event, hit the join button on ikatokai.com and fill in the web form. After that, wait for the end of the event and you'd be able to check the result!

Of course, we'll be issuing participation certificate to all of the participants! We've got 10 handsome logos stamped onto the certificate! It gotta be so honored to have your name written on it! Want it? Join the event and it's yours!


Global Game Jam 2019 Post Mortem - Best GGJ I've Ever had!

I've just done another Global Game Jam this year. It's my fourth time joining it. This one totally went unexpected. Originally I planned to join using the game console I'm developing. I ended up not using the game console and made music for the team. I also did a little bit programming. And it's the best Global Game Jam I've ever had!

A screenshot showing the playable

Here's the link to the playable, which takes forever to load.

And here's the source files of the music composition which you may be interested in. The .ptt files are Palette MCT files, and the .mmp is the LMMS source file. Please notice that the FluidR3_GM.sf2 SoundFont file is required for the .mmp file.

Pre-jam

Before the event, I thought that I'd take the 2019 Global Game Jam event as an opportunity to market the hardware portable game console that I'm developing. For this reason, here's what I've done:

  • Soldered 3 extra units of the game console. Originally I had 2. Now I've got 5.
  • Purchased two extra ST-link programmers for programming the game console. I had one. Now 3.
  • Prepared the game code template for the game console so that the team would get a head start.
  • Figured out how to install the cross-compiler, toolchain and debugging software on Windows for possible future teammates. Before that, I only knew how to do that on linux.
  • Enhanced the MIDI file conversion Python script. It converts MIDI file into a musical format that's supported by the game console
  • Prepared a couple of microSD cards along with microSD card to USB adapters. The game console doesn't work without a card.

It took me quite a while to prepare all these things. I got all these done before the day of the jam. Great. I'm all set. I'm ready for the jam. All I needed to do is to get someone to form a team with me! It could easily be done during pitching session. And I'd just give the game console devices and ST-link programmers to other team members for the game development! :D

By the way, I dragged a couple of random tourists that I just met in a local hackerspace a few days ago into the jam. I told them not to form a team with me. Mainly because they probably aren't interested in my game console.

First Day (25th Jan 2019)

Before I knew it, the day for me to market the game console had come... I was very excited about it. :)

First Day: Registration and Dinner

As usual, I joined the site without a team. I took the shuttle bus and arrived there. There was a loooooong queue for registration. The photo below is just, perhaps 1/6 of the entire queue. The queue was clearing very, very slow.

A photo showing a lot of people queuing for registration

It seemed to me that it'd take forever to get it cleared. So I decided not to take the queue and sit somewhere nearby and joined the queue after it's almost cleared. The queue took around 25 minutes to clear. That's not surprising considered that I was almost the last one in the queue and there was more than 400 jammers on the site. But still, I didn't enjoy the wait. :(

Right after the registration, surprise! There's another queue! Since I went to the site late, the dinner had long started and there's another long queue for all-you-can-eat dinner! It took me another 10 minutes to get the food. Since I'm late, I didn't get the food that I want. Luckily I still had enough to eat.

After fetching the foods, I found those two random tourists that I met a few days ago. They were chatting with a local while having dinner. Being too shy to chat with other strangers, I just joined them and chatted with them.

After the dinner, it was theme announcement. As usual, there's a lengthy welcome session and introduction video. It was announced that the theme was "What Home Means to You?"

First Day: Pitching, Team Forming and Brainstorming

During the pitching session, I was sitting on the same table with those two tourists and the local. I was observing to see if the game console would be any good to them. Well, seemed not. However, it seemed to me that everyone in the group were very friendly. They weren't like the teams that I've joined in the previous Global Game Jams at all! We're all the same. There isn't any hierarchy. What they're trying to do was to make good use of the skills of the members of the team. It was apparent to me that forming a team with them would make it an awesome game jam. So I decided not to use the game console and formed a team with them.

We discussed about the game idea, which is sort of like a simple RPG. We've sketched out our idea on a piece of paper. With the sketch, we discussed about our roles. We've got a programmer, 3D artist with programming skill, 2D artist and a jack of all trades (which's me). And we decided to have one of us to be a main programmer, one of us doing 3D art, one of us doing 2D art and I'd be doing music. Not because I'm good at it, that's because no one else in the team could do that. xD

One of the ideas we've come up with was very clever. We've talked about having multiple tracks of music. There'd be items on the map, and when the character get the item, a track of music would be played. So you'd get more and more musical instruments playing for each item you've picked. I was asked if that was possible for me to send them the tracks, and I answered yes. In fact, it's fairly easy. :) I just loved this idea. It made good use of my own skill as it isn't something that you could do for a game without an audio guy.

Similar thing happened to other team members. We've come up with ideas that'd make good use of all of our skills. It made each of us felt that our skills were well-respected and helpful! In fact, that's how come we had a game with both 2D and 3D graphic. :)

At the end of the day, I've launched Palette MCT the music composition tool. But I haven't started any real work. I went home and slept. As I had really bad experience with sleeping on-site, I'd never sleep on-site again. I didn't want to get sick for two whole weeks! Not again!

Second Day (26th Jan 2019)

This was the most interesting day of the event. Most of the work were performed in this day. I launched Palette MCT again and started working on composing the music.

Second Day: Coming up with the Chord Progression and Melody. A 12.8 Seconds Piece

There're two ways of composing music. The first way is to come up with chord progression first, then the melody. The second way is to do it the other way around. Personally, I love the music that's made melody-first. However, it'd take a lot of time for me to do that. So I decided to do the chord progression first.

The whole point of using Palette MCT is its chord progression function. It makes coming up with a nice chord progression super easy. Before knowing this software, I mainly did it by trial-and-error. This piece of software is able to filter out the chords that doesn't sound right. It saves me a lot of time!

I was wavering between composing a minor scale piece (the one that sounds sad) or a major scale one (the one that sounds happy). I decided to compose a minor one and settled with a common I-vi-V-I chord progression. Then I randomly came up with a melody. I composed a short 12.8 seconds piece.

A screenshot showing the user interface of Palette MCT

Don't get confused with the musical sheet in the interface. The whole point of using the software those tiny colored rectangles with T5/3, S5/3 and D5/3 on it. Those are chords! That's the main reason why I use this piece of software.

And here's the intermediate result:

Second Day: Enhancing the Intermediate Result of Palette MCT with LMMS

I exported the result from Palette MCT to LMMS and further worked on it. The imported piece contained only three tracks, they're melody, chord and the base of the chord. To make the music sound nice, I'd need to make a lot of variants of these tracks and assign them to appropriate sound synth (instrument).

After discussion with other team members, it was apparent to me that we'd need a lot of tracks. So I added a lot of them. In the end I've got 3 melody tracks, 3 arpeggio tracks, 3 chord tracks, 3 bass tracks and a few beat tracks.

I've developed a Python script to semi-automate the task of converting chord into arpeggio of arbitrary pattern. In musical sense, chord is defined as multiple notes being played at the same time. And arpeggio is just like chord, except that you're playing the chord notes one by one. For example, if you're playing C-E-G at the same time, that makes a chord. But if you play C, then E, then G, then E, then repeat, that'd be an arpeggio.

Arpeggio is a very common technique to add variety to the music composition. The problem I had was that the chord get changed once a while. When I'm trying to make an arpeggio out of the chord, I had to manually create the notes of the pattern according to the chord.

Here's how the script works. It accepts two tracks. The chord track and the template track. The chord track can be imported from Palette MCT. And I'd manually come up with the template track. That's easy, tho. I'd just make a small section of the pattern and do copy and paste. Here's an example. The top one is the chord, and the bottom one is the template. It shows three different chords being played over time.

A screenshot showing a Piano Roll in LMMS of Chord Track

A screenshot showing a Piano Roll in LMMS of Template Track

After running the script, this arpeggio track would be generated:

A screenshot showing a Piano Roll in LMMS of Resultant Arpeggio Track

Notice how the template pattern track had followed the chord. When there're a lot of chords, this tool saves me a lot of time. It also eliminates manual handling errors.

I didn't mention this script in the Global Game Jam blogpost last year. Anyway, this tool was developed before the last year's game jam. Somehow it's still useful in this year. :)

The sound synth (instruments) were chosen from the default presets, which was further modified manually until it sounded right to me. Then I just threw in the arpeggio notes or bass notes or melody notes or chord notes for each of the sound synth and that's it!

And now I've got a 12.8 seconds of loopable music! :)

Second Day: Extending the Music

Needless to say, 12.8 seconds is far too short. :(

So I repeated what I did. I composed another piece of chords and melody using Palette MCT again, and export it to LMMS for further processing and put it at the end of the original composition. Now I've doubled the music length to 25.6 seconds. Anyway, here's the intermediate product of Palette MCT for the second piece:

Up till this point, the composition was in minor scale. For the third piece, I was thinking if I should try adding a major scale piece into the composition. That'd make the composition contains both minor scale part and major scale part. I've never done that before. And it seemed to me that that could be interesting. And I've already got 25.6 seconds. In case it doesn't sound right, I'd just scape the major part and keep the 25.6 seconds minor part. That's still good enough.

So here it goes. I repeated what I did, except that this time I composed a new 12.8 seconds piece in major scale instead of minor scale. Here's the intermediate product:

I further processed this third piece with LMMS. Then I put this part into the beginning of the composition. To my surprise, it actually sounded pretty good. Now I've got 38.4 seconds of music. :) The next step was to remaster it.

Second Day: Remastering

At this time, the music was mostly ready. I just needed to remaster it to make it sounds even better! One of the keys of making a piece of music sound nice is to make its tracks more diverse. I did three things.

The first thing I did was to reduce the volume of part of some of the tracks.

A screenshot showing a the Sequencer in LMMS with a few tracks having low volume

Please notice that the middle part hasn't got any track with volume reduced. That's because it's the climax of the music.

The second thing I did was that I built something that I'd call "alternative melody". I've no idea on the proper musical terminology for this thing. It's basically a variant of the original melody that's played at the same time as the original one. Here's how I did it:

A screenshot showing a the Sequencer in LMMS with a few tracks having alternative melody

As shown above, at each instance of time, there're always two variants of melody being played. Two of the tracks are the main melody, with one of the tracks using an alternative melody. Since variety is crucial, I spread the alternative melody into three different tracks depending on the time of the music being played.

The third thing I did was that, I put in a reverb effect to the entire composition. It'd produce an illusion that the music is played from a different environment, like the size of the room, the audio-reflection property of the wall, etc.

And here's the final result with all tracks combined!

Second Day: Exporting the Tracks for the Programmer

Now I've got the music ready. All I needed to do is to send the tracks to the programmer.

After discussion with the programmer, it's decided that the preferred amount of tracks is 7.

I'd have to make the tracks in a way that it'd loop seamlessly. It was dead simple. Here's how I did that. First, I exported the track. Then I take note of the time it takes for the music to wrap to the beginning.

A screenshot of LMMS showing the wrap time is 38.4 seconds

According to LMMS, the wrap time is 38.4 seconds. It means that the last note is released at 38.4 second. Since the instrument sound doesn't stop immediately after the note is released, some special handling is needed to make the music seamless. Therefore, I used Audacity to do this:

A screenshot of Audacity showing the part after 38.4 seconds is highlighted

What I did was to cut the part after 38.4 seconds and move it to the front as a new track. Then I mixed the original track and the new track and there we have a piece of seamless audio! :)

But hey... There're 7 tracks. Of course I'm not going to do that manually! So I've made a shell script to automate the process with SoX instead of Audacity. It worked like a charm!

Then I converted the tracks to MP3 format using shell script. And I stumbled into a problem. Due to the nature of MP3 format, there's always a split second right at the beginning of the audio that no sound is being played, which would make it impossible to make seamless audio with MP3!

After discussing with the programmer, we've found that OGG is the go-to format instead of MP3. So we used OGG instead of MP3.

I sent the programmer the 7 OGG tracks, and my mission had been accomplished! And I went home.

And I was very glad that my teammates were happy with my music. I was also very happy with the artwork of the 2D and 3D artists. Of course, the program was also working great. :)

Second Day: Funny Event of The Day: Running out of Water

By the way, something rather funny happened during this day. The site we've joined was in Cyberport. During some time of this day, a staff of the jam site stood on the stage and announced this in English: "Hey guys. We've got a bad news. We've used up all of the water in Cyberport." It wasn't very funny until he repeated that in Cantonese. "成個數碼港D水俾我地飲哂喇!", which roughly translates to "All of the water in the entire Cyberport was completely drunk by us! Oh noes!" That's when everyone in the room were laughing. Those who couldn't speak Cantonese were confused about what's so funny.

We were told to purchase the water from a supermarket nearby. So we did that. Then we had dinner at a restaurant. When we came back and we noticed that there was still some water. Well, we had no idea on where they managed to get the water. Had we known this, we wouldn't have purchased the water.

Third Day (27th Jan 2019)

This day was rather relaxing. All of my stuffs were done. The 2D artist was working on the video. And apparently, the 3D artist were working on graphic and probably also a bit of programming. I didn't asked about the exact split of work, tho.

Third Day: Polishing the Game: Character Movement (Bad Idea)

Since I've got nothing better to do on the music, I decided to help on the programming. I polished the character movement. The original character movement relied on the system keypress. That isn't a good idea because the movement speed of the character would depend on the system keyboard configuration. If the repeat key interval is set to short, the character would move faster.

As I thought that the main programmer had nothing to do, I did the fix and showed it to her. It seems that there're some issues with the character sprite cycle. So we decided not to make the change.

Later I'd noticed that the main programmer were still working. She was working on the crystal collection counter. I felt bad for disturbing her while she was working on something far more important than character movement.

Third Day: Polishing the Game: Adding Dialog Boxes (Good Idea)

As the 3D artist and the main programmer are tourists, they'd like to stroll nearby. And they were away. However, there was still a little bit of time left. I asked if there's anything I could still do, and I found that the dialog boxes at the beginning of the game and the end of the game weren't implemented.

I asked if the code on the github repo were the latest one with instant messenger and asked if they're ok with me to implement the dialog boxes. I got a green light and I started working. That was an easy one. I pushed it to repo and they deployed it and that's it.

So we've got a working game with in-game objective (collect crystals) and an ending (a couple of dialog boxes). The game isn't particularly fun to play. But still, it looked real good. And the music's also a nice one (self-flattering.pdf)! The trailer looked good too.

Third Day: Presentation Session

As usual, there's a lengthy trailer-watching session for the jam. Each of us have a minute in maximum. Somehow there aren't as much funny vid this year compared with previous years.

And I've found a game that's about bird pooping on people during the session. That totally reminded me of my Poopie game. :D

After the session, each jammers were allowed to cast a vote. One of our team members had voted for our own game. Too bad! We failed to get the most votes. All of our team members should have voted for our own one! :P

Post-jam

This one is literally the best Global Game Jam I've ever had. It's just wonderful. It isn't like any Global Game Jam I've ever had before! Let's have a review of what the previous game jams were like to me:

Flashbacks of My Previous Global Game Jams

Flashback: My First Global Game Jam: 2016

For the first year, I joined the jam without a team. I expected that my skill would be put well-utilized. I even prepared by practicing using a game development library. It didn't end up to be of any use at all. It was a big team with multiple "game designers". I was rather pissed off of being forced to use a library that none of the team members was familiar with. The funny thing was that this thing was decided by a game designer. I was like "hey! Choice of library is none of your business". First mistake: I should have left the team right after that decision.

And I decided to sleep on-site to get the full experience of the game jam. Before the jam, I've asked those random internet people who had joined Global Game Jam. I was told that it's alright to sleep on site. It turned out that it just didn't work to me. I couldn't get asleep. Funny enough, I somehow decided to sleep on the site for the second night even I failed to get asleep at the first night! I shouldn't have done that at all! Second mistake: Decided to sleep on the site.

Since I couldn't sleep well, I couldn't make much contribution to the team either. I was exhausted.

Result? A broken game with 2-week of illness taking away my entire Chinese new year vacation! I'd call it a FUBAR! :(

Here's a link to my blogpost of Global Game Jam 2016 which you probably aren't interested in. There's a lot of grammar mistakes because I was sick by the time I wrote that blogpost.

Flashback: My Second Global Game Jam: 2017

Compared with the first one, this one was a fun one. It's nowhere as fun as the one of this year, tho. I joined the jam with a purpose. So I decided to jam alone. In fact, I pretty much had to because the jam was a part of my graduation thesis of an independent project. If I had a team, the college may take it that I'm not working on the independent project by myself. That'd be a problem. :(

I managed to complete the game. It's a game that's playable by dialing a phone number. It's possibly the first of this kind in Global Game Jam around the world. Despite that the technology used is rather advance, like utilizing text-to-speech and having a hardware device, the end result wasn't that good. The sound synth was simply too bad. I should have recorded the audio clips with my voice instead of using text-to-speech.

Anyway, I was happy enough because I got the game completed. :) But I did feel a bit lonely. :(

Here's a link to my blogpost of Global Game Jam 2017 which you probably aren't interested in.

Flashback: My Third Global Game Jam: 2018

(If you're the producer of the game "Carpe diem" in Global Game Jam 2018, I hope that you'd never read this. This section is probably super cringy to you. I'm sorry.)

This is my first game jam that I had joined a team without screwing up. I was the musical guy of the team.

The main problem I had with this game jam was that there's an idea person who basically did almost nothing productive other than quality control. Most of the time he was just surfing the net with his laptop and his smartphone at the same time! If I remember correctly, he also had a tablet. I've never seen anyone being able to do this level of multitasking before. Anyway, in some other times, he was looking for information about making an awesome game or making an awesome trailer.

Apparently, the team members of the team I joined were from the same company. I was the only outsider. I'd imagine that the idea person would be in a superior position in the company that he was working for.

I spent quite a bit amount of work on a piece of music. I showed it to him and he just rejected it straight away and provided some not-so-helpful instruction. This was the thing that I had problem with. Here's what I thought: "Hey! You did nothing. How come you'd criticize my work? You're worse off." Of course I didn't spout that out! I redid the music and sent him another piece of music anyway. It seemed to me that he still wasn't satisfied. But he compromised and said that it was ok. Well, I guess that's good.

Right before the jam ended, we were filling in the project page on the Global Game Jam website. Surprise! The title that the idea person was getting was "Producer". It's very laughable. If I don't laugh, I'd cry! xD

Anyway, we still managed to complete the game, sort of. I only got to play the game after the jam. It sucked. :P

By the way, I've chatted with a parallel team right before the end of the jam. Apparently their team doesn't have a quality control person nor an idea person at all!

Here's a link to my blogpost of Global Game Jam 2018 which you probably aren't interested in.

This Global Game Jam: 2019

After reading the flashbacks, now you understand why this Global Game Jam is the best one that I've had!

I didn't jam alone. There's no "team leader" nor "producer" nor "director" nor "quality control" guys in the team. We don't have any quality standard for the game. We just put in whatever we've got and contributed to the team. We just took whatever available from other team members. Every team member didn't really care about the art style nor music style nor we'd judge the programming framework or technique used. That made the game jam really, really awesome. After this jam, I think this is really how a game jam meant to be. I guess the guy in parallel team I've chatted with last year was having a similar awesome experience as I have this year. Perhaps I was just being extremely unlucky that I joined wrong teams for years that made me unable to enjoy the jam to the fullest!

Here, I'd like to take the chance to thanks all of the team members. Thank you very much for making this jam the best one in my life, ever! You guys are awesome. And here's a list of the team members:

  • Jintii - The 2D artist. A local people.
  • Kirill - The 3D artist. Apparently he also did a bit of programming. One of the two "random tourists".
  • Sneha - The main programmer. One of the two "random tourists".
  • (me - The music composer. Also did a bit of programming)

You can find the website of Kirill and Sneha here on Codercat.tk, which contains a lot of awesome web-based projects! Most of their projects are utilizing WebGL. Even the playable of this game jam is hosted on this site. Do check out their website!

Also, do follow @_jintii on twitter! She's real good at drawing 2D arts, especially in anime art style! nya~ :3

What Went Well

  • Joined an amazing team.
  • Composed my first piece of music that's using both major and minor scale.
  • Skills of every team members were well-utilized.

What Went Wrong

What Went Wrong: Me no Speak English

As of the time of writing, despite that I can write English pretty well, my spoken English is only conversational. I'm very well aware of this problem since forever ago. And those random tourists in the team I joined couldn't speak Cantonese. I had no choice but to speak English! >_<

My spoken English is good enough for project communication, not smoothly, tho. Anyway, I'm glad that I started watching anime daily in English dub since about a year ago (I watched it in sub before that). My spoken English had went from almost-non-working to semi-working. But I still need to further up it somehow. That'll take quite a bit of time. Oh well, let's wait and see.

What Went Wrong: Electronic Waste Disaster!

Uh oh. So what about the game console...? Now I've got 5 units of assembled game consoles and three ST-Link programmers laying around:

A photo showing 5 game consoles with 3 ST-Link programmers

(Yes, we've now got PCB for the game console since like a few months ago. I still haven't got the time to blog about this update)

Oh well. Now I've got a problem. What to do with all these game consoles?

I guess I'll save two units and a programmer for myself. And I promised to send a unit with a programmer to someone in India. That'd get rid of 3 units and a couple of ST-Link programmers.

And I've still got two units and a programmer to go. I don't know. Perhaps I could do a giveaway. Maybe I could give them to Ludum Dare participants so that they can make games with this game console.

In fact, thanks to the judges of the sponsors appreciating the art style, each of our team members had managed to obtain an extra unit of electronic waste. It's a Google Home Mini. I think the artists (Jintii and Kirill) deserve the most credit for this one. And the main programmer (Sneha) also deserves quite a bit of credit because she made the game functional. And I, uhm, I just got the Google Home Mini anyway. xD I'm pretty sure that this thingie would still get awarded if they were using random music found in the internet instead of using mine. :P

At least I have some idea on how to handle the game console units. As for the Google Home Mini, it really beats me. I thought about selling it. But it seems that it's only worth like $30~40. It makes this option not very attractive. It isn't very useful to me either. I've absolutely have no idea on what to do with it at all. Oh well, I guess that's "what home means to me". It's an electronic junkyard. :/

Note to Future Self

  • Never join a team that has a project manager or team leader or quality control guy. It destroys the whole game jam experience!!
  • Be open-minded. Don't join with an existing idea (e.g. using an obscure game console). It ruins the fun.
  • Try out other jam sites! The Macau one is a good start. Well, I have been saying that for 3 years. And I never did that. :P

Note to Idea People or Quality Control People

Please do not join game jams just to criticize works of other team members. We aren't paid to work on the game. If you intend to join a jam and do that to us, I guess you better not to join or you'll be hated. Don't get me wrong, your talent could be much better utilized in corporate world. Your skill could be used for making a lot of money for the company that you're working for. But if you don't have any technical skill and nitpick stuffs that other team members come up with, frankly, game jam really isn't for you.