Blog
Boehm system lite in EWI (WIP)
The Boehm system is universal in woodwind instruments, however, there is something with the arrangement of the keys that makes certain scales harder than others. For example, an alto saxophone is easiest on Eb, Bb; easier on C, F; however there will be connection that's very non-intuitive linked notes for other scales.
I haven't played Oboe/Clarinet, but talking with people who plays many wood-wind instrument, they pretty much all follows the Boehm system.
This is the Saxophone keys:
Flute key chart
There already exist this clever design of eg the flute Thumb key (B/Bb) depending on which half circle you press on. The Bb key mechanically press the B to close both hole, but B key only close higher hole. So you have a half note shift for different scale depending on where you finger is sitting, instead of relying on simutaniously press of another key usually using Pinky finger, or an awkward same hand finger switch (which is bad for linked note -which means no tonguing to seperate two notes) like the index finger/middle finger switch on both hand. This is same for saxophone, in saxophone there is also the lefthand index finger key, if you move the finger resting position from the main circle to small circle, the resting position will lower the same fingering closed position half note, accomodating the corespondent scale change.
Current EWI keys
The thumb key have changed to have more octaves when you touch on different positions, which makes it the widest range in all wind iinstrument. However, the keys even in "Easy mode transpose", they did it in software setting which makes it hard to do it on the fly.
Explaination:
- Removed confusing element like K02
- Removed K05, K07, and made K06 a single function key, an on-the-fly sharp # (where the piece didn't transpose, but want an out of scale note)
- Kept K11,K12,K13 to lower range extender without need to switch octave
- Added an auxilary position onto every main key, depending on where the finger sits, it will press both mainkey/auxkey or only the main key, which result in a half note difference. So depending on the scale, fingers can sit at different position to avoid the need of constant assist of awkward position keys.
- The K09 K08 natural half-note can be kept to accomodate the traditional habit, same for K08's lowering K01 half note (But not necessarily good to keep)
Without testing, the first problem I will foresee is that it made it actually harder for absolute beginners. There will not be a very clear fingering chart for every note, each note will probably have 3~4 fingerings.
Second problem is that the habit learned using this system can not be transferred back to traditional instrument.
However the obvious pro is that if there's transpose, the fingering can just do a small shift and use all natural fingering in scale. My speculation is it will be quite easier for intermediate to play different scales. (So it fits neither beginner nor master)
It's an attempt similar to the janko keyboard, which never beat the tradition.
How to test for now
- Can use some mechanism to touch the touch screen
- However, most current system can only have 10 touch points, will need to be clever all those auxilary keys how they trigger the touch points (As they will mechanically also press the main key).
- The pro of this method is that the microphone of the phone can be used to capture the blowing
- Also can have a separate arduino to have a lot of keys to feed signals from USB port (Probably a better way to start
Minecraft Fill size Limit
Reference: https://www.youtube.com/watch?v=uAb_RldOor8
- Code: this replaces the 145 x 145 from y5 to y100, ~ means relative
/fill ~ ~ ~ ~145 ~ ~145 command_block{Command:"/fill ~ 5 ~ ~ 100 ~ grass replace",auto:1b} replace - Idea is replace with command block then each commandblock do its column which is well within the limit of 32768 blocks
- Doing too much will be slow, but the job will be done
- To leave other blocks, the outside replace can be replace x (eg: replace water / replace air)
/fill ~ ~ ~ ~145 ~ ~145 command_block{Command:"/fill ~ 5 ~ ~ 100 ~ grass replace",auto:1b} replace water - Replacing with grass block will end up getting destroyed, do not know if it is a bug or feature.
Liquid-Phase Exfoliation
Seems the two ways to produce graphene that can be done in kitchens are tape and Liquid-Phase Exfoliation.
- Tape method is very slow, probably can not produce enough to be useful
- Liquid-Phase Exfoliation can be done in kitchen, but will need a lot of equipment and safety measures
- Source
- Exfoliated graphite
- Solvent
- 40% alcholol in water
- nmp
- 90% ethyl acetate 10% methanol (sabesto cleaner)
- Source
VPS slow VNC console performance
- VPS problem:
- Can't run sudo, terminal slow
- Tried rebooting vps, changing network
- Maybe need to change cloud to local and run vps as a jumpboard
- Problem seems to be one of the Docker container is "robbing" the VNC command line port.
Terraria Mods, technical explorations 02
Existing big mods:
- Throrium
- Calamity
- Quite a few famous ones: https://terraria.gamepedia.com/Mods
Seems right now my intention to pay tribute to other games isn't clashing with other famous mods.
Also seems prominent mods aren't open source as I would understand they want to have some control and not having copy all over the place.
https://github.com/tModLoader/tModLoader/wiki/Advanced-Vanilla-Code-Adaption For vanilla override, need to do this.
Softether on OpenWRT Trick
Reason that softether on OpenWRT lose settings on reboot is because it only saves config after stopping the service, so need to tunnel in and stop the service then reboot after reconfigure
Remember to set Virtual NAT+DHCP, or else windows client autodrop.
Update: The NAT+DHCP doesn't have to be on softether, create a tap device and use the host as NAT+DHCP is possible. Setting isolation mode in Softether will block host from forwarding packets.
Meaning:
- Reverst VPN is possible
- Have one server connect in and DSTNAT is possible
- Static DHCP through OpenWRT also possible which is good as SoftEther's DHCP can't do static, which is bad for servers
- IPv4 Address. . . . . . . . . . . : 192.168.X.X
Subnet Mask . . . . . . . . . . . : 255.255.255.255
Default Gateway . . . . . . . . . : 0.0.0.0
Seems to be bacause how windows implemented, the DHCP server still performs normally ( has 255.255.x.x and a proper gateway )
Weird behaviour:
- Having Router(Mikrotik) connect to the Softether and device connected to the Router also connect to Softether
- The session list in softether seems OK
- However, the tap device will confuse one of the device under the router with router itself, so DHCP will have some problem (how to solve?)
- Workaround will be using a machine under the router to connect to the Softether to reverse VPN
Additional setup:
- As routerOS still doesn't support advanced encryption of handshaking on SSTP, will open legacy L2TP just for routers.
Prepare For IPv6
As the device number grow, the infrastructure will eventually transition to IPv6, so it's good to prepare server to IPv6.
- First step is actually to add IPv6 to DNS server
- Iptable and rule needs to change for host VPS
- Set the NGINX to be compatible with IPv6
- Every docker container does have a IPv6 address, however there it might not just work
Note for POLYUCS Edison Traffic Light
- Download package:
- Makes use of FreeWiFi via POLYU (with a workaround)
- Makes use of mqtt.eclipse.org
- Announce topic: POLYUCS/esp8266/shared/pub (will have start msg and ping msg)
- Config topic: POLYUCS/esp8266/devices/ESP8266Client-bcddc22df583/pub
- If switch device should then be : POLYUCS/esp8266/devices/<device-id>/pub
- Worked on top of Clifford Choy's implementation
- Commands and example:
- Set sequence timer, in ms, d[green, greenblink, yellow, red]:
{
"c": "setTime",
"d": [5000,5000,5000,5000]
} - Set blink on off time, in ms, d[ontime, offtime]:
{
"c": "setBlink",
"d": [500,200]
} - Set brightness, d:0..255
{
"c": "setBrt",
"d": 128
} - Reboot, d:<a number hardcoded>
{
"c": "reboot",
"d": 1234
}
- Set sequence timer, in ms, d[green, greenblink, yellow, red]:
- To change Defaults (Starting from Line405):
int brt = 255;
const unsigned long max_seq_time[] = {120000, 60000, 60000, 120000}; // for now not allowing more than 2 minutes
unsigned long seq_time[] = {20000, 5000, 4000, 25000}; // default green, blink, yellow, red
unsigned long blink_time[] = {400, 200}; - MQTTBox settings:
Terraria Mods, technical explorations 01
- The tModLoader ships with Terraria, so it means now it updates automatically with steam
- Need to look out for API changes
- TModLoader all classes
- Useful vanilla fields
- I don't get why the document isn't with TModLoader APIs (even appendix)
- Vanilla sound IDs
- Examplemod somehow has an Error in ExampleCritter.cs, so had to download the source and recompile, rightnow muted the autoupdate override of the item, however still can't findout where the out of index comes from, error message stack trace:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at ExampleMod.NPCs.ExampleCritterNPC.HookStatue(ILContext il) in ExampleMod\NPCs\ExampleCritter.cs:line 0
at MonoMod.Cil.ILContext.Invoke(Manipulator manip)
at MonoMod.RuntimeDetour.ILHook.Context.InvokeManipulator(MethodDefinition def, Manipulator cb)
at MonoMod.RuntimeDetour.ILHook.Context.Refresh()
at MonoMod.RuntimeDetour.ILHook.Apply()
at MonoMod.RuntimeDetour.ILHook..ctor(MethodBase from, Manipulator manipulator, ILHookConfig& config)
at MonoMod.RuntimeDetour.HookGen.HookEndpoint._NewILHook(MethodBase from, Manipulator to)
at MonoMod.RuntimeDetour.HookGen.HookEndpoint._Add[TDelegate](Func`3 gen, TDelegate hookDelegate)
at MonoMod.RuntimeDetour.HookGen.HookEndpoint.Modify(Delegate hookDelegate)
at MonoMod.RuntimeDetour.HookGen.HookEndpointManager.Modify(MethodBase method, Delegate callback)
at IL.Terraria.Wiring.add_HitWireSingle(Manipulator )
at ExampleMod.NPCs.ExampleCritterNPC.Autoload(String& name) in ExampleMod\NPCs\ExampleCritter.cs:line 19
at Terraria.ModLoader.Mod.AutoloadNPC(Type type)
at Terraria.ModLoader.Mod.Autoload()
at Terraria.ModLoader.ModContent.<>c.<Load>b__38_0(Mod mod)
at Terraria.ModLoader.ModContent.LoadModContent(CancellationToken token, Action`1 loadAction)
at Terraria.ModLoader.ModContent.Load(CancellationToken token)
at Terraria.ModLoader.ModLoader.Load(CancellationToken token) - Seems no one else raises the issue on the issue page?
- Need to pay follow the updates
- Study on the example item:
- The item sound seems inconsistant between when classify as weapon and when classify as connsumable(like potion), same sound id gives different sound, but managable, just need trial and error
- Item will not be able to be consumed unless overriding UseItem and return true:public override bool UseItem(Player player){
return true;
}- Also , can have UseItem(Item item, Player player)
- Player according to the vanilla field can not set currentHP, so there's probably no way to directly self-inflict damage
- However, it might be possible to spawn an enemy projectile that does the damage and change world state
- Did not find any world state extention method, but seems possible as vanilla has world fields, need to find how to extend them
- Study on ExampleMod:
- Chasing projectile possible, look at the wisp example.
- Custom properties with mount might be possible
- The example mount car has 3 balloons that can be damaged when player take damage, also in comment, syncing modplayer can even have functional use
- Same reason, the mounted mg like metal-slug style might be achievable
- Tilting with terrain seems not possible, it loads static spritesheet from <mount>_Back.png and <mount>_Front.png
Android Manifest Versioning
- Version code is always interger
- So it should be a good practice if start with 100 for having subversions
- General rule, larger number the recent
- The version to show is the "name" field of the version
- Rolling out new release still takes a week for google play to review
- Correction: update takes less time than new review, the 1.01 took around 1 day