Lemuroid 1.8.0 with MelonDS and MAME2003-Plus

Hello fellow readers,

To celebrate the first year of Lemuroid, I’ve published a new version with two major features: improved Nintendo DS emulation (with MelonDS) and MAME 0.78 support (with MAME2003Plus).

For almost a year we survived using DeSmuME, but now that MelonDS has made some huge steps forward with version 0.9, including a dynamic recompiler for 64bit CPUs and many optimizations, it’s time for some changes.

I submitted a few patches to fix the Android port, added some firmware emulation options, and integrated the Drastic open-source BIOSes. Add a few of bug-fixes on top and stir for a month of tests and you’ll get a Nintendo DS emulator that is twice as fast.

We really need to thank Arisotura and her team. They worked very hard on the project, but we can finally enjoy a great open-source DS emulator on Android.

Some of my patches are still waiting for an upstream approval, but rest assured, as soon as these are merged you’ll be able to reap the benefits also in RetroArch.

The integration of MAME2003 Plus was a lot more straightforward, requiring only some slight changes to LibretroDroid.

Since we’re talking about big news: Lemuroid is also available on F-Droid. It’s a special version deprived of every Google library, which also downloads cores on demand.

Here you can find a complete changelog of Lemuroid 1.8.0:

  • New Nintendo DS core (MelonDS)
    • ~2x the performances of DeSmuME
    • Saves and States are not compatible with DeSmuME
    • Enable it from Settings -> Change Cores -> MelonDS
  • Add support for MAME2003 Plus core
    • Support MAME 0.78 romsets
    • Use full non-merged ROMs for auto-detection
  • Redesigned game menu Improved
  • Improved touch controls customization experience
  • Improved Arcade and MD/Genesis gamepad layouts
  • Fix possible crash when saving/loading games (thanks you Nicholas)
  • Fix directory scanning on Chromecast with Google TV (thank you vicviper74)
  • Many more tiny changes

As always, huge thanks to all the people who are supporting Lemuroid through tests, feedbacks or donations.

Enjoy!

Lemuroid 1.7.1 with fast-forward and quality

This last month I’ve been very busy drafting the release of 1.7.0, and later 1.7.1 for bonus bug fixing.

The biggest work went towards redesigning audio, which now runs on a separate thread and reduces glitches by imperceptibly accelerating and decelerating playback speed. This can’t make up for weak hardware running modern consoles, but it surely improves one of the biggest issues affecting Lemuroid. I’ll probably write a separate blog post about this. It was a very interesting and challenging problem.

The second most important change is fast-forward support. The most requested feature is here, and you can finally farm at double speed.

Something else happened in this release. It’s the first time Lemuroid (and LibretroDroid) received non-trivial external contributions, so a big thank you goes to Roberto and Tyler for their efforts.

And now for dessert, a lengthy changelog:

  • Add fast-forward option
  • Add mute option
  • Reimplemented audio from scratch to be more robust to glitches
  • Fix potential crash when loading PSP games
  • Fix screen flickering with some PSP games
  • Fix crash while playing Drill Dozer on GBA
  • Change n64 resolution to the original 320x240
  • Exposed dynamic recompiler option for PSX (Enable it for better performances)
  • Updated games database
  • Fix issues with some PSP games running too fast
  • Fix missing trigger events with some gamepads
  • Fix missing gamepads events in some scenarios
  • Fix wrong aspect ratio with Genesis games
  • Improved error handling with clearer messages
  • Small fixes and improvements

A big thank you to the people who are supporting Lemuroid with code, donations, and testing. You’ve been amazing.

Enjoy!

Lemuroid 1.6.0 with many improvements

Finally! I’m very happy to announce Lemuroid 1.6.0, with nothing particularly shiny but many many quality of life improvement, especially for PSX and Android TV:

  • Added support for chd and cue/bin format (PSX)
  • Added support for multi-disk games with m3u playlists (PSX)
  • Added support for favorites on Android TV
  • Improved LCD filter which now looks sharper
  • Allow changing display filter (Smooth, Sharp, LCD or CRT)
  • Improved scanning performances (on my directory it’s around 3 times faster)
  • Cores are now bundled within the application (read afterwards for details)
  • Many small tweaks and improvements

You’ll find the update on Google Play or Github.

A lot of work went into the scanner, which is now able to handle bin/cue files and m3u playlists for multi-disk games. This should make the majority of PSX ROMs compatible with Lemuroid.

Another heavily requested feature by the community was a sharper image filtering. The default bilinear filtering doesn’t always look good, especially on TVs when using the LCD shader. The nearest neighbour filtering has its own set of issues when scaling by non integer factors, causing inconsistent pixel sizes throughout the image. The best solution I found is a sharper bilinear filtering by sampling pixels in a smarter way. Try it out and let me know what you think!

Why are cores now bundled within Lemuroid? Because Google Play blocked updates for Retroarch for downloading untrusted executable code. Lemuroid did the same and it’s a real security concern, so after a few failed attempts with Dynamic Features, I decided to bundle cores with Lemuroid. This increased the download size from 6Mb to around 25Mb but should make it compliant.

And that’s all the news this month, excluding that Lemuroid was removed and reinstantiated on Google Play for an mysterious policy violation, the hacker attack to the Libretro servers and the guy who tried to sell GBA games using a Lemuroid clone.

Yeah. It was a quiet month…

If you are enjoying Lemuroid and appreciating my work, you can support my endeavours here.

Cheers!

Lemuroid 1.5.0 brand new touch controls

layouts

This post is going to be a little bit longer and technical than usual, so if you want to take a shortcut, here’s the kicker: Lemuroid 1.5.0 is out with completely new touch controls!

You’re free to go, but if you want to know how we got there, sit tight!

This journey starts back in September 2019, when I thought it was a good idea to implement each virtual key as a separate Android View. Android was managing touch events for me and everything just worked… Kind of.

After a few months the first issues started to surface. Some people were complaining about missing touches or improper multi-touch handling while others wanted some form of customization. Adding new consoles was also becoming a bit of a chore, with many similar but different xml layouts and Kotlin classes.

It was time to go back to the blackboard.

After a few days of thinking and prototyping I decided to design everything around a simple principle: putting primary controls directly under your thumb, and secondary controls radially around them. The implementation was done by drawing everything inside a single Android View on an accelerated Canvas and manually managing touch events.

This had its own set of challenges such as optimal positioning and sizing, and making sense of touch inputs, but in the end, I’m quite proud of the result.

So what can you expect from these new touch controls?

  • They are automatically sized to optimize the available space
  • Touch targets are much bigger and no longer related to the draw area
  • They can be customized in size and vertical position
  • The most complex layouts (n64, psx, psp…) can rotate up to 45 degrees, making them more comfortable at the expense of screen estate
  • Multitouch works as you’d expect
  • It is possible to slide your finger from one control to another (while thumbsticks and d-pads still lock on your finger)
  • The diagonal in d-pad now has a smaller activation area
  • You can press thumbsticks in the PlayStation layout by double tapping and holding
  • Tilt to Stick can be activated with a triple tap on any Stick

As before, the game pad View is split in the middle to accommodate both portrait and landscape orientations.

Everything was developed with Lemuroid in mind, but I decided to publish it as a separate Android library which you can integrate into your emulator, game or app. Say hello to RadialGamePad!

Another big news for today, if you wish to support the continuing development of this project, I launched my very own Patreon page.

Feel free to take the new controls out for a spin and let me know what you think!

Lemuroid 1.3.0 and tilt support

In the last few weeks I’ve come to realize a very hard truth: two thumbs are sometimes not enough to play games on a touchscreen. The first attempts to artificially manipulate my genome failed, so I decided to opt for a different strategy: leveraging hardware sensors.

This sounds nice on paper, but the real challenge is defining a good UX which solves all the usability problem sensors have (many implementations out there fail here).

  • How do we make sure sensors are both accurate and fast?
  • How do we guarantee they are used only when actually needed?
  • Which retro control are we going map to sensors?
  • How do we determine a good rest position?
  • How can we avoid forcing the user into an uncomfortable position to please the gyroscope?

Luckily Google answers the first question with virtual sensors (TYPE_GAME_ROTATION_VECTOR), providing a nice fusion algorithm on data coming from accelerometer and gyroscope, with great results on a modern device.

Users are given complete control, they can just enable it by double tapping on an analog stick which will start moving on its own following the device tilt. The rest position is computed from the first measurements and the difference with the following ones is used to drive motion.

To disable sensors, a single tap on the active stick is enough and it will go back to being a simple touch control. You can now lie on the couch and start again.

With just a bit of practice I found the accuracy of the inputs methods comparable, but with a bonus finger at your disposal and maybe a bit more of fun! You can check the video if you don’t believe my words.

This feature is already available in Lemuroid 1.3.0 (out on GooglePlay) along with improved layouts for every console. Try it out and feel free to let me know what you think!

Ok, this is great, but what about $FEATURE? A sneak peek: Lemuroid 1.4.0 is in beta with game pad bindings and external PlayStation BIOS support.

Cheers!