pouët.net

Go to bottom
attack of the mutant boxes für elise by Fit [web]
[nfo]
screenshot added by yzi on 2019-08-04 01:19:44
platform :
type :
release date : august 2019
release party : Assembly 2019
compo : pc 1k
ranked : 10th
  • rulez 10
  • is ok 0
  • sucks 0
popularity : 43%
 43%
  • rulez 1.00
alltime top: #22310
  • yzi yzi [code, music]
added on the 2019-08-04 01:19:44 by yzi yzi

popularity helper

increase the popularity of this prod by spreading this URL:

or via: facebook twitter pinterest tumblr

comments

advanced music
rulez added on the 2019-08-04 02:10:48 by noby noby
i unironically really like this harmonization of fur elise and would play this with my band
i just wish it wasn't midi
oh yeah and also the effect is pretty
rulez added on the 2019-08-04 19:55:44 by name1856 name1856
MIDIcore
rulez added on the 2019-08-04 20:12:47 by cce cce
Elise war bestimmt voll die Granate.
rulez added on the 2019-08-04 20:56:48 by Sir Sir
Here's a stripped down untested semi-commented version of the music code used in this 1k intro. Use NASM.

Code: ; "MOOD:DOOM" by Yzi ; Music code from "Attack of the Mutant Boxes für Elise" 1k intro shown at Assembly 2019. ; This code is one of my experiments for structuring General MIDI music playback/generation ; for good compression in a Windows 1k intro using the Crinkler compressing linker. ; <---- here you would have your "extern" statements for Windows API functions ----> ; ... section .data_musa data align=1 ; The midiout_handle variable is actually placed inside a DEVMODE struct to save space ; in the actual 1k intro, but shown like this in the music source code example. midiout_handle: db 0x00, 0x00, 0x00, 0x00 ; These defines were used for trying out different ways to place the frame counter %define FRAMECOUNT_DWORD ebp %define FRAMECOUNT_BYTE ebp ; *** MIDI status bytes cheat sheet *** ; 0x0000xxCy : Program Change (xx) on channel y ; 0x00vvnn9y : Note On, channel y, note nn, velocity vv ; 0x00007BBy : All Notes Off, channel y ; 0x00vvnnBy : Control Change (xx) on channel y, controller nn, value vv ; The first 8 notes of "Für Elise", 1 note per nibble, starting from 2nd-lowest nibble melody dd 0x76725376 melody2 dd 0x32023535 ; Second half of the repeating melody, not from Für Elise. bassline dd 0x55CC1133 ; bass and power chords root notes, starting from highest nibble section .code_musa code align=1 ; actual music playroutine, call this once per frame, at around 50-60 fps addTune: pushad mov edx, DWORD [midiout_handle] cmp FRAMECOUNT_DWORD, 64*16+65*16+120 jg exit cmp FRAMECOUNT_DWORD, 64*16+65*16+2 jg endall cmp FRAMECOUNT_DWORD, 65*16+1 je crash jl skip_double_kick_drum cmp FRAMECOUNT_DWORD, 64*16+65*16+1 je crash test FRAMECOUNT_BYTE, 3 jnz skip_double_kick_drum pushad push 0x00502499 ; double kick push edx call [__imp__midiOutShortMsg@8] popad skip_double_kick_drum: test FRAMECOUNT_BYTE, 15 jnz notyet mov esi, FRAMECOUNT_DWORD sub esi, 16 test esi, 128 jnz use_melody2 rol dword [melody], 4 mov ebx, dword [melody] and ebx, 0x0F00 jmp skip_melody_advance use_melody2: rol dword [melody2], 4 mov ebx, dword [melody2] and ebx, 0x0F00 skip_melody_advance: mov ecx, FRAMECOUNT_DWORD and ecx, 16 shl ecx, 18 ; Some MIDI messages are constructed with mov/add and some with lea, ; whichever happened to compress better with Crinkler in this case. ; You have to try out different combinations and look at the Crinkler log. lea eax, [ecx + 0x001F2499] ; kick push eax push edx mov eax, 0x007f2899 ; snare sub eax, ecx push eax push edx lea eax, [0x007f3399+ecx*4] ; ride push eax push edx lea eax, [0x007f3390 + 0x0C00 + ebx] ; MELODY push eax push edx test esi, 127 jnz skip_bassline_advance rol dword [bassline], 4 skip_bassline_advance: mov bh, byte [bassline] and bh, 0x0F lea eax, [ebx+ecx*4+0x00601B9A-0x500] push eax push edx lea eax, [ebx + 0x00603391 - 0x0C00 - 0x500] ; POWER CHORDS push eax push edx add eax, 0x0000700 push eax push edx add eax, 0x0000500 push eax push edx push 0x000022CA ; xxCA = program change on channel 11 push edx push 0x00001EC0 ; xxC0 = program change on channel 1 push edx push 0x00001DC1 ; xxC1 = program change on channel 2 push edx push 0x00007BB0 ; all notes off channel 1 push edx push 0x00007BB1 ; all notes off channel 2 push edx push 0x00007BBA ; all notes off channel 11 (bass) push edx ; fire away all the stuff on the stack call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] call [__imp__midiOutShortMsg@8] notyet: jmp endall crash: push 0x007f3199 ; crash push edx call [__imp__midiOutShortMsg@8] endall: loppu: popad ret section .code_main code align=1 global main main: ; in the actual 1k intro there would be visuals initialization stuff here ; ... push 0 ; framecount initial value ; ... push 0 push 0 push 0 push 0 push midiout_handle call [__imp__midiOu tOpen@20] ; ... pop FRAMECOUNT_DWORD main_loop: add FRAMECOUNT_DWORD, 1 call addTune push 27 ; VK_ESCAPE for GetAsyncKeyState() push 1 push 0 push 0 push 0 push 0 call [__imp__Pe ekMessageA@20] ; <-------- SOMEWHERE AROUND HERE YOU WOULD HAVE YOUR VSYNC / SWAP BUFFERS ------> call [__imp__GetAsyncKeyState@4] test al, al je main_loop exit: ; you don't really have to care about what parameter goes to ExitProcess() ;push 0 call [__imp__ExitProcess@4]
rulez added on the 2019-08-05 11:58:27 by yzi yzi
I thought this was actually pretty advanced.
A tradeoff with the visuals of course, but anyway.
rulez added on the 2019-08-07 16:37:48 by Trilkk Trilkk
Nice metal riff :)
rulez added on the 2019-08-07 16:44:55 by Serpent Serpent
ahahaha love this!
rulez added on the 2019-08-07 16:48:16 by okkie okkie
It's a trade-off with visuals only in the sense that I didn't spend time on the visuals, and I suck at making visuals.

Here's the shader. I'm sure it's possible to create something much nicer with as much text as this. It's 607 bytes uncompressed, 325 bytes compressed.

Code: db 'float f=gl_Color.x*1e8,g=floor(f/24.);' db 'float v(vec3 v)' db '{' db 'float s=abs(-4.-v.y),y=24.,z=v.z+f*44.*g,x=floor(z/y);' db 'v.z=mod(z,y);' db 'z=y/2.;' db 'for(float m=8.;m<88.;m+=8.)' db '{' db 'vec3 r=vec3(sin(m*z+x+f*sin(m))*z,sin(m*z+x)*z,z);' db 's=min(s,length(max(abs(v-r)-vec3(1.,1.,.1+sin(f+m)),0.)));' db '}' db 'return s;' db '}' db 'void main()' db '{' db 'vec2 s=gl_FragCoord.xy/vec2(1280.,720.)-.5,r=vec2(.1,0.);' db 'vec3 m=vec3(0.),z=m,y=vec3(s,1.);' db 'float a=1.;' db 'for(float x=0.;x<88.;x+=1.)' db '{' db 'a=v(z+=y*a*.7);' db 'if(a<r.x)' db '{' db 'z-=y*r.x;' db 'm=vec3(g,sin(f*(1.-g)),1.-g)*' db 'dot(' db 'normalize(vec3(v(z-r.xyy),v(z-r.yxy),v(z-r.yyx)))' db ',vec3(sin(f),cos(f),g)' db ')*44./pow(z.z,1.5);' db 'break;' db '}' db '}' db 'gl_FragColor=vec4(m,1.);' db '}', 0
added on the 2019-08-07 18:18:12 by yzi yzi
that was quite fun :)
rulez added on the 2019-08-07 19:48:43 by ROOT808 ROOT808
tune vote :D
rulez added on the 2019-09-01 08:56:02 by sensenstahl sensenstahl

submit changes

if this prod is a fake, some info is false or the download link is broken,

do not post about it in the comments, it will get lost.

instead, click here !

[previous edits]

add a comment

Go to top