├── .gitignore ├── CHANGELOG ├── CMake └── FindSDL2.cmake ├── CMakeLists.txt ├── LICENSE ├── README.md ├── build_deb.sh ├── doc ├── AUTHORS ├── V2M-TinyPlayer.jpg └── VERSION ├── man └── man1 │ └── v2mplayer.1.in ├── src ├── libv2.h ├── phonemtab.h ├── ronan.cpp ├── sounddef.cpp ├── sounddef.h ├── synth.h ├── synth_core.cpp ├── tinyplayer.cpp ├── types.h ├── v2mconv.cpp ├── v2mconv.h ├── v2mplayer.cpp ├── v2mplayer.h └── version.h.in └── v2m ├── 0test.v2m ├── AT4RE-Efficientpim_2.95b232_crk.v2mz ├── AiR-Diamond_Cut_8.0.2_kg.v2mz ├── AoRE-My_Driver_1.xx-5.xx_kg.v2mz ├── Bionic--muppets.v2mz ├── Chip--no_tv.v2mz ├── DJ_Jag--3jagista.v2mz ├── DJ_Jag--sanfrancsco.v2mz ├── DJ_Jag--the_good.v2mz ├── DYNAMiCS140685-Glary_Utilities_2.x.x_crk.v2mz ├── DYNAMiCS140685-Platinum_Hide_IP_3.0.9.8_crk.v2mz ├── DYNAMiCS140685-Super_Hide_IP_3.1.3.2_crk.v2mz ├── Dafunk--angel_and_devil-orig_by_josss.v2mz ├── Dafunk--breeze.v2mz ├── Dafunk--coop-Quickyman--blindfolded.v2mz ├── Dafunk--coop-Quickyman--deepspace.v2mz ├── Dafunk--coop-Quickyman--hardscratchrebound_screamin.v2mz ├── Dafunk--coop-Quickyman--melody_break.v2mz ├── Dafunk--coop-Quickyman--no_sleep-oldversion.v2mz ├── Dafunk--creditzpart_synhtezze.v2mz ├── Dafunk--distorted_reality.v2mz ├── Dafunk--experimental_trance.v2mz ├── Dafunk--introtune.v2mz ├── Dafunk--muddle_in_the_artificial_universe.v2mz ├── Dafunk--scream.v2mz ├── Dafunk--sinestic_prays.v2mz ├── Dafunk--supersonic-shortmix.v2mz ├── Dafunk--thesis.v2mz ├── Dalezy--arkham_1798.v2mz ├── Dalezy--blackout_in_mordor.v2mz ├── Dalezy--friday_the_6th.v2mz ├── Dalezy--malewitsch.v2mz ├── Dalezy--resistance_is_futile.v2mz ├── Darkman007--first.v2mz ├── Darkman007--sphr.v2mz ├── Dent--stupid_title_my_girlfriend_gave_me.v2mz ├── Dq--8ball.v2mz ├── Dq--break_loose.v2mz ├── Dq--coop-Biff--3d_igel-intro.v2mz ├── Dq--coop-Biff--3d_igel-main.v2mz ├── Dq--coop-Biff--rastro.v2mz ├── Entropy--fr-010_art-entroxion-sanxion_remix.v2mz ├── Groovemasta_04--elektrospack.v2mz ├── Hanes--zink_small.v2mz ├── Higen--coder_colors.v2mz ├── Higen--viagpuz.v2mz ├── Huepow00--rustyruins_ala_v2.v2mz ├── IJs--multi_theft_auto_credits.v2mz ├── IJs--that_progressive_trance-like_song.v2mz ├── Icefall--5_minutes.v2mz ├── Icefall--Trubo.v2mz ├── Icefall--boloto_rise.v2mz ├── Icefall--boloto_walk.v2mz ├── Icefall--digitale_i_-_sine_novel.v2mz ├── Icefall--digitale_ii_-_narratones.v2mz ├── Icefall--dispelled_illusion.v2mz ├── Icefall--ethical_drug.v2mz ├── Icefall--july.v2mz ├── Icefall--spire.v2mz ├── Icefall--subcelestial_beauty.v2mz ├── Icefall--subcelestial_brilliance.v2mz ├── Icefall--subcelestial_expectation.v2mz ├── Icefall--subcelestial_freedom.v2mz ├── Icefall--subcelestial_silence.v2mz ├── Icefall--subcelestial_tranquility.v2mz ├── Izard--antiphore.v2mz ├── Izard--dahlia.v2mz ├── Jandor--stars.v2mz ├── KB--fr-011_picknick_in_the_meadows.v2mz ├── KB--fr-013_flybye-loader.v2mz ├── KB--fr-013_flybye-main-brullwurfel_edition.v2mz ├── KB--fr-013_flybye-main.v2mz ├── KB--fr-030_candytron-josie.v2mz ├── KB--fr-041_debris-loader.v2mz ├── KB--fr-041_debris-main.v2mz ├── KB--fr-048_precision.v2mz ├── KB--fr-052_platinum.v2mz ├── KB--fr-08_the_product-loader.v2mz ├── KB--fr-08_the_product-main.v2mz ├── KB--fr-minus-07-we_cell_out.v2mz ├── Kaktusen--konami.v2mz ├── Kaktusen--mupй.v2mz ├── Knopperfrisch--bubblefin.v2mz ├── Little_Bitchard--radial_symmetry.v2mz ├── Lyzzard--R2D2_flying_home.v2mz ├── Lyzzard--comic_bakery.v2mz ├── Lyzzard--deep_blue_welcomes_you.v2mz ├── Lyzzard--mekka_&_symposium_2000_invitation.v2mz ├── MAP--coop-Cosowi--rewind.v2mz ├── Marlon--multiscenist.v2mz ├── Marlon--zuibath.v2mz ├── Melwyn--precision.v2mz ├── Mixer--incognito.v2mz ├── Mrwb--Smoothie.v2mz ├── Mrwb--pocketrocket.v2mz ├── Paniq--maschinenzeit.v2mz ├── Pista--crystal_gate-loader.v2mz ├── Pista--crystal_gate-main.v2mz ├── Pista_and_Irwine--extrait-dreams.v2mz ├── Preston--chiptown.v2mz ├── Preston--demo_or_suck.v2mz ├── Preston--offworld.v2mz ├── Quickyman--agony_remix.v2mz ├── Quickyman--alone_in_darkness.v2mz ├── Quickyman--arcane_remix.v2mz ├── Quickyman--around_the_bass.v2mz ├── Quickyman--breakbeconacid.v2mz ├── Quickyman--clever_little_badass.v2mz ├── Quickyman--crazybreak.v2mz ├── Quickyman--dansze_mucyka-reed-fairlight.v2mz ├── Quickyman--daxx-tristar_hymne-quickyman_v2m_remix.v2mz ├── Quickyman--depechemode-photographic.v2mz ├── Quickyman--depechemode-precious.v2mz ├── Quickyman--full_contact.v2mz ├── Quickyman--funny_rythm.v2mz ├── Quickyman--funny_v2.v2mz ├── Quickyman--gazebo-i_like_chopin.v2mz ├── Quickyman--global_deejays-sound_of_san_fransisco.v2mz ├── Quickyman--hey_dude.v2mz ├── Quickyman--horizon_remix.v2mz ├── Quickyman--house_of_love.v2mz ├── Quickyman--jesperk_remix.v2mz ├── Quickyman--madonna-die_another_day.v2mz ├── Quickyman--melancholictrance-ft_ravetracer(tristar.v2mz ├── Quickyman--movietrack-captain_future.v2mz ├── Quickyman--my_dream_of_silence.v2mz ├── Quickyman--ndw-majortom.v2mz ├── Quickyman--no_way.v2mz ├── Quickyman--nostalgy.v2mz ├── Quickyman--outphatmix_introtune.v2mz ├── Quickyman--paranoimia.v2mz ├── Quickyman--phantasy.v2mz ├── Quickyman--pianolove.v2mz ├── Quickyman--plantcaravan-pantera.v2mz ├── Quickyman--powertrance.v2mz ├── Quickyman--running_hoop.v2mz ├── Quickyman--scooter-hyper_hyper.v2mz ├── Quickyman--slavko_avsenik_-trompetenecho.v2mz ├── Quickyman--slavko_avsenik_-trompetenecho_v2.v2mz ├── Quickyman--sometime_remix.v2mz ├── Quickyman--stop_the_user.v2mz ├── Quickyman--strwarp_remake.v2mz ├── Quickyman--synthetic_panorama.v2mz ├── Quickyman--technohammer_finish.v2mz ├── Quickyman--the_freaker.v2mz ├── Quickyman--the_metalleffect.v2mz ├── Quickyman--the_simple_trancemix.v2mz ├── Quickyman--to_short.v2mz ├── Quickyman--tribute_2_guenter_kraemer-ft_am-fm.v2mz ├── Quickyman--tristar-2005_remix_pseudo.v2mz ├── Quickyman--tristar-2006_complexity.v2mz ├── Quickyman--tristar-2006_conversation_antarctica.v2mz ├── Quickyman--tristar-2006_remix_game-tune.v2mz ├── Quickyman--tristar-amiga_classix-classic_tristar_boulderdemo.v2mz ├── Quickyman--tristar-amiga_classix-classic_tristar_boulderdemo_v2.v2mz ├── Quickyman--tristar-amiga_classix-classic_tristar_remix.v2mz ├── Quickyman--tristar-amiga_classix-classic_tristar_sound_01.v2mz ├── Quickyman--tristar-amiga_classix-the_end_theme.v2mz ├── Quickyman--tristar-amiga_classix-the_legend.v2mz ├── Quickyman--tristar-paranoimia_remix.v2mz ├── Quickyman--tristar_bp2008-unsuspecting.v2mz ├── Quickyman--turrican3_reremix.v2mz ├── Quickyman--vectronix_bladebeat.v2mz ├── Quickyman--welcome_mr_saw.v2mz ├── Quickyman--zoolook.v2mz ├── RES-File_Recovery_7.3b111_kg.v2mz ├── RESURRECTiON-CleanMyPC_Registry_Cleaner_4.10_kg.v2mz ├── RESURRECTiON-PowerCHM_5.x_kg.v2mz ├── Ronny--fr-019_poem_to_a_horse-final_version.v2mz ├── Ronny--fr-019_poem_to_a_horse-party_version.v2mz ├── Rubicante--chaostrance.v2mz ├── Rubicante--psydrop.v2mz ├── Rubicante--the_prophecy.v2mz ├── SDV-CheckMail_5.4.3_crk.v2mz ├── SDV-DU_Meter_5.4.3387_crk.v2mz ├── SDV-WindowManager_1.7.2_crk.v2mz ├── SMT--projekkt_64.v2mz ├── Saddict--test2.v2mz ├── Sanity--nyt-ttt.v2mz ├── Scratchpad--je_taime_mon_steak_hache.v2mz ├── Slash--dream_cache.v2mz ├── Slash--germ.v2mz ├── Slash--times-party_version.v2mz ├── Slash--times.v2mz ├── Soft_Maniac--full_access.v2mz ├── Soft_Maniac--happy_new_2009_year.v2mz ├── TAD--Ahim--A-bomb_Ablazed-shit_cut.v2mz ├── TAD--Forgotten_Souls_v2_reflextion.v2mz ├── TAD--Meow.v2mz ├── TAD--lousy_day.v2mz ├── TAD--primitive_pop.v2mz ├── TAD--short-0plus.v2mz ├── TAD--short-1pattern.v2mz ├── TAD--short-FM_2.v2mz ├── TAD--short-Fear_2.v2mz ├── TAD--short-Organ.v2mz ├── TAD--short-Piano.v2mz ├── TAD--short-Vesna-must_Die.v2mz ├── TAD--short-intro.v2mz ├── THETA-Bejeweled_Twistnfo_1.v2mz ├── THETA-Bejeweled_Twistnfo_2.v2mz ├── THETA-Game_Maker_8.1.135_nfo.v2mz ├── THETA-Motherload_1.037_Goldium_editionnfo.v2mz ├── TLG-Alawar_Games_UniCrack_0.5.v2mz ├── Tchai--orchestress.v2mz ├── Tristan--riot_of_flowers.v2mz ├── Tristan--vortex_2.v2mz ├── Turri--magical.v2mz ├── Under_SEH-Active_DVD_to_WMV_Ripper_1.3_crk.v2mz ├── Under_SEH-AusLogics_BoostSpeed_4.1.4.135_crk.v2mz ├── Under_SEH-MLDownloader_7.1.0.9_crk.v2mz ├── Under_SEH-PCMedik_6.8.20.2010_kg.v2mz ├── Under_SEH-PGWARE.PCMedik_6.6.14.2010_kg.v2mz ├── Under_SEH-WindowSpace_2.0.8_crk.v2mz ├── V2mPlayer--acid_in_space3.v2mz ├── V2mPlayer--c64delay_osdm_track.v2mz ├── V2mPlayer--depechemode-a_pain_that_im_used_to.v2mz ├── V2mPlayer--dreamer.v2mz ├── V2mPlayer--fr-011_picknick_in_the_meadows-brullwurfel_edition.v2mz ├── V2mPlayer--fr-013_flybye-loader-brullwurfel_edition.v2mz ├── V2mPlayer--fr-014_garbage_collection-main-brullwurfel_edition.v2mz ├── V2mPlayer--fr-024_welcome_to_...-breakpoint_2003.v2mz ├── V2mPlayer--fr-027_out_of_the_blue.v2mz ├── V2mPlayer--fr-037_the_code_inside.v2mz ├── V2mPlayer--gods_theme_conversion.v2mz ├── V2mPlayer--going_to_away.v2mz ├── V2mPlayer--greetz_to_breakpoint.v2mz ├── V2mPlayer--happy_birthday_kb-fr08_remix.v2mz ├── V2mPlayer--hardscratch_rebound.v2mz ├── V2mPlayer--hyperzapper.v2mz ├── V2mPlayer--iam_not_still.v2mz ├── V2mPlayer--immersing_in_sea_abyss.v2mz ├── V2mPlayer--kfc_birthday_present.v2mz ├── V2mPlayer--movietrack-mortalkombat.v2mz ├── V2mPlayer--no_sleep-newer.v2mz ├── V2mPlayer--ouverture.v2mz ├── V2mPlayer--overture_part_ii.v2mz ├── V2mPlayer--power_run_remake.v2mz ├── V2mPlayer--projone.v2mz ├── V2mPlayer--regression.v2mz ├── V2mPlayer--soul.v2mz ├── V2mPlayer--the_2nd_movement-sid_remix.v2mz ├── V2mPlayer--time_and_space.v2mz ├── V2mPlayer--tristar-amiga_classix-classic_tristar_partysound.v2mz ├── V2mPlayer--welcome_to_vectronix_disco-without_vocals.v2mz ├── V2mPlayer--welcome_to_vectronix_disco.v2mz ├── Vildauget--osmozis.v2mz ├── Wayfinder--fr-014_garbage_collection-main.v2mz ├── Wayfinder--fr-021-unreleased-main.v2mz ├── Wayfinder--fr-022_ein.schlag-loader.v2mz ├── Wayfinder--fr-022_ein.schlag-main.v2mz ├── Wayfinder--fr-029_dopplerdefekt.v2mz ├── Wayfinder--fr-041_debris-sfx.v2mz ├── Wayfinder--kkrieger-chapter_i.v2mz ├── Wayfinder--short_stuff.v2mz ├── WickedZ--trance_style.v2mz ├── WickedZ--ultra_short.v2mz ├── William_Hooligan--rip_van_vegas.v2mz ├── Xclusr--noname.v2mz ├── Yoda--fr-minus-03-party.v2mz ├── Yoda--fr-minus-03.2_rausch-o-mat.v2mz ├── Zugly--corporate_seeds_pvp.v2mz ├── Zugly--farwerkk_003.v2mz ├── Zugly--morning_upanishad.v2mz ├── Zugly--ripoff_iii.v2mz ├── Zugly--zi5_this_machine.v2mz ├── freudian_slippers-rocket_sauce.v2mz ├── iOTA-MTop_HTML_Password_Lock_5.0_nfo_1.v2mz ├── iOTA-MTop_HTML_Password_Lock_5.0_nfo_2.v2mz ├── iOTA-Recover_Keys_Enterprise_5.0.0.56_crk.v2mz ├── iOTA-Stereoscopic_Player_1.6.1_crk.v2mz ├── kZ-ArtIcons_Pro_5.24_crk.v2mz ├── kZ-BVS_Solitaire_Collection_5.3_crk.v2mz ├── kZ-DeskSoft_HardCopy_Pro_3.2.1_crk.v2mz ├── kZ-Glary_Utilities_2.x.x.x_crk.v2mz ├── kZ-HardCopy_3.2.0_crk.v2mz ├── kZ-Kyodai_Mahjongg_20.00_crk.v2mz ├── kZ-Kyodai_Mahjongg_2006_1.42_crk.v2mz ├── kZ-Moleskinsoft_Clone_Remover_3.7_crk.v2mz ├── kZ-Moleskinsoft_Clone_Remover_3.8_Pro_crk.v2mz ├── kZ-Moleskinsoft_Clone_Remover_Pro_3.4_crk.v2mz ├── kZ-Moo0_RightClicker_Pro_1.x.x.x_crk.v2mz ├── kZ-RimArts_Becky_Internet_Mail_2.x.x.x_crk.v2mz ├── kZ-Simpo_Products_crk.v2mz ├── kZ-Total_Commander_6-7.x.x_crk.v2mz ├── kZ-Total_Commander_6.x.x-7.x.x_crk.v2mz ├── kZ-WinPatch_1.x.x.x_crk.v2mz ├── kZ-WinRAR_3.x.x.x_crk.v2mz ├── pzero_new.v2mz ├── tPORt-Advanced_Postal_Envelope_1.3.3_build_4.v2mz ├── tPORt-All_My_Movies_3.7_build_1200_crk.v2mz ├── tPORt-All_to_All_AudioConvert_1.13_crk.v2mz ├── tPORt-Apollo_DVD_Copy_4.5.4_kg.v2mz ├── tPORt-Audio_Converter_and_Mixer_3.0_crk.v2mz ├── tPORt-Audio_Convertor_Plus_2.2_kg.v2mz ├── tPORt-CD_DVD_Data_Recovery_1.0_crk.v2mz ├── tPORt-Color_Schemer_Studio_1.5_kg.v2mz ├── tPORt-DOTMOF_1.24_crk.v2mz ├── tPORt-Direct_Flash_Download_1.01_crk.v2mz ├── tPORt-Drive_Discovery_2.1_kg.v2mz ├── tPORt-Easy_HTML_Autorun_Builder_1.6.0_build_059_crk.v2mz ├── tPORt-Easy_Video_to_Audio_Converter_1.3.4_crk.v2mz ├── tPORt-FilePacker_1.1_crk.v2mz ├── tPORt-Flash_Sound_Grabber_1.10_crk.v2mz ├── tPORt-Handy_Recovery_2.0_crk.v2mz ├── tPORt-MOV_to_AVI_MPEG_WMV_Converter_1.8.4_kg.v2mz ├── tPORt-MP3_Joiner_1.0_crk.v2mz ├── tPORt-MetaProducts_Flash_and_Media_Capture_1.2.43_SR1_kg.v2mz ├── tPORt-MetaProducts_Inquiry_Standart_1.6.423_SR1_kg.v2mz ├── tPORt-MetaProducts_Mass_Downloader_3.3.691_SR1_kg.v2mz ├── tPORt-MetaProducts_Offline_Explorer_Enterprise_4.8.2650_SR1_kg.v2mz ├── tPORt-MetaProducts_Offline_Explorer_Pro_4.8.2628_kg.v2mz ├── tPORt-MetaProducts_Picture_Downloader_1.0.589_kg.v2mz ├── tPORt-MetaProducts_Portable_Offline_Browser_4.8.2628_kg.v2mz ├── tPORt-MetaProducts_kg.v2mz ├── tPORt-N1_DVD_Ripper_5.3_kg.v2mz ├── tPORt-NetPlanning_2.03_crk.v2mz ├── tPORt-Registry_Operator_3.6_kg.v2mz ├── tPORt-StyleBuilder_2.021000.v2mz ├── tPORt-Ultra_Mpeg_Converter_1.9.0_kg.v2mz ├── tPORt-Universal_Desktop_Ruler_2.9.1118_crk.v2mz ├── tPORt-WinTools.net_Professional_6.5.1_crk.v2mz ├── tPORt-Xilisoft_OGG_MP3_Converter_2.1.63_kg.v2mz ├── tPORt-unEbookEdit_2.20.765_crk.v2mz └── vx--kxxt_demo.v2mz /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | build_deb 3 | CMakeLists.txt.user 4 | -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | # v2m-player 2 | Farbrausch V2M player 3 | SDL Port by github.com/jgilje 4 | 5 | 0.20211104 6 | 7 | stdin only with a hyphen 8 | 9 | 0.20210505 10 | 11 | removed 'force power size stdin buffer' 12 | add output gain 13 | reduced samplesize, helps playback on windows 14 | remove register storage 15 | remove asm from ronan 16 | fix https://bitbucket.org/zxtune/zxtune 17 | 18 | 0.20200408 19 | 20 | debian based packaging 21 | 22 | 0.20200407 23 | 24 | version support seeking 25 | 26 | 0.20180825 27 | 28 | convert to v2m newest version 29 | 30 | 0.20180821 31 | 32 | fix error memory allocator 33 | 34 | 0.20180819 35 | 36 | realloc buffer stdin 37 | 38 | 0.20180818 39 | 40 | fix stdin buffer size (arg -b) 41 | 42 | 0.20180817 43 | 44 | PIPE Version (for GZIP) 45 | 46 | 0.20180608 47 | 48 | INSTALL Version 49 | 50 | 0.20180108 51 | 52 | Fix time play in V2MPlayer::Tick() 53 | 54 | 0.20171117 55 | 56 | Switch to optimized code https://github.com/lieff/v2m-player 57 | 58 | 0.20170725 59 | 60 | Add key-mode for player (options) 61 | 62 | 0.20170714 63 | 64 | Time limit for player 65 | 66 | 0.20170322 67 | 68 | Library libv2m 69 | -------------------------------------------------------------------------------- /CMake/FindSDL2.cmake: -------------------------------------------------------------------------------- 1 | # Locate SDL2 library 2 | # This module defines 3 | # SDL2_LIBRARY, the name of the library to link against 4 | # SDL2_FOUND, if false, do not try to link to SDL2 5 | # SDL2_INCLUDE_DIR, where to find SDL.h 6 | # 7 | # This module responds to the the flag: 8 | # SDL2_BUILDING_LIBRARY 9 | # If this is defined, then no SDL2main will be linked in because 10 | # only applications need main(). 11 | # Otherwise, it is assumed you are building an application and this 12 | # module will attempt to locate and set the the proper link flags 13 | # as part of the returned SDL2_LIBRARY variable. 14 | # 15 | # Don't forget to include SDLmain.h and SDLmain.m your project for the 16 | # OS X framework based version. (Other versions link to -lSDL2main which 17 | # this module will try to find on your behalf.) Also for OS X, this 18 | # module will automatically add the -framework Cocoa on your behalf. 19 | # 20 | # 21 | # Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration 22 | # and no SDL2_LIBRARY, it means CMake did not find your SDL2 library 23 | # (SDL2.dll, libsdl2.so, SDL2.framework, etc). 24 | # Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again. 25 | # Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value 26 | # as appropriate. These values are used to generate the final SDL2_LIBRARY 27 | # variable, but when these values are unset, SDL2_LIBRARY does not get created. 28 | # 29 | # 30 | # $SDL2DIR is an environment variable that would 31 | # correspond to the ./configure --prefix=$SDL2DIR 32 | # used in building SDL2. 33 | # l.e.galup 9-20-02 34 | # 35 | # Modified by Eric Wing. 36 | # Added code to assist with automated building by using environmental variables 37 | # and providing a more controlled/consistent search behavior. 38 | # Added new modifications to recognize OS X frameworks and 39 | # additional Unix paths (FreeBSD, etc). 40 | # Also corrected the header search path to follow "proper" SDL guidelines. 41 | # Added a search for SDL2main which is needed by some platforms. 42 | # Added a search for threads which is needed by some platforms. 43 | # Added needed compile switches for MinGW. 44 | # 45 | # On OSX, this will prefer the Framework version (if found) over others. 46 | # People will have to manually change the cache values of 47 | # SDL2_LIBRARY to override this selection or set the CMake environment 48 | # CMAKE_INCLUDE_PATH to modify the search paths. 49 | # 50 | # Note that the header path has changed from SDL2/SDL.h to just SDL.h 51 | # This needed to change because "proper" SDL convention 52 | # is #include "SDL.h", not . This is done for portability 53 | # reasons because not all systems place things in SDL2/ (see FreeBSD). 54 | 55 | #============================================================================= 56 | # Copyright 2003-2009 Kitware, Inc. 57 | # 58 | # Distributed under the OSI-approved BSD License (the "License"); 59 | # see accompanying file Copyright.txt for details. 60 | # 61 | # This software is distributed WITHOUT ANY WARRANTY; without even the 62 | # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 63 | # See the License for more information. 64 | #============================================================================= 65 | # (To distribute this file outside of CMake, substitute the full 66 | # License text for the above reference.) 67 | 68 | SET(SDL2_SEARCH_PATHS 69 | ~/Library/Frameworks 70 | /Library/Frameworks 71 | /usr/local 72 | /usr 73 | /sw # Fink 74 | /opt/local # DarwinPorts 75 | /opt/csw # Blastwave 76 | /opt 77 | ) 78 | 79 | FIND_PATH(SDL2_INCLUDE_DIR SDL.h 80 | HINTS 81 | $ENV{SDL2DIR} 82 | PATH_SUFFIXES include/SDL2 include 83 | PATHS ${SDL2_SEARCH_PATHS} 84 | ) 85 | 86 | FIND_LIBRARY(SDL2_LIBRARY_TEMP 87 | NAMES SDL2 88 | HINTS 89 | $ENV{SDL2DIR} 90 | PATH_SUFFIXES lib64 lib 91 | PATHS ${SDL2_SEARCH_PATHS} 92 | ) 93 | 94 | IF(NOT SDL2_BUILDING_LIBRARY) 95 | IF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework") 96 | # Non-OS X framework versions expect you to also dynamically link to 97 | # SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms 98 | # seem to provide SDL2main for compatibility even though they don't 99 | # necessarily need it. 100 | FIND_LIBRARY(SDL2MAIN_LIBRARY 101 | NAMES SDL2main 102 | HINTS 103 | $ENV{SDL2DIR} 104 | PATH_SUFFIXES lib64 lib 105 | PATHS ${SDL2_SEARCH_PATHS} 106 | ) 107 | ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework") 108 | ENDIF(NOT SDL2_BUILDING_LIBRARY) 109 | 110 | # SDL2 may require threads on your system. 111 | # The Apple build may not need an explicit flag because one of the 112 | # frameworks may already provide it. 113 | # But for non-OSX systems, I will use the CMake Threads package. 114 | #IF(NOT APPLE) 115 | # FIND_PACKAGE(Threads) 116 | #ENDIF(NOT APPLE) 117 | 118 | # MinGW needs an additional library, mwindows 119 | # It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows 120 | # (Actually on second look, I think it only needs one of the m* libraries.) 121 | IF(MINGW) 122 | SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW") 123 | ENDIF(MINGW) 124 | 125 | IF(SDL2_LIBRARY_TEMP) 126 | # For SDL2main 127 | IF(NOT SDL2_BUILDING_LIBRARY) 128 | IF(SDL2MAIN_LIBRARY) 129 | SET(SDL2_LIBRARY_TEMP ${SDL2MAIN_LIBRARY} ${SDL2_LIBRARY_TEMP}) 130 | ENDIF(SDL2MAIN_LIBRARY) 131 | ENDIF(NOT SDL2_BUILDING_LIBRARY) 132 | 133 | # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. 134 | # CMake doesn't display the -framework Cocoa string in the UI even 135 | # though it actually is there if I modify a pre-used variable. 136 | # I think it has something to do with the CACHE STRING. 137 | # So I use a temporary variable until the end so I can set the 138 | # "real" variable in one-shot. 139 | IF(APPLE) 140 | SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa") 141 | ENDIF(APPLE) 142 | 143 | # For threads, as mentioned Apple doesn't need this. 144 | # In fact, there seems to be a problem if I used the Threads package 145 | # and try using this line, so I'm just skipping it entirely for OS X. 146 | #IF(NOT APPLE) 147 | # SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) 148 | #ENDIF(NOT APPLE) 149 | 150 | # For MinGW library 151 | IF(MINGW) 152 | SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) 153 | ENDIF(MINGW) 154 | 155 | # Set the final string here so the GUI reflects the final state. 156 | SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found") 157 | # Set the temp variable to INTERNAL so it is not seen in the CMake GUI 158 | SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "") 159 | ENDIF(SDL2_LIBRARY_TEMP) 160 | 161 | INCLUDE(FindPackageHandleStandardArgs) 162 | 163 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR) 164 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.5) 2 | 3 | set(MAJOR_VERSION 0) 4 | set(DATE_VERSION 20250301) 5 | set(V2M_MAN_DATE "01 Mar 2025") 6 | set(V2M_VERSION ${MAJOR_VERSION}.${DATE_VERSION}) 7 | project(v2mplayer VERSION ${V2M_VERSION}) 8 | 9 | set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake) 10 | find_package(SDL2 REQUIRED) 11 | include_directories(${SDL2_INCLUDE_DIR}) 12 | 13 | configure_file(src/version.h.in ${PROJECT_BINARY_DIR}/include/version.h @ONLY) 14 | configure_file(man/man1/v2mplayer.1.in ${PROJECT_BINARY_DIR}/man/man1/v2mplayer.1 @ONLY) 15 | add_library(v2m_obj OBJECT 16 | src/ronan.cpp 17 | src/v2mplayer.cpp 18 | src/v2mconv.cpp 19 | src/synth_core.cpp 20 | src/sounddef.cpp 21 | ) 22 | set_property(TARGET v2m_obj PROPERTY POSITION_INDEPENDENT_CODE ON) 23 | target_compile_definitions(v2m_obj PRIVATE RONAN) 24 | 25 | add_library(v2m 26 | SHARED 27 | $ 28 | ) 29 | set_target_properties(v2m PROPERTIES VERSION ${V2M_VERSION} SOVERSION ${MAJOR_VERSION}) 30 | 31 | add_library(v2m_static 32 | STATIC 33 | $ 34 | ) 35 | 36 | add_executable(v2mplayer 37 | src/tinyplayer.cpp 38 | ) 39 | target_include_directories(v2mplayer PRIVATE ${PROJECT_BINARY_DIR}/include) 40 | target_link_libraries(v2mplayer 41 | ${SDL2_LIBRARY} 42 | v2m 43 | ) 44 | 45 | install(TARGETS v2m DESTINATION lib COMPONENT lib) 46 | install(TARGETS v2m_static DESTINATION lib COMPONENT devel) 47 | install(TARGETS v2mplayer DESTINATION bin COMPONENT player) 48 | install(FILES ${PROJECT_BINARY_DIR}/man/man1/v2mplayer.1 DESTINATION share/man/man1 COMPONENT player) 49 | install(FILES ${PROJECT_BINARY_DIR}/include/version.h src/libv2.h src/phonemtab.h src/sounddef.h src/synth.h src/types.h src/v2mconv.h src/v2mplayer.h DESTINATION include/v2m COMPONENT devel) 50 | install(FILES LICENSE README.md doc/AUTHORS doc/CHANGELOG doc/VERSION DESTINATION share/doc/libv2m COMPONENT lib) 51 | install(FILES LICENSE README.md doc/AUTHORS doc/CHANGELOG doc/VERSION DESTINATION share/doc/v2mplayer COMPONENT player) 52 | 53 | set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) 54 | set(CPACK_DEBIAN_ENABLE_COMPONENT_DEPENDS ON) 55 | set(CPACK_COMPONENT_PLAYER_DEPENDS lib) 56 | set(CPACK_DEB_COMPONENT_INSTALL ON) 57 | set(CPACK_PACKAGE_CONTACT "jgilje@jgilje.net") 58 | 59 | set(CPACK_DEBIAN_PLAYER_FILE_NAME "DEB-DEFAULT") 60 | set(CPACK_DEBIAN_PLAYER_PACKAGE_NAME "v2mplayer") 61 | set(CPACK_DEBIAN_PLAYER_PACKAGE_SECTION "sound") 62 | set(CPACK_COMPONENT_PLAYER_DESCRIPTION "simple v2m media player") 63 | 64 | set(CPACK_DEBIAN_LIB_FILE_NAME "DEB-DEFAULT") 65 | set(CPACK_DEBIAN_LIB_PACKAGE_NAME "libv2m0") 66 | set(CPACK_DEBIAN_LIB_PACKAGE_SECTION "libs") 67 | set(CPACK_COMPONENT_LIB_DESCRIPTION "library for rendering v2m audio files") 68 | 69 | set(CPACK_DEBIAN_DEVEL_FILE_NAME "DEB-DEFAULT") 70 | set(CPACK_DEBIAN_DEVEL_PACKAGE_NAME "libv2m-dev") 71 | set(CPACK_DEBIAN_DEVEL_PACKAGE_SECTION "libdevel") 72 | set(CPACK_COMPONENT_DEVEL_DESCRIPTION "development headers for libv2m") 73 | include(CPack) 74 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The Artistic License 2.0 2 | 3 | Copyright (c) 2000-2006, The Perl Foundation. 4 | 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | This license establishes the terms under which a given free software 11 | Package may be copied, modified, distributed, and/or redistributed. 12 | The intent is that the Copyright Holder maintains some artistic 13 | control over the development of that Package while still keeping the 14 | Package available as open source and free software. 15 | 16 | You are always permitted to make arrangements wholly outside of this 17 | license directly with the Copyright Holder of a given Package. If the 18 | terms of this license do not permit the full use that you propose to 19 | make of the Package, you should contact the Copyright Holder and seek 20 | a different licensing arrangement. 21 | 22 | Definitions 23 | 24 | "Copyright Holder" means the individual(s) or organization(s) 25 | named in the copyright notice for the entire Package. 26 | 27 | "Contributor" means any party that has contributed code or other 28 | material to the Package, in accordance with the Copyright Holder's 29 | procedures. 30 | 31 | "You" and "your" means any person who would like to copy, 32 | distribute, or modify the Package. 33 | 34 | "Package" means the collection of files distributed by the 35 | Copyright Holder, and derivatives of that collection and/or of 36 | those files. A given Package may consist of either the Standard 37 | Version, or a Modified Version. 38 | 39 | "Distribute" means providing a copy of the Package or making it 40 | accessible to anyone else, or in the case of a company or 41 | organization, to others outside of your company or organization. 42 | 43 | "Distributor Fee" means any fee that you charge for Distributing 44 | this Package or providing support for this Package to another 45 | party. It does not mean licensing fees. 46 | 47 | "Standard Version" refers to the Package if it has not been 48 | modified, or has been modified only in ways explicitly requested 49 | by the Copyright Holder. 50 | 51 | "Modified Version" means the Package, if it has been changed, and 52 | such changes were not explicitly requested by the Copyright 53 | Holder. 54 | 55 | "Original License" means this Artistic License as Distributed with 56 | the Standard Version of the Package, in its current version or as 57 | it may be modified by The Perl Foundation in the future. 58 | 59 | "Source" form means the source code, documentation source, and 60 | configuration files for the Package. 61 | 62 | "Compiled" form means the compiled bytecode, object code, binary, 63 | or any other form resulting from mechanical transformation or 64 | translation of the Source form. 65 | 66 | 67 | Permission for Use and Modification Without Distribution 68 | 69 | (1) You are permitted to use the Standard Version and create and use 70 | Modified Versions for any purpose without restriction, provided that 71 | you do not Distribute the Modified Version. 72 | 73 | 74 | Permissions for Redistribution of the Standard Version 75 | 76 | (2) You may Distribute verbatim copies of the Source form of the 77 | Standard Version of this Package in any medium without restriction, 78 | either gratis or for a Distributor Fee, provided that you duplicate 79 | all of the original copyright notices and associated disclaimers. At 80 | your discretion, such verbatim copies may or may not include a 81 | Compiled form of the Package. 82 | 83 | (3) You may apply any bug fixes, portability changes, and other 84 | modifications made available from the Copyright Holder. The resulting 85 | Package will still be considered the Standard Version, and as such 86 | will be subject to the Original License. 87 | 88 | 89 | Distribution of Modified Versions of the Package as Source 90 | 91 | (4) You may Distribute your Modified Version as Source (either gratis 92 | or for a Distributor Fee, and with or without a Compiled form of the 93 | Modified Version) provided that you clearly document how it differs 94 | from the Standard Version, including, but not limited to, documenting 95 | any non-standard features, executables, or modules, and provided that 96 | you do at least ONE of the following: 97 | 98 | (a) make the Modified Version available to the Copyright Holder 99 | of the Standard Version, under the Original License, so that the 100 | Copyright Holder may include your modifications in the Standard 101 | Version. 102 | 103 | (b) ensure that installation of your Modified Version does not 104 | prevent the user installing or running the Standard Version. In 105 | addition, the Modified Version must bear a name that is different 106 | from the name of the Standard Version. 107 | 108 | (c) allow anyone who receives a copy of the Modified Version to 109 | make the Source form of the Modified Version available to others 110 | under 111 | 112 | (i) the Original License or 113 | 114 | (ii) a license that permits the licensee to freely copy, 115 | modify and redistribute the Modified Version using the same 116 | licensing terms that apply to the copy that the licensee 117 | received, and requires that the Source form of the Modified 118 | Version, and of any works derived from it, be made freely 119 | available in that license fees are prohibited but Distributor 120 | Fees are allowed. 121 | 122 | 123 | Distribution of Compiled Forms of the Standard Version 124 | or Modified Versions without the Source 125 | 126 | (5) You may Distribute Compiled forms of the Standard Version without 127 | the Source, provided that you include complete instructions on how to 128 | get the Source of the Standard Version. Such instructions must be 129 | valid at the time of your distribution. If these instructions, at any 130 | time while you are carrying out such distribution, become invalid, you 131 | must provide new instructions on demand or cease further distribution. 132 | If you provide valid instructions or cease distribution within thirty 133 | days after you become aware that the instructions are invalid, then 134 | you do not forfeit any of your rights under this license. 135 | 136 | (6) You may Distribute a Modified Version in Compiled form without 137 | the Source, provided that you comply with Section 4 with respect to 138 | the Source of the Modified Version. 139 | 140 | 141 | Aggregating or Linking the Package 142 | 143 | (7) You may aggregate the Package (either the Standard Version or 144 | Modified Version) with other packages and Distribute the resulting 145 | aggregation provided that you do not charge a licensing fee for the 146 | Package. Distributor Fees are permitted, and licensing fees for other 147 | components in the aggregation are permitted. The terms of this license 148 | apply to the use and Distribution of the Standard or Modified Versions 149 | as included in the aggregation. 150 | 151 | (8) You are permitted to link Modified and Standard Versions with 152 | other works, to embed the Package in a larger work of your own, or to 153 | build stand-alone binary or bytecode versions of applications that 154 | include the Package, and Distribute the result without restriction, 155 | provided the result does not expose a direct interface to the Package. 156 | 157 | 158 | Items That are Not Considered Part of a Modified Version 159 | 160 | (9) Works (including, but not limited to, modules and scripts) that 161 | merely extend or make use of the Package, do not, by themselves, cause 162 | the Package to be a Modified Version. In addition, such works are not 163 | considered parts of the Package itself, and are not subject to the 164 | terms of this license. 165 | 166 | 167 | General Provisions 168 | 169 | (10) Any use, modification, and distribution of the Standard or 170 | Modified Versions is governed by this Artistic License. By using, 171 | modifying or distributing the Package, you accept this license. Do not 172 | use, modify, or distribute the Package, if you do not accept this 173 | license. 174 | 175 | (11) If your Modified Version has been derived from a Modified 176 | Version made by someone other than you, you are nevertheless required 177 | to ensure that your Modified Version complies with the requirements of 178 | this license. 179 | 180 | (12) This license does not grant you the right to use any trademark, 181 | service mark, tradename, or logo of the Copyright Holder. 182 | 183 | (13) This license includes the non-exclusive, worldwide, 184 | free-of-charge patent license to make, have made, use, offer to sell, 185 | sell, import and otherwise transfer the Package with respect to any 186 | patent claims licensable by the Copyright Holder that are necessarily 187 | infringed by the Package. If you institute patent litigation 188 | (including a cross-claim or counterclaim) against any party alleging 189 | that the Package constitutes direct or contributory patent 190 | infringement, then this Artistic License to you shall terminate on the 191 | date that such litigation is filed. 192 | 193 | (14) Disclaimer of Warranty: 194 | THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS 195 | IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED 196 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR 197 | NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL 198 | LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL 199 | BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 200 | DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF 201 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![GitHub release (latest by date)](https://img.shields.io/github/v/release/Sound-Linux-More/v2mplayer) 2 | ![GitHub Release Date](https://img.shields.io/github/release-date/Sound-Linux-More/v2mplayer) 3 | ![GitHub repo size](https://img.shields.io/github/repo-size/jgilje/v2m-player) 4 | ![GitHub all releases](https://img.shields.io/github/downloads/Sound-Linux-More/v2mplayer/total) 5 | ![GitHub](https://img.shields.io/github/license/jgilje/v2m-player) 6 | 7 | # v2m-player 8 | Farbrausch V2M player 9 | 10 | ![TinyPlayer](./doc/V2M-TinyPlayer.jpg) 11 | 12 | This is a quick port of the tinyplayer at https://github.com/farbrausch/fr_public/tree/master/v2 to SDL. 13 | 14 | ## Build 15 | 16 | ``` 17 | ccmake . 18 | cmake . 19 | make 20 | sudo make install 21 | ``` 22 | 23 | ## Usage 24 | 25 | ``` 26 | ./v2mplayer v2m/0test.v2m 27 | zcat v2m/Dafunk--breeze.v2mz | ./v2mplayer - 28 | gzip -cdf v2m/Dafunk--breeze.v2mz | ./v2mplayer -o Dafunk--breeze.newest.v2m 29 | ``` 30 | 31 | ## See also 32 | 33 | * [FTP modland.com](http://ftp.modland.com/) 34 | 35 | --- 36 | 2021 37 | -------------------------------------------------------------------------------- /build_deb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ ! -d build_deb ]; then 4 | mkdir build_deb 5 | fi 6 | 7 | cd build_deb 8 | cmake -DCMAKE_BUILD_TYPE=Release -G Ninja .. 9 | ninja 10 | LD_LIBRARY_PATH=`pwd` cpack -G DEB 11 | -------------------------------------------------------------------------------- /doc/AUTHORS: -------------------------------------------------------------------------------- 1 | # v2m-player 2 | Farbrausch V2M player 3 | SDL Port by github.com/jgilje 4 | 5 | Joakim L. Gilje [https://github.com/jgilje] (Norway) 6 | Lion <> [https://github.com/lieff] (Russia) 7 | zvezdochiot [https://github.com/zcezdochiot] (Russia) 8 | -------------------------------------------------------------------------------- /doc/V2M-TinyPlayer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/doc/V2M-TinyPlayer.jpg -------------------------------------------------------------------------------- /doc/VERSION: -------------------------------------------------------------------------------- 1 | 0.20211104 2 | -------------------------------------------------------------------------------- /man/man1/v2mplayer.1.in: -------------------------------------------------------------------------------- 1 | .TH "V2mPlayer" 1 "@V2M_MAN_DATE@" "v2mplayer-@V2M_VERSION@" "User Manual" 2 | 3 | .SH NAME 4 | v2mplayer 5 | 6 | .SH DESCRIPTION 7 | Farbrausch Tiny Music Player v0.dontcare TWO 8 | Code and Synthesizer (C) 2000-2008 kb/Farbrausch 9 | SDL Port by github.com/jgilje 10 | 11 | .SH SYNOPSIS 12 | \fBv2mplayer\fP [options] input_file_v2m | - (stdin) 13 | 14 | .SH OPTIONS 15 | .TP 16 | \fB-s\fP N.N 17 | start at position (float, optional, in s., default = 0.0) 18 | .TP 19 | \fB-g\fP N 20 | gain (float, optional, default = 1.0) 21 | .TP 22 | \fB-k\fP 23 | key/auto stop (bool, optional, default = false) 24 | .TP 25 | \fB-o\fP str 26 | output v2m newest version (string, optional, default = none) 27 | .TP 28 | \fB-h\fP 29 | help 30 | 31 | .SH EXAMPLE 32 | \fBv2mplayer\fP v2m/0test.v2m 33 | zcat v2m/Dafunk--breeze.v2mz | \fBv2mplayer\fP - 34 | 35 | .SH COPYRIGHT 36 | Copyright 2016 Joakim L. Gilje. 37 | All rights reserved. 38 | 39 | .SH SEE ALSO 40 | xmp(1), 41 | openmpt123(1), 42 | zcat(1) 43 | 44 | .SH CONTACTS 45 | Website: https://github.com/jgilje/v2m-player 46 | Email: jgilje@jgilje.net 47 | -------------------------------------------------------------------------------- /src/libv2.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /*************************************************************************************/ 4 | /*************************************************************************************/ 5 | /** **/ 6 | /** LibV2 header file **/ 7 | /** written Tammo 'kb' Hinrichs 2000-2008 **/ 8 | /** This file is in the public domain **/ 9 | /** **/ 10 | /*************************************************************************************/ 11 | /*************************************************************************************/ 12 | 13 | #ifdef __cplusplus 14 | extern "C" 15 | { 16 | #endif 17 | 18 | /*************************************************************************************/ 19 | /** **/ 20 | /** DirectSound output code **/ 21 | /** **/ 22 | /*************************************************************************************/ 23 | 24 | // your rendering callback function has to look this way: 25 | // parm: pointer you specified with dsInit 26 | // buf: pointer to interleved stereo float destination buffer (1.0=0dB) 27 | // len: length of buffer in samples (!) 28 | typedef void (DSIOCALLBACK)(void *parm, float *buf, unsigned long len); 29 | 30 | // initializes DirectSound output. 31 | // callback: your render callback function 32 | // parm: a pointer that'll be supplied to the function on every call 33 | // hWnd: window handle of your application (GetForegroundWindow() works quite well :) 34 | unsigned long dsInit(DSIOCALLBACK *callback, void *parm, void *hWnd); 35 | 36 | // shuts down DirectSound output 37 | void dsClose(); 38 | 39 | // gets sample-exact and latency compensated current play position 40 | signed long dsGetCurSmp(); 41 | 42 | // sets player volume (default is 1.0) 43 | void dsSetVolume(float vol); 44 | 45 | // forces rendering thread to update. On single-core CPUs it's a good idea to 46 | // call this once per frame (improves A/V sync and reduces any stuttering), 47 | // with more than one CPU it's pretty much useless. 48 | void dsTick(); 49 | 50 | // lock and unlock the sound thread's thread sync lock. If you want to modify 51 | // any of your sound variables outside the render thread, encapsulate that part 52 | // of code in between these two functions. 53 | void dsLock(); 54 | void dsUnlock(); 55 | 56 | /*************************************************************************************/ 57 | /** **/ 58 | /** Synthesizer interface **/ 59 | /** **/ 60 | /*************************************************************************************/ 61 | 62 | // returns size of work memory in bytes. Per synthesizer instance reserve at least 63 | // this amount of memory and supply it as the "pthis" parameter of all other functions 64 | // Note: If you need only one static instance, 3 Megabytes are a good bet. 65 | unsigned int synthGetSize(); 66 | 67 | // inits synthesizer instance. 68 | // pthis : pointer to work mem 69 | // patchmap : pointer to patch data 70 | // samplerate: output sample rate (44100-192000 Hz), use 44100 when playing with dsio 71 | void synthInit(void *pthis, const void *patchmap, int samplerate=44100); 72 | 73 | // inits global parameters 74 | // pthis: pointer to work mem 75 | // ptr : pointer to global parameters 76 | void synthSetGlobals(void *pthis, const void *ptr); 77 | 78 | // inits speech synthesizer texts 79 | // pthis: pointer to work mem 80 | // ptr : pointer to text array 81 | void synthSetLyrics(void *pthis, const char **ptr); 82 | 83 | // renders synth output to destination buffer 84 | // pthis: pointer to work mem 85 | // buf : pointer to interleaved float stereo out buffer 86 | // smp : number of samples to render 87 | // buf2 : if this is specified, the synth will render the left and right channel into 88 | // two mono float buffers at buf and buf2 instead of one interleaved buffer 89 | // add : if this is specified, the synth will add its output to the destination 90 | // buffer instead of replacing its contents 91 | void synthRender(void *pthis, void *buf, int smp, void *buf2 = 0, int add = 0); 92 | 93 | // pipes a stream of MIDI commands to the synthesizer 94 | // pthis: pointer to work mem 95 | // ptr : pointer to buffer with MIDI data to process. 96 | // NOTE: The buffer MUST end with a 0xfd byte 97 | void synthProcessMIDI(void *pthis, const void *ptr); 98 | 99 | // sets operation mode of VU meters 100 | // pthis: pointer to work mem 101 | // mode : 0 for peak meters, 1 for RMS meters 102 | void synthSetVUMode(void *pthis, int mode); // 0: peak, 1: rms 103 | 104 | // retrieves VU meter data for a channel 105 | // pthis: pointer to work mem 106 | // ch : channel to retrieve (0..15) 107 | // l : pointer to float variable where left VU is stored 108 | // r : pointer to float variable where right VU is stored 109 | void synthGetChannelVU(void *pthis, int ch, float *l, float *r); // ch: 0..15 110 | 111 | // retrieves master VU meter 112 | // pthis: pointer to work mem 113 | // l : pointer to float variable where left VU is stored 114 | // r : pointer to float variable where right VU is stored 115 | void synthGetMainVU(void *pthis, float *l, float *r); 116 | 117 | #ifdef __cplusplus 118 | } 119 | #endif 120 | -------------------------------------------------------------------------------- /src/phonemtab.h: -------------------------------------------------------------------------------- 1 | // file automatically generated by kram.exe - do not ask 2 | 3 | #pragma pack (push, 1) 4 | 5 | struct Phoneme 6 | { 7 | float f1f, f1b; 8 | float f2f, f2b; 9 | float f3f, f3b; 10 | float fnf; 11 | float a_voicing, a_aspiration, a_frication, a_bypass; 12 | float a_1, a_2, a_3, a_4, a_n, a_56; 13 | float duration, rank; 14 | }; 15 | 16 | #pragma pack (pop) 17 | 18 | // { 490, 60, 1480, 90, 2500, 150, 270, 0, 0, 0,-16,-16,-16,-16,-16,-16,-16, 0, 5, 31}, // 18: end 19 | // { 280, 60, 1720, 90, 2560, 150, 270, 62, 0, 0,-16, 43, 38, 38, 50,-16,-16, 0, 4, 20}, // 68: zz 20 | 21 | // f1f: /10 22 | // f1b: /10 23 | // f2f: /20 24 | // f2b: /10 25 | // f3f: /20 26 | // f3b: /10 27 | // fnf: /10 28 | 29 | #define NPHONEMES 69 30 | #define PTABSIZE 1311 31 | 32 | static const uint8_t multipliers[PTABSIZE/NPHONEMES] = { 10,10,20,10,20,10,10,1,1,1,1,1,1,1,1,1,1,1,1 }; 33 | 34 | 35 | // CHANGES: a_f56 + 15 (-> duration -15) 36 | // a_bypass -3 (-> a_f1 +3) 37 | 38 | static const uint8_t rawphonemes[PTABSIZE] = 39 | { 40 | // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 41 | // f1f (Hz*1/10) 42 | 49, 30,241, 0, 15,226,226, 0, 0, 0, 21,235, 9, 0,247, 0, 45,217, 24, 9,238,235, 0, 0, 30,247,247, 18, 30,196, 9,247, 0, 0, 27, 0, 2, 0, 0, 13,244, 0,244, 0, 12, 30,214,238, 0, 0, 30,235, 21, 0,247, 0,235, 21,235, 0, 51,211, 3,247, 0, 6, 3, 0, 0, 43 | // f1b (Hz*1/10) 44 | 234, 7,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 0, 12,246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45 | // f2f (Hz*1/20) 46 | 68, 15,247, 21,199,253,253, 0, 0, 51, 12,244,247, 0, 9, 0, 12, 15,214,253, 0, 3, 0, 0, 0, 30, 6,220,226, 45, 12,229, 0, 0, 0,229, 3, 39,208, 3, 30,223, 9, 0,247, 24,241,244, 0, 0, 36,253,244, 0, 27, 24,235, 0, 0, 0,235,232, 27,223, 36, 51,217, 15,241, 47 | // f2b (Hz*1/10) 48 | 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 13,241,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49 | // f3f (Hz*1/20) 50 | 116, 0, 0, 0, 0, 0, 0, 0, 0, 9,250, 6,250, 0, 6, 0,247, 35,221, 0, 3, 3, 0, 0,250, 3, 18,235, 0, 9,250, 3, 0, 0,250, 0,241, 21, 9,241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,208, 0, 51,253, 6, 0, 0, 0,247,241, 18,229, 30, 18,235, 0, 0, 51 | // f3b (Hz*1/10) 52 | 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 14,240, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 15,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53 | // fnf (Hz*1/10) 54 | 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,247,247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55 | // a_voicing (dB) 56 | 35, 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 62,230, 26, 0, 0, 0, 0,194, 62,194, 62, 0, 0,194, 62, 0, 0, 0, 0, 0,194, 0, 0, 62, 0, 0, 0,246, 10, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 62, 0,244,206, 0, 0, 0, 0, 0, 62, 0, 0, 0,194, 62,234, 22, 0, 57 | // a_aspiration (dB) 58 | 194, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0,196, 0, 0, 0, 0, 0, 0, 0, 0, 32,224, 0, 0, 60,196, 0, 0, 0, 0, 0, 60, 0, 0,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0,196, 0, 0, 0, 32, 28, 0, 0, 0, 0,196, 0, 0, 0, 60,196, 20,236, 0, 59 | // a_frication (dB) 60 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0,196, 60,196, 0, 0, 0, 0, 0, 0, 54,202, 0, 0, 60,196, 0, 0, 0, 0, 0, 60, 0, 0,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0,196, 0, 0, 0, 60, 0, 0, 0, 0, 0,196, 0, 0, 0, 60,196, 60,196, 0, 61 | // a_bypass (dB) 62 | 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,186, 0, 0, 0, 0, 0, 0, 70,186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63 | // a_f1 (dB) 64 | 83, 0, 0, 0, 0, 0,230, 0,202, 0, 0, 61,254, 0, 9, 0, 12, 0,176, 80,176, 65, 0, 0, 0, 15, 0, 0, 0,237,254,197, 0, 0, 66, 0,246, 9,241, 30, 0, 0, 0, 0, 0, 0, 0,176, 54, 0,202, 59, 13, 0,184, 0, 0, 0, 0, 0, 80, 0,235, 14,183, 80,235, 0, 0, 65 | // a_f2 (dB) 66 | 21,253,254,253, 7,252,181, 79,177, 0, 61,195, 61, 0, 7,246, 14,247,193, 75,211,226, 75,246, 1, 0,255, 15,255,177, 56,200, 80,246,242, 0, 4, 5,251, 17, 3,251,253, 0, 3, 2,251,184, 79,245,188, 70,251, 0,249, 3,195, 56,200, 0, 73,251, 2,244, 12,249,247, 2,254, 67 | // a_f3 (dB) 68 | 9, 5,253, 3,247,249,204, 73,183, 0, 72,184, 56, 0, 9,245, 14,254,190, 63,223,226, 70,245,253, 9, 1,253,252,197, 66,190, 80,246,242, 0, 7, 2, 0,243, 11,245, 6, 0,250, 13,249,198, 73,246,193, 66,255, 0,249, 14,184, 58, 10,246, 3,242, 19,241, 19,254,242, 12,244, 69 | // a_f4 (dB) 70 | 2, 5,254, 2,247,251,209, 68,188, 0, 61,195, 58, 0, 17,246,252, 0,195, 56,200, 0, 54,246, 8, 7, 2,251,252,204, 56,200, 59,246, 2, 0,205, 50,236, 15, 11,247, 5, 0,251, 11,250,204, 68,246,198, 63,193, 0, 70,247,195, 52, 28,246,240,242, 23,193, 49, 12, 5,246, 10, 71 | // a_fn (dB) 72 | 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,200, 0, 66,246, 10,246, 0,246,210, 0, 56,200, 46,210, 66,236, 0, 73 | // a_f56 (dB) 74 | 225, 0, 0, 0, 0, 0, 0, 0, 0, 46,246, 0, 10,236,246,240, 0, 0, 0, 0, 46,210, 0, 0, 26,230, 0, 0, 0, 26,246, 10, 0,246,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46,236, 10,246,230, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 75 | // duration (frames) 76 | 235, 1, 1, 0, 9,251, 2,245,255, 4, 4, 0,252, 0,253, 0, 3, 3,254, 11,252, 0,245, 1, 3, 1, 0, 0, 0,254,255, 5,249, 3, 4, 0, 0, 0, 0,254, 0, 0,254, 2, 0, 0, 0, 2,249, 1, 4,250, 11,255, 2, 0,250, 9,242, 1, 4, 3,251, 4, 4,251,253, 0, 0, 77 | // rank 78 | 254, 0, 0, 0, 0, 0, 24, 3,253,253,251, 8,250, 0, 9,253,232, 0, 29,227, 16, 8, 3,253,239,249, 0, 0, 0, 24,250, 3, 6,250,244, 0, 0, 0, 0,247, 0, 0, 0, 0, 0, 0, 0, 21, 6,250, 6, 1,236, 0, 8, 0, 5,251, 11,250,235, 0, 18,246, 8,248, 10, 0, 0, 79 | }; 80 | 81 | /* 82 | static Phoneme orgphonemes[] = 83 | { 84 | { 490, 60, 1480, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 64, 47, 40,-16,-16, 4, 2}, // 0: a 85 | { 790, 130, 1780, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 61, 52, 45,-16,-16, 5, 2}, // 1: aa 86 | { 640, 60, 1600, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 59, 49, 43,-16,-16, 6, 2}, // 2: ai 87 | { 640, 60, 2020, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 56, 52, 45,-16,-16, 6, 2}, // 3: air 88 | { 790, 60, 880, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 63, 43, 36,-16,-16, 15, 2}, // 4: ar 89 | { 490, 60, 820, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 59, 36, 31,-16,-16, 10, 2}, // 5: aw 90 | { 190, 60, 760, 90, 2500, 150, 270, 62, 0, 0,-16, 38,-16,-16,-16,-16,-16, 12, 26}, // 6: b 91 | { 190, 60, 760, 90, 2500, 150, 270, 62, 0, 0,-16, 38, 63, 57, 52,-16,-16, 1, 29}, // 7: by 92 | { 190, 60, 760, 90, 2500, 150, 270, 62, 0, 0,-16,-16,-16,-16,-16,-16,-16, 0, 26}, // 8: bz 93 | { 190, 60, 1780, 90, 2680, 150, 270, 0, 60, 60,-16,-16,-16,-16,-16,-16, 30, 4, 23}, // 9: ch 94 | { 400, 60, 2020, 90, 2560, 150, 270, 0, 60, 60,-16,-16, 45, 56, 45,-16, 20, 8, 18}, // 10: ci 95 | { 190, 60, 1780, 90, 2680, 150, 270, 62, 0, 0,-16, 45,-16,-16,-16,-16, 20, 8, 26}, // 11: d 96 | { 280, 60, 1600, 90, 2560, 150, 270, 36, 0, 60, 54, 43, 45, 40, 42,-16, 30, 4, 20}, // 12: dh 97 | { 280, 60, 1600, 90, 2560, 150, 270, 62, 0, 0,-16, 43, 45, 40, 42,-16, 10, 4, 20}, // 13: di 98 | { 190, 60, 1780, 90, 2680, 150, 270, 62, 0, 0,-16, 52, 52, 49, 59,-16, 0, 1, 29}, // 14: dy 99 | { 190, 60, 1780, 90, 2680, 150, 270, 62, 0, 0,-16, 52, 42, 38, 49,-16,-16, 1, 26}, // 15: dz 100 | { 640, 60, 2020, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 56, 52, 45,-16,-16, 4, 2}, // 16: e 101 | { 250, 60, 2320, 90, 3200, 150, 270, 62, 0, 0,-16, 64, 47, 50, 45,-16,-16, 7, 2}, // 17: ee 102 | { 490, 60, 1480, 90, 2500, 150, 270, 0, 0, 0,-16,-16,-16,-16,-16,-16,-16, 5, 31}, // 18: end 103 | { 580, 60, 1420, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 59, 47, 40,-16,-16, 16, 2}, // 19: er 104 | { 400, 60, 1420, 90, 2560, 150, 270, 0, 32, 54, 54,-16, 14, 14,-16,-16, 30, 12, 18}, // 20: f 105 | { 190, 60, 1480, 90, 2620, 150, 270, 62, 0, 0,-16, 49,-16,-16,-16,-16,-16, 12, 26}, // 21: g 106 | { 190, 60, 1480, 90, 2620, 150, 270, 62, 0, 0,-16, 49, 59, 54, 38,-16,-16, 1, 29}, // 22: gy 107 | { 190, 60, 1480, 90, 2620, 150, 270, 62, 0, 0,-16, 49, 49, 43, 28,-16,-16, 2, 26}, // 23: gz 108 | { 490, 60, 1480, 90, 2500, 150, 270, 0, 60, 60,-16, 49, 50, 40, 36,-16, 10, 5, 9}, // 24: h 109 | { 400, 60, 2080, 90, 2560, 150, 270, 62, 0, 0,-16, 64, 50, 49, 43,-16,-16, 6, 2}, // 25: i 110 | { 310, 60, 2200, 90, 2920, 150, 270, 62, 0, 0,-16, 64, 49, 50, 45,-16,-16, 6, 2}, // 26: ia 111 | { 490, 60, 1480, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 64, 47, 40,-16,-16, 6, 2}, // 27: ib 112 | { 790, 60, 880, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 63, 43, 36,-16,-16, 6, 2}, // 28: ie 113 | { 190, 60, 1780, 90, 2680, 150, 270, 62, 0, 0,-16, 45,-16,-16,-16,-16, 10, 4, 26}, // 29: j 114 | { 280, 60, 2020, 90, 2560, 150, 270, 62, 0, 0,-16, 43, 40, 50, 40,-16, 0, 3, 20}, // 30: jy 115 | { 190, 60, 1480, 90, 2620, 150, 270, 0, 60, 60,-16,-16,-16,-16,-16,-16, 10, 8, 23}, // 31: k 116 | { 190, 60, 1480, 90, 2620, 150, 270, 0, 60, 60,-16,-16, 64, 64, 43,-16, 10, 1, 29}, // 32: ky 117 | { 190, 60, 1480, 90, 2620, 150, 270, 0, 60, 60,-16,-16, 54, 54, 33,-16, 0, 4, 23}, // 33: kz 118 | { 460, 60, 1480, 90, 2500, 150, 270, 62, 0, 0,-16, 50, 40, 40, 35,-16,-16, 8, 11}, // 34: l 119 | { 460, 60, 940, 90, 2500, 150, 270, 62, 0, 0,-16, 50, 40, 40, 35,-16,-16, 8, 11}, // 35: ll 120 | { 480, 40, 1000, 170, 2200, 120, 360, 62, 0, 0,-16, 40, 44, 47,-16, 56,-16, 8, 11}, // 36: m 121 | { 480, 40, 1780, 300, 2620, 260, 450, 62, 0, 0,-16, 49, 49, 49, 34, 56,-16, 8, 11}, // 37: n 122 | { 480, 160, 820, 150, 2800, 100, 360, 52, 0, 0,-16, 34, 44, 49, 14, 56,-16, 8, 11}, // 38: ng 123 | { 610, 60, 880, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 61, 36, 29,-16,-16, 6, 2}, // 39: o 124 | { 490, 60, 1480, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 64, 47, 40,-16,-16, 6, 2}, // 40: oa 125 | { 490, 60, 820, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 59, 36, 31,-16,-16, 6, 2}, // 41: oi 126 | { 370, 60, 1000, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 56, 42, 36,-16,-16, 4, 2}, // 42: oo 127 | { 370, 60, 1000, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 56, 42, 36,-16,-16, 6, 2}, // 43: oor 128 | { 490, 60, 820, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 59, 36, 31,-16,-16, 6, 2}, // 44: or 129 | { 790, 60, 1300, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 61, 49, 42,-16,-16, 6, 2}, // 45: ou 130 | { 370, 60, 1000, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 56, 42, 36,-16,-16, 6, 2}, // 46: ov 131 | { 190, 60, 760, 90, 2500, 150, 270, 0, 60, 60,-16,-16,-16,-16,-16,-16,-16, 8, 23}, // 47: p 132 | { 190, 60, 760, 90, 2500, 150, 270, 0, 60, 60,-16, 38, 63, 57, 52,-16,-16, 1, 29}, // 48: py 133 | { 190, 60, 760, 90, 2500, 150, 270, 0, 60, 60,-16, 38, 52, 47, 42,-16,-16, 2, 23}, // 49: pz 134 | { 490, 60, 1480, 90, 2500, 150, 270, 0, 0, 0,-16,-16,-16,-16,-16,-16,-16, 6, 29}, // 50: q 135 | { 280, 60, 1420, 90, 2560, 150, 270, 62, 0, 0,-16, 43, 54, 50, 47, 40,-16, 0, 30}, // 51: qq 136 | { 490, 60, 1180, 90, 1600, 150, 270, 62, 0, 0,-16, 56, 49, 49,-16,-16,-16, 11, 10}, // 52: r 137 | { 490, 60, 1180, 90, 1600, 70, 270, 50, 0, 0,-16, 56, 49, 49,-16,-16,-16, 10, 10}, // 53: rx 138 | { 400, 200, 1720, 90, 2620, 220, 270, 0, 32, 60,-16,-16, 42, 42, 54, 50, 30, 12, 18}, // 54: s 139 | { 400, 60, 2200, 90, 2560, 150, 270, 0, 60, 60,-16,-16, 45, 56, 45, 40, 10, 12, 18}, // 55: sh 140 | { 190, 60, 1780, 90, 2680, 150, 270, 0, 60, 60,-16,-16,-16,-16,-16, 50, 20, 6, 23}, // 56: t 141 | { 400, 60, 1780, 90, 2680, 150, 270, 0, 60, 60,-16,-16, 40, 42, 36, 40, 10, 15, 18}, // 57: th 142 | { 190, 60, 1780, 90, 2680, 150, 270, 0, 60, 60,-16,-16,-16, 52, 64, 40,-16, 1, 29}, // 58: ty 143 | { 190, 60, 1780, 90, 2680, 150, 270, 0, 60, 60,-16,-16,-16, 42, 54, 30,-16, 2, 23}, // 59: tz 144 | { 700, 60, 1360, 90, 2500, 150, 270, 62, 0, 0,-16, 64, 57, 45, 38,-16,-16, 6, 2}, // 60: u 145 | { 250, 60, 880, 90, 2200, 150, 270, 62, 0, 0,-16, 64, 52, 31, 24,-16,-16, 9, 2}, // 61: uu 146 | { 280, 60, 1420, 90, 2560, 150, 270, 62, 0, 0,-16, 43, 54, 50, 47, 40,-16, 4, 20}, // 62: v 147 | { 190, 60, 760, 90, 2020, 150, 270, 62, 0, 0,-16, 57, 42, 35,-16,-16,-16, 8, 10}, // 63: w 148 | { 190, 60, 1480, 90, 2620, 150, 270, 0, 60, 60,-16,-16, 54, 54, 33, 30,-16, 12, 18}, // 64: x 149 | { 250, 60, 2500, 90, 2980, 150, 270, 62, 0, 0,-16, 64, 47, 52, 45,-16,-16, 7, 10}, // 65: y 150 | { 280, 60, 1720, 90, 2560, 150, 270, 40, 20, 60,-16, 43, 38, 38, 50, 50,-16, 4, 20}, // 66: z 151 | { 280, 60, 2020, 90, 2560, 150, 270, 62, 0, 0,-16, 43, 40, 50, 40, 30, 10, 4, 20}, // 67: zh 152 | { 280, 60, 1720, 90, 2560, 150, 270, 62, 0, 0,-16, 43, 38, 38, 50, 30, 10, 4, 20}, // 68: zz 153 | }; 154 | */ -------------------------------------------------------------------------------- /src/ronan.cpp: -------------------------------------------------------------------------------- 1 | // ronan hei 2 | 3 | // !DHAX_ !kwIH_k !br4AH_UHn !fAA_ks !jAH_mps !OW!vE_R !DHAX_ !lEY!zIY_ !dAA_g 4 | 5 | #ifdef RONAN 6 | 7 | #include "types.h" 8 | #include 9 | #include 10 | 11 | #define sFPow(a, b) powf(a, b) 12 | #define sFExp(a) expf(a) 13 | 14 | #ifndef sCopyMem 15 | #define sCopyMem memcpy 16 | #endif 17 | 18 | namespace Ronan 19 | { 20 | 21 | int mystrnicmp1(const char *a, const char *b) 22 | { 23 | int l = 0; 24 | while (*a && *b) 25 | if ((*a++ | 0x20) != (*b++ | 0x20)) 26 | return 0; 27 | else 28 | l++; 29 | return *a ? 0 : l; 30 | } 31 | 32 | 33 | #define PI (4.0f*(float)atan(1.0f)) 34 | 35 | #include "phonemtab.h" 36 | 37 | static Phoneme phonemes[NPHONEMES]; 38 | 39 | static struct 40 | { 41 | uint32_t samplerate; 42 | float fcminuspi_sr; 43 | float fc2pi_sr; 44 | } g; 45 | 46 | 47 | static const char *nix = ""; 48 | 49 | static const struct syldef 50 | { 51 | char syl[4]; 52 | int8_t ptab[4]; 53 | } syls[] = { 54 | {"sil",{50,-1,-1,-1}}, 55 | {"ng",{38,-1,-1,-1}}, 56 | {"th",{57,-1,-1,-1}}, 57 | {"sh",{55,-1,-1,-1}}, 58 | {"dh",{12,51,13,-1}}, 59 | {"zh",{67,51,67,-1}}, 60 | {"ch",{ 9,10,-1,-1}}, 61 | {"ih",{25,-1,-1,-1}}, 62 | {"eh",{16,-1,-1,-1}}, 63 | {"ae",{ 1,-1,-1,-1}}, 64 | {"ah",{60,-1,-1,-1}}, 65 | {"oh",{39,-1,-1,-1}}, 66 | {"uh",{42,-1,-1,-1}}, 67 | {"ax",{ 0,-1,-1,-1}}, 68 | {"iy",{17,-1,-1,-1}}, 69 | {"er",{19,-1,-1,-1}}, 70 | {"aa",{ 4,-1,-1,-1}}, 71 | {"ao",{ 5,-1,-1,-1}}, 72 | {"uw",{61,-1,-1,-1}}, 73 | {"ey",{ 2,25,-1,-1}}, 74 | {"ay",{28,25,-1,-1}}, 75 | {"oy",{41,25,-1,-1}}, 76 | {"aw",{45,46,-1,-1}}, 77 | {"ow",{40,46,-1,-1}}, 78 | {"ia",{26,27,-1,-1}}, 79 | {"ea",{ 3,27,-1,-1}}, 80 | {"ua",{43,27,-1,-1}}, 81 | {"ll",{35,-1,-1,-1}}, 82 | {"wh",{63,-1,-1,-1}}, 83 | {"ix",{ 0,-1,-1,-1}}, 84 | {"el",{34,-1,-1,-1}}, 85 | {"rx",{53,-1,-1,-1}}, 86 | {"h",{24,-1,-1,-1}}, 87 | {"p",{47,48,49,-1}}, 88 | {"t",{56,58,59,-1}}, 89 | {"k",{31,32,33,-1}}, 90 | {"b",{ 6, 7, 8,-1}}, 91 | {"d",{11,14,15,-1}}, 92 | {"g",{21,22,23,-1}}, 93 | {"m",{36,-1,-1,-1}}, 94 | {"n",{37,-1,-1,-1}}, 95 | {"f",{20,-1,-1,-1}}, 96 | {"s",{54,-1,-1,-1}}, 97 | {"v",{62,51,62,-1}}, 98 | {"z",{66,51,68,-1}}, 99 | {"l",{34,-1,-1,-1}}, 100 | {"r",{52,-1,-1,-1}}, 101 | {"w",{63,-1,-1,-1}}, 102 | {"q",{51,-1,-1,-1}}, 103 | {"y",{65,-1,-1,-1}}, 104 | {"j",{29,30,51,30}}, 105 | {" ",{18,-1,-1,-1}}, 106 | }; 107 | #define NSYLS (sizeof(syls)/sizeof(syldef)) 108 | 109 | // filter type 1: 2-pole resonator 110 | struct ResDef 111 | { 112 | float a, b, c; // coefficients 113 | 114 | void set(float f, float bw, float gain) 115 | { 116 | float r = (float)sFExp(g.fcminuspi_sr*bw); 117 | c = -(r*r); 118 | b = r*(float)cos(g.fc2pi_sr*f)*2.0f; 119 | a = gain*(1.0f - b - c); 120 | } 121 | }; 122 | 123 | struct Resonator 124 | { 125 | ResDef *def; 126 | float p1, p2; // delay buffers 127 | 128 | inline void setdef(ResDef &a_def) { def = &a_def; } 129 | 130 | float tick(float in) 131 | { 132 | float x = def->a*in + def->b*p1 + def->c*p2; 133 | p2 = p1; 134 | p1 = x; 135 | return x; 136 | } 137 | }; 138 | 139 | 140 | static ResDef d_peq1; 141 | 142 | static float flerp(const float a, const float b, const float x) { return a + x*(b - a); } 143 | static float db2lin(float db1, float db2, float x) { return (float)sFPow(2.0, (flerp(db1, db2, x) - 70)/6.0); } 144 | static const float f4 = 3200; 145 | static const float f5 = 4000; 146 | static const float f6 = 6000; 147 | static const float bn = 100; 148 | static const float b4 = 200; 149 | static const float b5 = 500; 150 | static const float b6 = 800; 151 | 152 | struct syVRonan 153 | { 154 | ResDef rdef[7]; // nas,f1,f2,f3,f4,f5,f6; 155 | float a_voicing; 156 | float a_aspiration; 157 | float a_frication; 158 | float a_bypass; 159 | }; 160 | 161 | 162 | struct syWRonan : syVRonan 163 | { 164 | syVRonan newframe; 165 | 166 | Resonator res[7]; // 0:nas, 1..6: 1..6 167 | 168 | float lastin2; 169 | 170 | // settings 171 | const char *texts[64]; 172 | float pitch; 173 | int framerate; 174 | 175 | // noise 176 | uint32_t nseed; 177 | float nout; 178 | 179 | // phonem seq 180 | int framecount; // frame rate divider 181 | int spos; // pos within syl definition (0..3) 182 | int scounter; // syl duration divider 183 | int cursyl; // current syl 184 | int durfactor; // duration modifier 185 | float invdur; // 1.0 / current duration 186 | const char *baseptr; // pointer to start of text 187 | const char *ptr; // pointer to text 188 | int curp1, curp2; // current/last phonemes 189 | 190 | // sync 191 | int wait4on; 192 | int wait4off; 193 | 194 | // post EQ 195 | float hpb1, hpb2; 196 | Resonator peq1; 197 | 198 | void SetFrame(const Phoneme &p1s, const Phoneme &p2s, const float x, syVRonan &dest) 199 | { 200 | Phoneme p1,p2; 201 | 202 | const float * const p1f[] = { &p1.fnf, &p1.f1f, &p1.f2f, &p1.f3f, &f4 , &f5 , &f6}; 203 | const float * const p1b[] = { &bn , &p1.f1b, &p1.f2b, &p1.f3b, &b4 , &b5 , &b6}; 204 | const float * const p1a[] = { &p1.a_n, &p1.a_1, &p1.a_2, &p1.a_3, &p1.a_4, &p1.a_56, &p1.a_56}; 205 | 206 | const float * const p2f[] = { &p2.fnf, &p2.f1f, &p2.f2f, &p2.f3f, &f4 , &f5 , &f6}; 207 | const float * const p2b[] = { &bn , &p2.f1b, &p2.f2b, &p2.f3b, &b4 , &b5 , &b6}; 208 | const float * const p2a[] = { &p2.a_n, &p2.a_1, &p2.a_2, &p2.a_3, &p2.a_4, &p2.a_56, &p2.a_56}; 209 | 210 | p1 = p1s; 211 | p2 = p2s; 212 | 213 | for (int i = 0; i < 7; i++) 214 | dest.rdef[i].set(flerp(*p1f[i], *p2f[i], x)*pitch, flerp(*p1b[i], *p2b[i], x), db2lin(*p1a[i], *p2a[i], x)); 215 | 216 | dest.a_voicing = db2lin(p1.a_voicing, p2.a_voicing, x); 217 | dest.a_aspiration = db2lin(p1.a_aspiration, p2.a_aspiration, x); 218 | dest.a_frication = db2lin(p1.a_frication, p2.a_frication, x); 219 | dest.a_bypass = db2lin(p1.a_bypass, p2.a_bypass, x); 220 | } 221 | 222 | 223 | #define NOISEGAIN 0.25f 224 | float noise() 225 | { 226 | union { uint32_t i; float f; } val; 227 | 228 | // random... 229 | nseed = (nseed*196314165) + 907633515; 230 | 231 | // convert to float between 2.0 and 4.0 232 | val.i = (nseed >> 9) | 0x40000000; 233 | 234 | // slight low pass filter... 235 | nout = (val.f - 3.0f) + 0.75f*nout; 236 | return nout*NOISEGAIN; 237 | } 238 | 239 | void reset() 240 | { 241 | for (int i = 0; i < 7; i++) res[i].setdef(rdef[i]); 242 | peq1.setdef(d_peq1); 243 | SetFrame(phonemes[18], phonemes[18], 0, *this); // off 244 | SetFrame(phonemes[18], phonemes[18], 0, newframe); // off 245 | curp1 = curp2 = 18; 246 | spos = 4; 247 | } 248 | }; 249 | 250 | // ----------------------------------------------------------------------- 251 | }; 252 | 253 | using namespace Ronan; 254 | 255 | extern "C" void ronanCBSetSR(syWRonan *ptr, uint32_t sr) 256 | { 257 | g.samplerate = sr; 258 | g.fc2pi_sr = 2.0f*PI/(float)sr; 259 | g.fcminuspi_sr = -g.fc2pi_sr*0.5f; 260 | } 261 | 262 | 263 | extern "C" void ronanCBInit(syWRonan *wsptr) 264 | { 265 | // convert phoneme table to a usable format 266 | const int8_t *ptr = (const int8_t*)rawphonemes; 267 | int32_t val = 0; 268 | for (int f = 0; f < (PTABSIZE/NPHONEMES); f++) 269 | { 270 | float *dest = ((float*)phonemes) + f; 271 | for (int p = 0; p < NPHONEMES; p++) 272 | { 273 | *dest = multipliers[f]*(float)(val += *ptr++); 274 | dest += PTABSIZE/NPHONEMES; 275 | } 276 | } 277 | 278 | wsptr->reset(); 279 | 280 | wsptr->framerate = 3; 281 | wsptr->pitch = 1.0f; 282 | 283 | if (!wsptr->texts[0]) 284 | wsptr->baseptr = wsptr->ptr = nix; 285 | else 286 | wsptr->baseptr = wsptr->ptr = wsptr->texts[0]; 287 | 288 | /*wsptr->lastin = */wsptr->lastin2 = /*wsptr->nval=*/0; 289 | 290 | d_peq1.set(12000, 4000, 2.0f); 291 | } 292 | 293 | 294 | extern "C" void ronanCBTick(syWRonan *wsptr) 295 | { 296 | if (wsptr->wait4off || wsptr->wait4on) return; 297 | 298 | if (!wsptr->ptr) return; 299 | 300 | if (wsptr->framecount <= 0) 301 | { 302 | wsptr->framecount = wsptr->framerate; 303 | // let current phoneme expire 304 | if (wsptr->scounter <= 0) 305 | { 306 | // set to next phoneme 307 | wsptr->spos++; 308 | if (wsptr->spos >= 4 || syls[wsptr->cursyl].ptab[wsptr->spos] == -1) 309 | { 310 | // go to next syllable 311 | 312 | if ((wsptr->ptr == 0) || (wsptr->ptr[0] == 0)) // empty text: silence! 313 | { 314 | wsptr->durfactor = 1; 315 | wsptr->framecount = 1; 316 | wsptr->cursyl = NSYLS - 1; 317 | wsptr->spos = 0; 318 | wsptr->ptr = wsptr->baseptr; 319 | } 320 | else if (*wsptr->ptr == '!') // wait for noteon 321 | { 322 | wsptr->framecount = 0; 323 | wsptr->scounter = 0; 324 | wsptr->wait4on = 1; 325 | wsptr->ptr++; 326 | return; 327 | } 328 | else if (*wsptr->ptr == '_') // noteoff 329 | { 330 | wsptr->framecount = 0; 331 | wsptr->scounter = 0; 332 | wsptr->wait4off = 1; 333 | wsptr->ptr++; 334 | return; 335 | } 336 | 337 | if (*wsptr->ptr && *wsptr->ptr != '!' && *wsptr->ptr != '_') 338 | { 339 | wsptr->durfactor = 0; 340 | while (*wsptr->ptr >= '0' && *wsptr->ptr <= '9') wsptr->durfactor = 10*wsptr->durfactor + (*wsptr->ptr++ - '0'); 341 | if (!wsptr->durfactor) wsptr->durfactor = 1; 342 | 343 | // printf2("'%s' -> ",wsptr->ptr); 344 | 345 | int fs, len = 1, len2; 346 | for (fs = 0; fs < NSYLS - 1; fs++) 347 | { 348 | const syldef &s = syls[fs]; 349 | if (len2 = mystrnicmp1(s.syl, wsptr->ptr)) 350 | { 351 | len = len2; 352 | // printf2("got %s\n",s.syl); 353 | break; 354 | } 355 | } 356 | wsptr->cursyl = fs; 357 | wsptr->spos = 0; 358 | wsptr->ptr += len; 359 | } 360 | } 361 | 362 | wsptr->curp1 = wsptr->curp2; 363 | wsptr->curp2 = syls[wsptr->cursyl].ptab[wsptr->spos]; 364 | wsptr->scounter = round(phonemes[wsptr->curp2].duration*wsptr->durfactor); 365 | if (!wsptr->scounter) wsptr->scounter = 1; 366 | wsptr->invdur = 1.0f/((float)wsptr->scounter*wsptr->framerate); 367 | } 368 | wsptr->scounter--; 369 | } 370 | 371 | wsptr->framecount--; 372 | float x = (float)(wsptr->scounter*wsptr->framerate + wsptr->framecount)*wsptr->invdur; 373 | const Phoneme &p1 = phonemes[wsptr->curp1]; 374 | const Phoneme &p2 = phonemes[wsptr->curp2]; 375 | x = (float)sFPow(x, (float)p1.rank/(float)p2.rank); 376 | wsptr->SetFrame(p2, (fabs(p2.rank - p1.rank) > 8.0f) ? p2 : p1, x, wsptr->newframe); 377 | } 378 | 379 | extern "C" void ronanCBNoteOn(syWRonan *wsptr) 380 | { 381 | wsptr->wait4on = 0; 382 | } 383 | 384 | extern "C" void ronanCBNoteOff(syWRonan *wsptr) 385 | { 386 | wsptr->wait4off = 0; 387 | } 388 | 389 | extern "C" void ronanCBSetCtl(syWRonan *wsptr, uint32_t ctl, uint32_t val) 390 | { 391 | // controller 4, 0-63 : set text # 392 | // controller 4, 64-127 : set frame rate 393 | // controller 5 : set pitch 394 | switch (ctl) 395 | { 396 | case 4: 397 | if (val < 63) 398 | { 399 | wsptr->reset(); 400 | 401 | if (wsptr->texts[val]) 402 | wsptr->ptr = wsptr->baseptr = wsptr->texts[val]; 403 | else 404 | wsptr->ptr = wsptr->baseptr = nix; 405 | wsptr->wait4on = wsptr->wait4off = false; 406 | ronanCBTick(wsptr); 407 | } else 408 | wsptr->framerate = val - 63; 409 | break; 410 | case 5: 411 | wsptr->pitch = (float)sFPow(2.0f, (val-64.0f)/128.0f); 412 | break; 413 | 414 | } 415 | } 416 | 417 | extern "C" void ronanCBProcess(syWRonan *wsptr, float *buf, uint32_t len) 418 | { 419 | syVRonan deltaframe; 420 | 421 | // prepare interpolation 422 | { 423 | float *src1 = (float*)wsptr; 424 | float *src2 = (float*)&wsptr->newframe; 425 | float *dest = (float*)&deltaframe; 426 | float mul = 1.0f/(float)len; 427 | for (uint32_t i = 0; i < (sizeof(syVRonan)/sizeof(float)); i++) 428 | dest[i] = (src2[i] - src1[i])*mul; 429 | } 430 | 431 | for (uint32_t i = 0; i < len; i++) 432 | { 433 | // interpolate all values 434 | { 435 | float *src = (float*)&deltaframe; 436 | float *dest = (float*)wsptr; 437 | for (uint32_t i = 0; i < (sizeof(syVRonan)/sizeof(float)); i++) 438 | dest[i] += src[i]; 439 | } 440 | 441 | float in = buf[2*i]; 442 | 443 | // add aspiration noise 444 | in = in*wsptr->a_voicing + wsptr->noise()*wsptr->a_aspiration; 445 | 446 | // process complete input signal with f1/nasal filters 447 | float out = wsptr->res[0].tick(in) + wsptr->res[1].tick(in); 448 | 449 | // differentiate input signal, add frication noise 450 | float lin = in; 451 | in = (wsptr->noise()*wsptr->a_frication) + in - wsptr->lastin2; 452 | wsptr->lastin2 = lin; 453 | 454 | // process diff/fric input signal with f2..f6 and bypass (phase inverted) 455 | for (int r = 2; r < 7; r++) 456 | out = wsptr->res[r].tick(in) - out; 457 | 458 | out = in*wsptr->a_bypass - out; 459 | 460 | // high pass filter 461 | wsptr->hpb1 += 0.012f*(out = out - wsptr->hpb1); 462 | wsptr->hpb2 += 0.012f*(out = out - wsptr->hpb2); 463 | 464 | // EQ 465 | out = wsptr->peq1.tick(out) - out; 466 | 467 | buf[2*i] = buf[2*i + 1] = out; 468 | } 469 | } 470 | 471 | extern "C" void* synthGetSpeechMem(void *a_pthis); 472 | 473 | extern "C" void synthSetLyrics(void *a_pthis, const char **a_ptr) 474 | { 475 | syWRonan *wsptr = (syWRonan*)synthGetSpeechMem(a_pthis); 476 | for (int i = 0; i < 64; i++) wsptr->texts[i] = a_ptr[i]; 477 | wsptr->baseptr = wsptr->ptr = wsptr->texts[0]; 478 | } 479 | #endif 480 | -------------------------------------------------------------------------------- /src/sounddef.cpp: -------------------------------------------------------------------------------- 1 | #include "types.h" 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | #include "sounddef.h" 8 | #include "v2mconv.h" 9 | 10 | const char *v2sources[] = 11 | { 12 | "Velocity", 13 | "Modulation", 14 | "Breath", 15 | "Ctl #3", 16 | "Ctl #4", 17 | "Ctl #5", 18 | "Ctl #6", 19 | "Volume", 20 | "Amp EG", 21 | "EG 2", 22 | "LFO 1", 23 | "LFO 2", 24 | "Note", 25 | }; 26 | const int v2nsources = sizeof(v2sources)/sizeof(char *); 27 | 28 | // lr: in case you miss the arrays: look in sounddef.h 29 | static unsigned char v2clipboard[v2soundsize]; 30 | static char v2clipname[256]; 31 | 32 | unsigned char *soundmem; 33 | long *patchoffsets; 34 | unsigned char *editmem; 35 | char patchnames[128][32]; 36 | char globals[v2ngparms]; 37 | int v2version; 38 | int *v2vsizes; 39 | int *v2gsizes; 40 | int *v2topics2; 41 | int *v2gtopics2; 42 | int v2curpatch; 43 | 44 | #ifdef RONAN 45 | char speech[64][256]; 46 | char *speechptrs[64]; 47 | #endif 48 | 49 | void sdInit() 50 | { 51 | soundmem = new unsigned char [smsize + v2soundsize]; 52 | patchoffsets = (long *)soundmem; 53 | unsigned char *sptr = soundmem + 128*4; 54 | 55 | // printf("sound size: %d\n",v2nparms); 56 | char s[256]; 57 | 58 | for (int i = 0; i < 129; i++) 59 | { 60 | if (i < 128) 61 | { 62 | patchoffsets[i] = (long)(sptr - soundmem); 63 | sprintf(s, "Init Patch #%03d", i); 64 | strcpy(patchnames[i], s); 65 | } else 66 | editmem = sptr; 67 | memcpy(sptr, v2initsnd, v2soundsize); 68 | sptr += v2soundsize; 69 | } 70 | for (int i = 0; i < v2ngparms; i++) 71 | globals[i] = v2initglobs[i]; 72 | 73 | memcpy(v2clipboard, v2initsnd, v2soundsize); 74 | sprintf(v2clipname, "Init Patch"); 75 | 76 | // init version control 77 | v2version = 0; 78 | for (int i = 0; i < v2nparms; i++) 79 | if (v2parms[i].version > v2version) 80 | v2version = v2parms[i].version; 81 | for (int i = 0; i < v2ngparms; i++) 82 | if (v2gparms[i].version > v2version) 83 | v2version = v2gparms[i].version; 84 | 85 | v2vsizes = new int[v2version + 1]; 86 | v2gsizes = new int[v2version + 1]; 87 | memset(v2vsizes, 0, (v2version + 1)*sizeof(int)); 88 | memset(v2gsizes, 0, (v2version + 1)*sizeof(int)); 89 | for (int i = 0; i < v2nparms; i++) 90 | { 91 | const V2PARAM &p = v2parms[i]; 92 | // ATLASSERT(p.version<=v2version); 93 | for (int j = v2version; j >= p.version; j--) 94 | v2vsizes[j]++; 95 | } 96 | for (int i = 0; i < v2ngparms; i++) 97 | { 98 | const V2PARAM &p = v2gparms[i]; 99 | //ATLASSERT(p.version<=v2version); 100 | for (int j = v2version; j >= p.version; j--) 101 | v2gsizes[j]++; 102 | } 103 | //ATLASSERT(v2vsizes[v2version]==v2nparms); 104 | 105 | for (int i = 0; i <= v2version; i++) 106 | { 107 | // printf("size of version %d sound bank: %d params, %d globals\n",i,v2vsizes[i],v2gsizes[i]); 108 | v2vsizes[i] += 1 + 255*3; 109 | } 110 | 111 | v2topics2 = new int[v2ntopics]; 112 | int p = 0; 113 | for (int i = 0; i < v2ntopics; i++) 114 | { 115 | v2topics2[i] = p; 116 | p += v2topics[i].no; 117 | } 118 | 119 | v2gtopics2 = new int[v2ngtopics]; 120 | p = 0; 121 | for (int i = 0; i < v2ngtopics; i++) 122 | { 123 | v2gtopics2[i] = p; 124 | p += v2gtopics[i].no; 125 | } 126 | 127 | #ifdef RONAN 128 | memset(speech, 0, 64*256); 129 | for (int i = 0; i < 64; i++) 130 | speechptrs[i] = speech[i]; 131 | 132 | strcpy(speech[0], "!DHAX_ !kwIH_k !br4AH_UHn !fAA_ks !jAH_mps !OW!vER_ !DHAX_ !lEY!zIY_ !dAA_g "); 133 | #endif 134 | } 135 | 136 | void sdClose() 137 | { 138 | delete[] soundmem; 139 | delete[] v2vsizes; 140 | delete[] v2gsizes; 141 | delete[] v2topics2; 142 | delete[] v2gtopics2; 143 | } 144 | 145 | void sdCopyPatch() 146 | { 147 | memcpy(v2clipboard, soundmem + 128*4 + v2curpatch*v2soundsize, v2soundsize); 148 | strcpy(v2clipname, patchnames[v2curpatch]); 149 | } 150 | 151 | void sdPastePatch() 152 | { 153 | memcpy(soundmem + 128*4 + v2curpatch*v2soundsize, v2clipboard, v2soundsize); 154 | strcpy(patchnames[v2curpatch], v2clipname); 155 | } 156 | 157 | void sdInitPatch() 158 | { 159 | memcpy(soundmem + 128*4 + v2curpatch*v2soundsize, v2initsnd, v2soundsize); 160 | sprintf(patchnames[v2curpatch], "Init Patch #%03d", v2curpatch); 161 | } 162 | -------------------------------------------------------------------------------- /src/synth.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | extern "C" 4 | { 5 | extern unsigned int synthGetSize(); 6 | 7 | extern void synthInit(void *pthis, const void *patchmap, int samplerate=44100); 8 | extern void synthRender(void *pthis, void *buf, int smp, void *buf2=0, int add=0); 9 | extern void synthProcessMIDI(void *pthis, const void *ptr); 10 | extern void synthSetGlobals(void *pthis, const void *ptr); 11 | // extern void synthSetSampler(void *pthis, const void *bankinfo, const void *samples); 12 | extern void synthGetPoly(void *pthis, void *dest); 13 | extern void synthGetPgm(void *pthis, void *dest); 14 | // extern void synthGetLD(void *pthis, float *l, float *r); 15 | 16 | // only if VUMETER define is set in synth source 17 | 18 | // vu output values are floats, 1.0 == 0dB 19 | // you might want to clip or logarithmize the values for yourself 20 | extern void synthSetVUMode(void *pthis, int mode); // 0: peak, 1: rms 21 | extern void synthGetChannelVU(void *pthis, int ch, float *l, float *r); // ch: 0..15 22 | extern void synthGetMainVU(void *pthis, float *l, float *r); 23 | 24 | extern long synthGetFrameSize(void *pthis); 25 | 26 | #ifdef RONAN 27 | extern void synthSetLyrics(void *pthis, const char **ptr); 28 | #endif 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/tinyplayer.cpp: -------------------------------------------------------------------------------- 1 | /*************************************************************************************/ 2 | /*************************************************************************************/ 3 | /** **/ 4 | /** Tinyplayer - TibV2 example **/ 5 | /** written by Tammo 'kb' Hinrichs 2000-2008 **/ 6 | /** This file is in the public domain **/ 7 | /** "Patient Zero" is (C) Melwyn+LB 2005, do not redistribute **/ 8 | /** **/ 9 | /*************************************************************************************/ 10 | /*************************************************************************************/ 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | #include 17 | 18 | #include "v2mplayer.h" 19 | #include "libv2.h" 20 | #include "v2mconv.h" 21 | #include "sounddef.h" 22 | 23 | #include "version.h" 24 | 25 | static V2MPlayer player; 26 | static SDL_AudioDeviceID dev; 27 | 28 | //////////////////////////////////////////////////////////////////////////////////////////////////// 29 | static void V2mPlayerTitle() 30 | { 31 | printf("Farbrausch Tiny Music Player v0.dontcare TWO\n"); 32 | printf("Code and Synthesizer (C) 2000-2008 kb/Farbrausch\n"); 33 | printf("Version: %s\n", V2M_VERSION); 34 | printf("SDL Port by %s\n\n", V2M_URL); 35 | } 36 | static void V2mPlayerUsage() 37 | { 38 | printf("Usage : v2mplayer [options] input_file_v2m | - (stdin)\n\n"); 39 | printf("options:\n"); 40 | printf(" -s N.N start at position (float, optional, in s., default = 0.0)\n"); 41 | printf(" -g N.N gain (float, optional, default = 1.0)\n"); 42 | printf(" -f N frame size for SDL (int, optional, default = 1024)\n"); 43 | printf(" -k key/auto stop (bool, optional, default = false)\n"); 44 | printf(" -o str output v2m newest version (string, optional, default = none)\n"); 45 | printf(" -h this help\n"); 46 | } 47 | 48 | static float gain = 1.0f; 49 | static int frame_size = 1024; 50 | static void sdl_callback(void *userdata, Uint8 * stream, int len) { 51 | float* buf = (float*) stream; 52 | player.Render(buf, len / 8); 53 | for (int i = 0; i < (len / 4); ++i) { 54 | buf[i] *= gain; 55 | } 56 | } 57 | 58 | static bool init_sdl() 59 | { 60 | if (SDL_Init(SDL_INIT_AUDIO) < 0) 61 | { 62 | SDL_Log("Couldn't initialize SDL: %s\n",SDL_GetError()); 63 | SDL_Quit(); 64 | return false; 65 | } 66 | 67 | SDL_AudioSpec desired, actual; 68 | desired.channels = 2; 69 | desired.freq = 44100; 70 | desired.samples = frame_size; 71 | desired.format = AUDIO_F32; 72 | desired.callback = sdl_callback; 73 | 74 | dev = SDL_OpenAudioDevice(NULL, 0, &desired, &actual, 0); 75 | if (! dev) 76 | { 77 | SDL_Log("Failed to open audio, %s\n", SDL_GetError()); 78 | return false; 79 | } 80 | 81 | return true; 82 | } 83 | 84 | static unsigned char* check_and_convert(unsigned char* tune, unsigned int* length) 85 | { 86 | sdInit(); 87 | 88 | if (tune[2] != 0 || tune[3] != 0) 89 | { 90 | SDL_LogCritical(SDL_LOG_CATEGORY_INPUT, "No valid input file"); 91 | return NULL; 92 | } 93 | ssbase base; 94 | int version = CheckV2MVersion(tune, *length, base); 95 | if (version < 0) 96 | { 97 | SDL_LogCritical(SDL_LOG_CATEGORY_INPUT, "Failed to Check Version on input file"); 98 | return NULL; 99 | } 100 | 101 | uint8_t* converted; 102 | int converted_length; 103 | ConvertV2M(tune, *length, &converted, &converted_length); 104 | *length = converted_length; 105 | free(tune); 106 | 107 | return converted; 108 | } 109 | 110 | int main(int argc, char** argv) 111 | { 112 | V2mPlayerTitle(); 113 | int opt; 114 | int startPos = 0; 115 | int fouts = 0; 116 | int fkey = 0; 117 | int fhelp = 0; 118 | char *foutput; 119 | while ((opt = getopt(argc, argv, "ko:hs:g:f:")) != -1) 120 | { 121 | switch(opt) 122 | { 123 | case 'k': 124 | fkey = 1; 125 | break; 126 | case 'o': 127 | foutput = optarg; 128 | fouts = 1; 129 | break; 130 | case 'h': 131 | fhelp = 1; 132 | break; 133 | case 'g': 134 | gain = atof(optarg); 135 | break; 136 | case 'f': 137 | frame_size = atoi(optarg); 138 | frame_size = (frame_size < 64) ? 64 : ((frame_size < 16384) ? frame_size : 16384); 139 | break; 140 | case 's': 141 | startPos = (int)(atof(optarg) * 1000); 142 | startPos = (startPos < 0) ? 0 : startPos; 143 | break; 144 | case ':': 145 | printf("option needs a value\n"); 146 | break; 147 | case '?': 148 | printf("unknown option: %c\n", optopt); 149 | break; 150 | } 151 | } 152 | 153 | if((fhelp > 0)||(optind + 1 > argc)) 154 | { 155 | V2mPlayerUsage(); 156 | return 1; 157 | } 158 | unsigned char* theTune; 159 | FILE* file; 160 | uint64_t size; 161 | unsigned int blksz = 4096, read = 0, eofcnt = 0; 162 | char ch; 163 | const char *v2m_filename = argv[optind]; 164 | if (strcmp(v2m_filename, "-") == 0) 165 | { 166 | file = stdin; 167 | eofcnt = 0; 168 | size = blksz; 169 | theTune = (unsigned char*) calloc(1, size); 170 | if (theTune == NULL) 171 | { 172 | fprintf(stderr, "Error memory allocator: %Ld b\n", size); 173 | exit(1); 174 | } 175 | ch = getc(stdin); 176 | while (ch != EOF || eofcnt < blksz) 177 | { 178 | if (ch != EOF) {eofcnt = 0;} else {eofcnt++;} 179 | if (read == size) 180 | { 181 | size += blksz; 182 | theTune = (unsigned char*)realloc(theTune, size * sizeof(unsigned char)); 183 | if (theTune == NULL) 184 | { 185 | fprintf(stderr, "Error memory allocator: %lu b\n", size); 186 | exit(1); 187 | } 188 | } 189 | theTune[read] = ch; 190 | read++; 191 | ch = getc(stdin); 192 | } 193 | read -= eofcnt; 194 | 195 | printf("Now Playing: stdin(%d[%lu])\n", read, size); 196 | size = read; 197 | } else { 198 | file = fopen(v2m_filename, "rb"); 199 | if (file == NULL) 200 | { 201 | fprintf(stderr, "Failed to open %s\n", v2m_filename); 202 | return 1; 203 | } 204 | 205 | fseek(file, 0, SEEK_END); 206 | size = ftell(file); 207 | fseek(file, 0, SEEK_SET); 208 | printf("Now Playing: %s\n", v2m_filename); 209 | theTune = (unsigned char*) calloc(1, size); 210 | if (theTune == NULL) 211 | { 212 | fprintf(stderr, "Error memory allocator: %Ld b\n", size); 213 | exit(1); 214 | } 215 | read = fread(theTune, 1, size, file); 216 | } 217 | if (size != read) 218 | { 219 | fprintf(stderr, "Invalid read size\n"); 220 | return 1; 221 | } 222 | fclose(file); 223 | theTune = check_and_convert(theTune, &read); 224 | if (theTune == NULL) 225 | { 226 | fprintf(stderr, "Error convert to newest\n"); 227 | exit(1); 228 | } 229 | printf("Convert: %d b\n", read); 230 | while (theTune[read--] == 0){} 231 | read++; 232 | read++; 233 | printf("Strip: %d b\n", read); 234 | 235 | if (fouts) 236 | { 237 | FILE* fout; 238 | fout = fopen(foutput, "a"); 239 | if (fout == NULL) 240 | { 241 | fprintf(stderr, "Failed to open %s\n", foutput); 242 | return 1; 243 | } 244 | fwrite(theTune, 1, read, fout); 245 | fclose(fout); 246 | } 247 | 248 | player.Init(); 249 | player.Open(theTune); 250 | 251 | if (! init_sdl()) { 252 | return 1; 253 | } 254 | 255 | player.Play(startPos); 256 | SDL_PauseAudioDevice(dev, 0); 257 | 258 | printf("Length: %d\n", player.Length()); 259 | if (fkey > 0) 260 | { 261 | printf("\n\npress Enter to quit\n"); 262 | getc(stdin); 263 | } else { 264 | while(player.IsPlaying()) { sleep(1); } 265 | } 266 | 267 | SDL_PauseAudioDevice(dev, 1); 268 | SDL_Quit(); 269 | player.Close(); 270 | free(theTune); 271 | return 0; 272 | } 273 | -------------------------------------------------------------------------------- /src/types.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define sTRUE 1 4 | #define sFALSE 0 5 | -------------------------------------------------------------------------------- /src/v2mconv.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "types.h" 3 | #include "v2mconv.h" 4 | #include "sounddef.h" 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #define printf2(str, ...) 11 | 12 | extern const char * const v2mconv_errors[] = 13 | { 14 | "no error", 15 | "V2M file contains no patch data! (forgot program changes?)", 16 | "V2M file was made with unknown synth version!", 17 | }; 18 | 19 | static ssbase readfile(const unsigned char *inptr, const int inlen) 20 | { 21 | const uint8_t *d = inptr; 22 | ssbase base; 23 | memset(&base, 0, sizeof(base)); 24 | 25 | if (inlen < 12) return base; 26 | 27 | base.timediv = (*((uint32_t*)(d))); 28 | base.timediv2 = 10000*base.timediv; 29 | base.maxtime = *((uint32_t*)(d + 4)); 30 | base.gdnum = *((uint32_t*)(d + 8)); 31 | 32 | d += 12; 33 | base.gptr = d; 34 | 35 | if (inlen - 12 < 10*base.gdnum) return base; 36 | d += 10*base.gdnum; 37 | 38 | for (int ch = 0; ch < 16; ch++) 39 | { 40 | ssbase::_basech &c = base.chan[ch]; 41 | c.notenum = *((uint32_t*)d); 42 | d += 4; 43 | if (c.notenum) 44 | { 45 | c.noteptr = d; 46 | d += 5*c.notenum; 47 | c.pcnum = *((uint32_t*)d); 48 | d += 4; 49 | c.pcptr = d; 50 | d += 4*c.pcnum; 51 | c.pbnum = *((uint32_t*)d); 52 | d += 4; 53 | c.pbptr = d; 54 | d += 5*c.pbnum; 55 | for (int cn = 0; cn < 7; cn++) 56 | { 57 | ssbase::_basech::_bcctl &cc = c.ctl[cn]; 58 | cc.ccnum = *((uint32_t*)d); 59 | d += 4; 60 | cc.ccptr = d; 61 | d += 4*cc.ccnum; 62 | } 63 | } 64 | } 65 | base.midisize = d - inptr; 66 | base.globsize = *((uint32_t*)d); 67 | if (base.globsize < 0 || base.globsize > 131072) return base; 68 | d += 4; 69 | base.globals = d; 70 | d += base.globsize; 71 | base.patchsize = *((uint32_t*)d); 72 | if (base.patchsize < 0 || base.patchsize > 1048576) return base; 73 | d += 4; 74 | base.patchmap = d; 75 | d += base.patchsize; 76 | 77 | if (d - inptr < inlen) 78 | { 79 | base.spsize = *((uint32_t*)d); 80 | d += 4; 81 | base.speechdata = d; 82 | d += base.spsize; 83 | 84 | // small sanity check 85 | if (base.spsize < 0 || base.spsize > 8192 || (d - inptr) > inlen) 86 | { 87 | base.spsize = 0; 88 | base.speechdata = 0; 89 | } 90 | } else 91 | { 92 | base.spsize = 0; 93 | base.speechdata = 0; 94 | } 95 | 96 | printf2("after read: est %d, is %d\n", inlen, d - inptr); 97 | printf2("midisize: %d, globs: %d, patches: %d\n", base.midisize, base.globsize, base.patchsize); 98 | return base; 99 | } 100 | 101 | // gives version deltas 102 | int CheckV2MVersion(const unsigned char *inptr, const int inlen, ssbase& base) 103 | { 104 | int i; 105 | int patchesused[128]; 106 | base = readfile(inptr,inlen); 107 | 108 | if (!base.patchsize) 109 | return -1; 110 | 111 | // determine highest used patch from progchange commands 112 | // (midiconv remaps the patches so that they're a 113 | // continuous block from 0 to x) 114 | memset(patchesused, 0, sizeof(patchesused)); 115 | base.maxp = 0; 116 | 117 | 118 | for (int ch = 0; ch < 16; ch++) 119 | { 120 | unsigned char p = 0; 121 | unsigned char v = 0; 122 | 123 | //int pcp = 0; 124 | int pct = 0; 125 | int pcn = base.chan[ch].pcnum; 126 | int np = 0; 127 | int nt = 0; 128 | int nn = base.chan[ch].notenum; 129 | 130 | int td; 131 | const uint8_t *ptr; 132 | for (int pcp = 0; pcp < pcn; pcp++) 133 | { 134 | // have there been notes? add last pgm 135 | ptr = base.chan[ch].pcptr; 136 | td = 0x10000*ptr[2*pcn + pcp] + 0x100*ptr[1*pcn + pcp] + ptr[0*pcn + pcp]; 137 | pct += td; 138 | if (pct > nt) 139 | { 140 | patchesused[p] = 1; 141 | if (p >= base.maxp) base.maxp = p + 1; 142 | } 143 | p += ptr[3*pcn + pcp]; 144 | 145 | // walk notes until we reach current cmd 146 | while (np < nn && nt <= pct) 147 | { 148 | ptr = base.chan[ch].noteptr; 149 | td = 0x10000*ptr[2*nn + np] + 0x100*ptr[1*nn + np] + ptr[0*nn + np]; 150 | v += ptr[4*nn+np]; 151 | nt += td; 152 | np++; 153 | } 154 | } 155 | 156 | if (np < nn) 157 | { 158 | patchesused[p] = 1; 159 | if (p >= base.maxp) base.maxp = p + 1; 160 | } 161 | 162 | } 163 | printf2("patches used: %d\n", base.maxp); 164 | 165 | if (!base.maxp) 166 | return -1; 167 | 168 | // offset table to ptaches 169 | uint32_t *poffsets = (uint32_t *)base.patchmap; 170 | 171 | int matches = 0, best = -1; 172 | // for each version check... 173 | for (i = 0; i <= v2version; i++) 174 | { 175 | // ... if globals size is correct... 176 | if (base.globsize == v2gsizes[i]) 177 | { 178 | printf2("globsize match: %d\n",i); 179 | // ... and if the size of all patches makes sense 180 | int p; 181 | for (p = 0; p < base.maxp - 1; p++) 182 | { 183 | int d = (poffsets[p + 1] - poffsets[p]) - (v2vsizes[i] - 3*255); 184 | if (d % 3) break; 185 | d /= 3; 186 | if (d != base.patchmap[poffsets[p] + v2vsizes[i] - 3*255 - 1]) 187 | break; 188 | } 189 | 190 | if (p == base.maxp - 1) 191 | { 192 | printf2("... ok!\n"); 193 | best = i; 194 | matches++; 195 | } else 196 | { 197 | printf2("no match!\n"); 198 | } 199 | } 200 | } 201 | 202 | // if we've got exactly one match, we're quite sure 203 | int ret = (matches >= 1) ? v2version - best : -2; 204 | printf2("found version delta: %d\n", ret); 205 | return ret; 206 | } 207 | 208 | //Klicke den Narren über Dir und das Schauspiel wird beginnen... 209 | /*static int transEnv(int enVal) 210 | { 211 | float dv = (float)(1.0f - pow(2.0f, -enVal/128.0f*11.0f)); 212 | dv = (float)sqrt(dv); // square root to correct value 213 | int nEnVal = (int)(-log(1.0f - dv)/log(2.0f)*128.0f/11.0f); 214 | if (nEnVal < 0) 215 | { 216 | printf2("!!clamping enval lower bound!\n"); 217 | nEnVal = 0; 218 | } else if (nEnVal > 127) 219 | { 220 | printf2("!!clamping enval upper bound!\n"); 221 | nEnVal = 127; 222 | } 223 | return nEnVal; 224 | }*/ 225 | 226 | void ConvertV2M(const unsigned char *inptr, const int inlen, unsigned char **outptr, int *outlen) 227 | { 228 | int i, p; 229 | ssbase base; 230 | // check version 231 | int vdelta = CheckV2MVersion(inptr, inlen, base); 232 | if (!vdelta) // if same, simply clone 233 | { 234 | *outptr = new uint8_t[inlen + 4]; 235 | memset(*outptr, 0, inlen + 4); 236 | *outlen = inlen + 4; 237 | memcpy(*outptr, inptr, inlen); 238 | return; 239 | } 240 | else if (vdelta < 0) // if invalid... 241 | { 242 | *outptr = 0; 243 | *outlen = 0; 244 | return; 245 | } 246 | vdelta = v2version - vdelta; 247 | 248 | // fake base.maxp 249 | int maxp2 = ((int*)base.patchmap)[0]/4; 250 | if (maxp2 != base.maxp) 251 | { 252 | printf2("warning: patch count inconsistency: we:%d, they:%d\n", base.maxp, maxp2); 253 | base.maxp = maxp2; 254 | } 255 | 256 | // calc new size 257 | int gdiff = v2gsizes[v2version] - v2gsizes[vdelta]; 258 | int pdiff = v2vsizes[v2version] - v2vsizes[vdelta]; 259 | int newsize = inlen + gdiff + base.maxp*pdiff; 260 | printf2("old size: %d, new size: %d\n", inlen, newsize); 261 | 262 | // init new v2m 263 | *outlen = newsize + 4; 264 | uint8_t *newptr = *outptr = new uint8_t[newsize + 4]; 265 | memset(newptr, 0, newsize + 4); 266 | 267 | // copy midi data 268 | memcpy(newptr, inptr, base.midisize); 269 | 270 | // new globals length... 271 | newptr += base.midisize; 272 | *(uint32_t *)newptr = v2ngparms; 273 | printf2("glob size: old %d, new %d\n", base.globsize, *(uint32_t *)newptr); 274 | newptr += 4; 275 | 276 | // copy/remap globals 277 | memcpy(newptr, v2initglobs, v2ngparms); 278 | const uint8_t *oldgptr = base.globals; 279 | for (i = 0; i < v2ngparms; i++) 280 | { 281 | if (v2gparms[i].version <= vdelta) 282 | newptr[i] = *oldgptr++; 283 | } 284 | newptr += v2ngparms; 285 | 286 | // new patch data length 287 | *(int *)newptr = base.patchsize + base.maxp*pdiff; 288 | printf2("patch size: old %d, new %d\n", base.patchsize, *(int *)newptr); 289 | newptr += 4; 290 | 291 | base.newpatchmap = newptr; 292 | 293 | uint32_t *poffsets = (uint32_t *)base.patchmap; 294 | uint32_t *noffsets = (uint32_t *)newptr; 295 | //const int ros = v2vsizes[vdelta] - 255*3 - 1; 296 | 297 | //uint8_t *nptr2 = newptr; 298 | 299 | // copy patch table... 300 | // gcc 5.3 seems to vectorize the loop, but 301 | // the loop is not correct for base.maxp == 10 at least 302 | // adding volatile to the iterator breaks the auto-vec 303 | for (volatile int q = 0; q < base.maxp; q++) 304 | { 305 | noffsets[q] = poffsets[q] + (q * pdiff); 306 | } 307 | 308 | newptr += 4*base.maxp; 309 | 310 | // for each patch... 311 | for (p = 0; p < base.maxp; p++) 312 | { 313 | const uint8_t *src = base.patchmap + poffsets[p]; 314 | 315 | //const uint8_t *dest_soll = nptr2 + noffsets[p]; 316 | printf2("p%d ist:%08x soll:%08x\n", p, newptr, dest_soll); 317 | 318 | // fill patch with default values 319 | memcpy(newptr, v2initsnd, v2nparms); 320 | 321 | // copy/remap patch data 322 | for (i = 0; i < v2nparms; i++) 323 | { 324 | if (v2parms[i].version <= vdelta) 325 | { 326 | *newptr = *src++; 327 | /* 328 | if (vdelta < 2 && (i == 33 || i == 36 || i == 39 || i == 42)) // fix envelopes 329 | *newptr=transEnv(*newptr); */ 330 | } 331 | newptr++; 332 | } 333 | 334 | // copy mod number 335 | const int modnum = *newptr ++= *src++; 336 | // printf2("patch %d: %d mods\n",p,modnum); 337 | 338 | // copy/remap modulations 339 | for (i = 0; i < modnum; i++) 340 | { 341 | newptr[0] = src[0]; 342 | newptr[1] = src[1]; 343 | newptr[2] = src[2]; 344 | for (int k = 0; k <= newptr[2]; k++) 345 | if (v2parms[k].version > vdelta) newptr[2]++; 346 | newptr += 3; 347 | src += 3; 348 | } 349 | } 350 | 351 | // copy speech 352 | *(uint32_t*)newptr = base.spsize; 353 | newptr += 4; 354 | memcpy(newptr, base.speechdata, base.spsize); 355 | newptr += base.spsize; 356 | 357 | printf2("est size: %d, real size: %d\n", newsize, newptr - *outptr); 358 | } 359 | -------------------------------------------------------------------------------- /src/v2mconv.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | struct ssbase 6 | { 7 | const uint8_t *patchmap; 8 | const uint8_t *globals; 9 | uint32_t timediv; 10 | uint32_t timediv2; 11 | uint32_t maxtime; 12 | const uint8_t *gptr; 13 | uint32_t gdnum; 14 | struct _basech 15 | { 16 | uint32_t notenum; 17 | const uint8_t *noteptr; 18 | uint32_t pcnum; 19 | const uint8_t *pcptr; 20 | uint32_t pbnum; 21 | const uint8_t *pbptr; 22 | struct _bcctl 23 | { 24 | uint32_t ccnum; 25 | const uint8_t *ccptr; 26 | } ctl[7]; 27 | } chan[16]; 28 | 29 | const uint8_t *mididata; 30 | int midisize; 31 | int patchsize; 32 | int globsize; 33 | int maxp; 34 | const uint8_t *newpatchmap; 35 | 36 | const uint8_t *speechdata; 37 | int spsize; 38 | 39 | }; 40 | 41 | // gives version deltas 42 | int CheckV2MVersion(const unsigned char *inptr, const int inlen, ssbase& base); 43 | 44 | // converts V2M to newest version 45 | void ConvertV2M(const unsigned char *inptr, const int inlen, unsigned char **outptr, int *outlen); 46 | 47 | extern const char * const v2mconv_errors[]; 48 | -------------------------------------------------------------------------------- /src/v2mplayer.cpp: -------------------------------------------------------------------------------- 1 | /*************************************************************************************/ 2 | /*************************************************************************************/ 3 | /** **/ 4 | /** V2 module player (.v2m) **/ 5 | /** (c) Tammo 'kb' Hinrichs 2000-2008 **/ 6 | /** This file is under the Artistic License 2.0, see LICENSE.txt for details **/ 7 | /** **/ 8 | /*************************************************************************************/ 9 | /*************************************************************************************/ 10 | 11 | 12 | #include "v2mplayer.h" 13 | #include "libv2.h" 14 | 15 | #define GETDELTA(p, w) ((p)[0] + ((p)[w] << 8) + ((p)[2*w] << 16)) 16 | #define UPDATENT(n, v, p, w) if ((n) < (w)) { (v) = m_state.time + GETDELTA((p), (w)); if ((v) < m_state.nexttime) m_state.nexttime = (v); } 17 | #define UPDATENT2(n, v, p, w) if ((n) < (w) && GETDELTA((p), (w))) { (v) = m_state.time + GETDELTA((p), (w)); } 18 | #define UPDATENT3(n, v, p, w) if ((n) < (w) && (v) < m_state.nexttime) m_state.nexttime = (v); 19 | #define PUTSTAT(s) { uint8_t bla = (s); if (laststat != bla) { laststat = bla; *mptr ++= (uint8_t)laststat; }}; 20 | 21 | namespace 22 | { 23 | void UpdateSampleDelta(uint32_t nexttime, uint32_t time, uint32_t usecs, uint32_t td2, uint32_t *smplrem, uint32_t *smpldelta) 24 | { 25 | // performs 64bit (nexttime-time)*usecs/td2 and a 32.32bit addition to smpldelta:smplrem 26 | uint64_t t = ((nexttime - time) * (uint64_t) usecs) / td2; 27 | uint32_t r = *smplrem; 28 | *smplrem += (t >> 32); // bits 32-63 29 | *smpldelta += (t & 0xffffffff); // bits 00-31 30 | if (*smplrem < r) 31 | { 32 | *smpldelta += 1; 33 | } 34 | } 35 | } 36 | 37 | bool V2MPlayer::InitBase(const void *a_v2m) 38 | { 39 | const uint8_t *d = (const uint8_t*)a_v2m; 40 | 41 | m_base.timediv = (*((uint32_t*)(d))); 42 | m_base.timediv2 = 10000*m_base.timediv; 43 | m_base.maxtime = *((uint32_t*)(d + 4)); 44 | m_base.gdnum = *((uint32_t*)(d + 8)); 45 | 46 | d += 12; 47 | m_base.gptr = d; 48 | d += 10*m_base.gdnum; 49 | for (int ch = 0; ch < 16; ch++) 50 | { 51 | V2MBase::Channel &c=m_base.chan[ch]; 52 | c.notenum=*((uint32_t*)d); 53 | d += 4; 54 | if (c.notenum) 55 | { 56 | c.noteptr=d; 57 | d += 5*c.notenum; 58 | c.pcnum = *((uint32_t*)d); 59 | d += 4; 60 | c.pcptr = d; 61 | d += 4*c.pcnum; 62 | c.pbnum = *((uint32_t*)d); 63 | d += 4; 64 | c.pbptr = d; 65 | d += 5*c.pbnum; 66 | for (int cn = 0; cn < 7; cn++) 67 | { 68 | V2MBase::Channel::CC &cc = c.ctl[cn]; 69 | cc.ccnum = *((uint32_t*)d); 70 | d += 4; 71 | cc.ccptr = d; 72 | d += 4*cc.ccnum; 73 | } 74 | } 75 | } 76 | int size = *((uint32_t*)d); 77 | if (size > 16384 || size < 0) 78 | return sFALSE; 79 | d += 4; 80 | m_base.globals = d; 81 | d += size; 82 | size = *((uint32_t*)d); 83 | if (size > 1048576 || size < 0) 84 | return sFALSE; 85 | d += 4; 86 | m_base.patchmap = d; 87 | d += size; 88 | 89 | uint32_t spsize = *((uint32_t*)d); 90 | d += 4; 91 | if (!spsize || spsize >= 8192) 92 | { 93 | for (uint32_t i = 0; i < 256; i++) 94 | m_base.speechptrs[i] = " "; 95 | } else 96 | { 97 | m_base.speechdata = (const char *)d; 98 | d += spsize; 99 | const uint32_t *p32 = (const uint32_t*)m_base.speechdata; 100 | uint32_t n = *(p32++); 101 | for (uint32_t i = 0; i < n; i++) 102 | { 103 | m_base.speechptrs[i] = m_base.speechdata + *(p32++); 104 | } 105 | } 106 | 107 | return sTRUE; 108 | } 109 | 110 | void V2MPlayer::Reset() 111 | { 112 | m_state.time = 0; 113 | m_state.nexttime = (uint32_t)-1; 114 | 115 | m_state.gptr = m_base.gptr; 116 | m_state.gnr = 0; 117 | UPDATENT(m_state.gnr, m_state.gnt, m_state.gptr, m_base.gdnum); 118 | for (int ch = 0; ch < 16; ch++) 119 | { 120 | V2MBase::Channel &bc = m_base.chan[ch]; 121 | PlayerState::Channel &sc = m_state.chan[ch]; 122 | 123 | if (!bc.notenum) 124 | continue; 125 | sc.noteptr = bc.noteptr; 126 | sc.notenr = sc.lastnte = sc.lastvel = 0; 127 | UPDATENT(sc.notenr,sc.notent, sc.noteptr, bc.notenum); 128 | sc.pcptr = bc.pcptr; 129 | sc.pcnr = sc.lastpc=0; 130 | UPDATENT(sc.pcnr,sc.pcnt, sc.pcptr, bc.pcnum); 131 | sc.pbptr = bc.pbptr; 132 | sc.pbnr = sc.lastpb0 = sc.lastpb1 = 0; 133 | UPDATENT(sc.pbnr,sc.pbnt, sc.pbptr, bc.pcnum); 134 | for (int cn = 0; cn < 7; cn++) 135 | { 136 | V2MBase::Channel::CC &bcc = bc.ctl[cn]; 137 | PlayerState::Channel::CC &scc = sc.ctl[cn]; 138 | scc.ccptr = bcc.ccptr; 139 | scc.ccnr = scc.lastcc=0; 140 | UPDATENT(scc.ccnr, scc.ccnt, scc.ccptr, bcc.ccnum); 141 | } 142 | } 143 | m_state.usecs = 5000*m_samplerate; 144 | m_state.num = 4; 145 | m_state.den = 4; 146 | m_state.tpq = 8; 147 | m_state.bar = 0; 148 | m_state.beat = 0; 149 | m_state.tick = 0; 150 | m_state.smplrem = 0; 151 | m_state.cursmpl = 0; 152 | 153 | if (m_samplerate) 154 | { 155 | synthInit(m_synth, (void*)m_base.patchmap, m_samplerate); 156 | synthSetGlobals(m_synth, (void*)m_base.globals); 157 | synthSetLyrics(m_synth, m_base.speechptrs); 158 | } 159 | } 160 | 161 | void V2MPlayer::Tick() 162 | { 163 | if (m_state.state != PlayerState::PLAYING) 164 | return; 165 | 166 | m_state.tick += m_state.nexttime-m_state.time; 167 | while (m_state.tick >= m_base.timediv) 168 | { 169 | m_state.tick -= m_base.timediv; 170 | m_state.beat++; 171 | } 172 | uint32_t qpb=(m_state.num*4/m_state.den); 173 | while (m_state.beat >= qpb) 174 | { 175 | m_state.beat -= qpb; 176 | m_state.bar++; 177 | } 178 | 179 | m_state.time = m_state.nexttime; 180 | m_state.nexttime = (uint32_t)-1; 181 | uint8_t *mptr = m_midibuf; 182 | uint32_t laststat = -1; 183 | 184 | if (m_state.gnr= m_base.maxtime)) 259 | m_state.state = PlayerState::STOPPED; 260 | } 261 | 262 | bool V2MPlayer::Open(const void *a_v2mptr, uint32_t a_samplerate) 263 | { 264 | if (m_base.valid) 265 | Close(); 266 | 267 | m_samplerate = a_samplerate; 268 | 269 | if (!InitBase(a_v2mptr)) 270 | return sFALSE; 271 | 272 | Reset(); 273 | return m_base.valid = sTRUE; 274 | } 275 | 276 | void V2MPlayer::Close() 277 | { 278 | if (!m_base.valid) 279 | return; 280 | if (m_state.state != PlayerState::OFF) 281 | Stop(); 282 | m_base.valid = 0; 283 | } 284 | 285 | void V2MPlayer::Play(uint32_t a_time) 286 | { 287 | if (!m_base.valid || !m_samplerate) 288 | return; 289 | 290 | Stop(); 291 | Reset(); 292 | 293 | m_base.valid = sFALSE; 294 | uint32_t destsmpl, cursmpl = 0; 295 | { 296 | destsmpl = ((uint64_t)a_time * m_samplerate) / m_tpc; 297 | } 298 | 299 | m_state.state = PlayerState::PLAYING; 300 | m_state.smpldelta = 0; 301 | m_state.smplrem = 0; 302 | while ((cursmpl + m_state.smpldelta) < destsmpl && m_state.state == PlayerState::PLAYING) 303 | { 304 | cursmpl += m_state.smpldelta; 305 | Tick(); 306 | if (m_state.state == PlayerState::PLAYING) { 307 | m_state.smpldelta = 0; 308 | UpdateSampleDelta(m_state.nexttime, m_state.time, m_state.usecs, m_base.timediv2, &m_state.smplrem, &m_state.smpldelta); 309 | } else 310 | m_state.smpldelta = -1; 311 | } 312 | 313 | m_state.cursmpl = cursmpl; 314 | m_state.smpldelta -= (destsmpl - cursmpl); 315 | m_fadeval = 1.0f; 316 | m_fadedelta = 0.0f; 317 | m_base.valid = sTRUE; 318 | } 319 | 320 | void V2MPlayer::Stop(uint32_t a_fadetime) 321 | { 322 | if (!m_base.valid) 323 | return; 324 | 325 | if (a_fadetime) 326 | { 327 | uint32_t ftsmpls = ((uint64_t)a_fadetime * m_samplerate) / m_tpc; 328 | m_fadedelta = m_fadeval/ftsmpls; 329 | } else 330 | m_state.state=PlayerState::OFF; 331 | } 332 | 333 | void V2MPlayer::Render(float *a_buffer, uint32_t a_len, bool a_add) 334 | { 335 | if (!a_buffer) 336 | return; 337 | 338 | if (m_base.valid && m_state.state == PlayerState::PLAYING) 339 | { 340 | uint32_t todo=a_len; 341 | while (todo) 342 | { 343 | int torender = (todo > m_state.smpldelta) ? m_state.smpldelta : todo; 344 | if (torender) 345 | { 346 | synthRender(m_synth, a_buffer, torender, 0, a_add); 347 | a_buffer += 2*torender; 348 | todo -= torender; 349 | m_state.smpldelta -= torender; 350 | m_state.cursmpl += torender; 351 | } 352 | if (!m_state.smpldelta) 353 | { 354 | Tick(); 355 | if (m_state.state == PlayerState::PLAYING) 356 | UpdateSampleDelta(m_state.nexttime, m_state.time, m_state.usecs, m_base.timediv2, &m_state.smplrem, &m_state.smpldelta); 357 | else 358 | m_state.smpldelta = -1; 359 | } 360 | } 361 | } 362 | else if (m_state.state==PlayerState::OFF || !m_base.valid) 363 | { 364 | if (!a_add) 365 | { 366 | memset(a_buffer, 0, a_len*sizeof(a_buffer[0])*2); 367 | } 368 | } else 369 | { 370 | synthRender(m_synth, a_buffer, a_len, 0, a_add); 371 | m_state.cursmpl += a_len; 372 | } 373 | 374 | if (m_fadedelta) 375 | { 376 | for (uint32_t i = 0; i < a_len; i++) 377 | { 378 | a_buffer[2*i] *= m_fadeval; 379 | a_buffer[2*i+1] *= m_fadeval; 380 | m_fadeval -= m_fadedelta; 381 | if (m_fadeval < 0) 382 | m_fadeval = 0; 383 | } 384 | if (!m_fadeval) Stop(); 385 | } 386 | } 387 | 388 | bool V2MPlayer::NoEnd() 389 | { 390 | return ((m_base.maxtime * m_base.timediv) > m_state.cursmpl); 391 | } 392 | 393 | uint32_t V2MPlayer::Length() 394 | { 395 | return ((m_base.maxtime * m_base.timediv) / m_samplerate + 1); 396 | } 397 | 398 | bool V2MPlayer::IsPlaying() 399 | { 400 | return m_base.valid && m_state.state == PlayerState::PLAYING; 401 | } 402 | 403 | 404 | #ifdef V2MPLAYER_SYNC_FUNCTIONS 405 | 406 | uint32_t V2MPlayer::CalcPositions(sS32 **a_dest) 407 | ///////////////////////////////////////////// 408 | { 409 | if (!a_dest) return 0; 410 | if (!m_base.valid) 411 | { 412 | *a_dest = 0; 413 | return 0; 414 | } 415 | 416 | // step 1: ende finden 417 | sS32 *&dp = *a_dest; 418 | uint32_t gnr = 0; 419 | const uint8_t* gp = m_base.gptr; 420 | uint32_t curbar = 0; 421 | uint32_t cur32th = 0; 422 | uint32_t lastevtime = 0; 423 | uint32_t pb32 = 32; 424 | uint32_t usecs = 500000; 425 | 426 | uint32_t posnum = 0; 427 | uint32_t ttime, td, this32; 428 | sF64 curtimer = 0; 429 | 430 | while (gnr < m_base.gdnum) 431 | { 432 | ttime = lastevtime + (gp[2*m_base.gdnum] << 16) + (gp[m_base.gdnum] << 8) + gp[0]; 433 | td = ttime - lastevtime; 434 | this32 = (td*8/m_base.timediv); 435 | posnum += this32; 436 | lastevtime = ttime; 437 | pb32=gp[7*m_base.gdnum]*32/gp[8*m_base.gdnum]; 438 | gnr++; 439 | gp++; 440 | } 441 | td = m_base.maxtime-lastevtime; 442 | this32 = (td*8/m_base.timediv); 443 | posnum += this32 + 1; 444 | dp = new sS32[2*posnum]; 445 | gnr = 0; 446 | gp = m_base.gptr; 447 | lastevtime = 0; 448 | pb32 = 32; 449 | uint32_t pn; 450 | for (pn = 0; pn < posnum; pn++) 451 | { 452 | uint32_t curtime = pn*m_base.timediv/8; 453 | if (gnr < m_base.gdnum) 454 | { 455 | ttime = lastevtime + (gp[2*m_base.gdnum+gnr] << 16) + (gp[m_base.gdnum + gnr] << 8) + gp[gnr]; 456 | if (curtime >= ttime) 457 | { 458 | pb32=gp[7*m_base.gdnum + gnr]*32/gp[8*m_base.gdnum + gnr]; 459 | usecs=*(uint32_t *)(gp + 3*m_base.gdnum + 4*gnr); 460 | gnr++; 461 | lastevtime=ttime; 462 | } 463 | } 464 | dp[2*pn] = (uint32_t)curtimer; 465 | dp[2*pn + 1] = (curbar << 16) | (cur32th << 8) | (pb32); 466 | 467 | cur32th++; 468 | if (cur32th == pb32) 469 | { 470 | cur32th = 0; 471 | curbar++; 472 | } 473 | curtimer += m_tpc*usecs/8000000.0; 474 | } 475 | return pn; 476 | } 477 | 478 | #endif 479 | -------------------------------------------------------------------------------- /src/v2mplayer.h: -------------------------------------------------------------------------------- 1 | /*************************************************************************************/ 2 | /*************************************************************************************/ 3 | /** **/ 4 | /** V2 module player (.v2m) **/ 5 | /** (c) Tammo 'kb' Hinrichs 2000-2008 **/ 6 | /** This file is under the Artistic License 2.0, see LICENSE.txt for details **/ 7 | /** **/ 8 | /*************************************************************************************/ 9 | /*************************************************************************************/ 10 | 11 | #pragma once 12 | 13 | /*************************************************************************************/ 14 | /** **/ 15 | /** Type definitions **/ 16 | /** **/ 17 | /*************************************************************************************/ 18 | 19 | #include 20 | #include 21 | #include "types.h" 22 | 23 | class V2MPlayer 24 | { 25 | public: 26 | // init 27 | // call this instead of a constructor 28 | void Init(uint32_t a_tickspersec=1000) { m_tpc=a_tickspersec; /* m_base.valid=0; */ memset(&m_base, 0, sizeof(V2MBase)); } 29 | 30 | // opens a v2m file for playing 31 | // 32 | // a_v2mptr : ptr to v2m data 33 | // NOTE: the memory block has to remain valid 34 | // as long as the player is opened! 35 | // a_samplerate : samplerate at which the synth is operating 36 | // if this is zero, output will be disabled and 37 | // only the timing query functions will work 38 | 39 | // returns : flag if succeeded 40 | // 41 | bool Open(const void *a_v2mptr, uint32_t a_samplerate=44100); 42 | 43 | // closes player 44 | // 45 | void Close(); 46 | 47 | // starts playing 48 | // 49 | // a_time : time offset from song start in msecs 50 | // 51 | void Play(uint32_t a_time=0); 52 | 53 | // stops playing 54 | // 55 | // a_fadetime : optional fade out time in msecs 56 | // 57 | void Stop(uint32_t a_fadetime=0); 58 | 59 | // render call (to be used from sound thread et al) 60 | // renders samples (or silence if not playing) into buffer 61 | // 62 | // a_buffer : ptr to stereo float sample buffer (0dB=1.0f) 63 | // a_len : number of samples to render 64 | // 65 | // returns : flag if playing 66 | // 67 | void Render(float *a_buffer, uint32_t a_len, bool a_add=0); 68 | 69 | // render proxy for C-style callbacks 70 | // 71 | // a_this : void ptr to instance 72 | // rest as in Render() 73 | // 74 | static void RenderProxy(void *a_this, float *a_buffer, uint32_t a_len) 75 | { 76 | reinterpret_cast(a_this)->Render(a_buffer, a_len); 77 | } 78 | 79 | bool NoEnd(); 80 | 81 | // returns song length 82 | uint32_t Length(); 83 | 84 | // returns if song is currently playing 85 | bool IsPlaying(); 86 | 87 | #ifdef V2MPLAYER_SYNC_FUNCTIONS 88 | // Retrieves an array of timer<->song position 89 | // 90 | // a_dest: pointer to a variable which will receive the address of an array of long 91 | // values structured as following: 92 | // first long: time in ms 93 | // second long: song position (see above for a description) 94 | // format: 0xBBBBTTNN, where 95 | // BBBB is the bar number (starting at 0) 96 | // TT is the number of the 32th tick within the current bar 97 | // NN is the total number of 32th ticks a the current bar has 98 | // (32, normally, may change with different time signatures than 4/4) 99 | // ... and so on for every found position 100 | // 101 | // NOTE: it is your responsibility to free the array again. 102 | // 103 | // returns: number of found song positions 104 | // 105 | uint32_t CalcPositions(int32_t **a_dest); 106 | 107 | #endif 108 | 109 | 110 | // ------------------------------------------------------------------------------------------------------ 111 | // no need to look beyond this point. 112 | // ------------------------------------------------------------------------------------------------------ 113 | 114 | private: 115 | 116 | // struct defs 117 | 118 | // General info from V2M file 119 | struct V2MBase 120 | { 121 | bool valid; 122 | const uint8_t *patchmap; 123 | const uint8_t *globals; 124 | uint32_t timediv; 125 | uint32_t timediv2; 126 | uint32_t maxtime; 127 | const uint8_t *gptr; 128 | uint32_t gdnum; 129 | struct Channel 130 | { 131 | uint32_t notenum; 132 | const uint8_t *noteptr; 133 | uint32_t pcnum; 134 | const uint8_t *pcptr; 135 | uint32_t pbnum; 136 | const uint8_t *pbptr; 137 | struct CC { 138 | uint32_t ccnum; 139 | const uint8_t *ccptr; 140 | } ctl[7]; 141 | } chan[16]; 142 | const char *speechdata; 143 | const char *speechptrs[256]; 144 | }; 145 | 146 | // player state 147 | struct PlayerState 148 | { 149 | enum { OFF, STOPPED, PLAYING, } state; 150 | uint32_t time; 151 | uint32_t nexttime; 152 | const uint8_t *gptr; 153 | uint32_t gnt; 154 | uint32_t gnr; 155 | uint32_t usecs; 156 | uint32_t num; 157 | uint32_t den; 158 | uint32_t tpq; 159 | uint32_t bar; 160 | uint32_t beat; 161 | uint32_t tick; 162 | struct Channel 163 | { 164 | const uint8_t *noteptr; 165 | uint32_t notenr; 166 | uint32_t notent; 167 | uint8_t lastnte; 168 | uint8_t lastvel; 169 | const uint8_t *pcptr; 170 | uint32_t pcnr; 171 | uint32_t pcnt; 172 | uint8_t lastpc; 173 | const uint8_t *pbptr; 174 | uint32_t pbnr; 175 | uint32_t pbnt; 176 | uint8_t lastpb0; 177 | uint8_t lastpb1; 178 | struct CC 179 | { 180 | const uint8_t *ccptr; 181 | uint32_t ccnt; 182 | uint32_t ccnr; 183 | uint8_t lastcc; 184 | } ctl[7]; 185 | } chan[16]; 186 | uint32_t cursmpl; 187 | uint32_t smpldelta; 188 | uint32_t smplrem; 189 | uint32_t tdif; 190 | }; 191 | 192 | // \o/ 193 | uint8_t m_synth[3*1024*1024]; // TODO: keep me uptodate or use "new" 194 | 195 | // member variables 196 | uint32_t m_tpc; 197 | V2MBase m_base; 198 | PlayerState m_state; 199 | uint32_t m_samplerate; 200 | uint8_t m_midibuf[4096]; 201 | float m_fadeval; 202 | float m_fadedelta; 203 | 204 | // internal methods 205 | bool InitBase(const void *a_v2m); // inits base struct from v2m 206 | void Reset(); // resets player, inits synth 207 | void Tick(); // one midi player tick 208 | }; 209 | -------------------------------------------------------------------------------- /src/version.h.in: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define V2M_VERSION "@V2M_VERSION@" 4 | #define V2M_URL "https://github.com/jgilje/v2m-player" 5 | 6 | -------------------------------------------------------------------------------- /v2m/0test.v2m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/0test.v2m -------------------------------------------------------------------------------- /v2m/AT4RE-Efficientpim_2.95b232_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/AT4RE-Efficientpim_2.95b232_crk.v2mz -------------------------------------------------------------------------------- /v2m/AiR-Diamond_Cut_8.0.2_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/AiR-Diamond_Cut_8.0.2_kg.v2mz -------------------------------------------------------------------------------- /v2m/AoRE-My_Driver_1.xx-5.xx_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/AoRE-My_Driver_1.xx-5.xx_kg.v2mz -------------------------------------------------------------------------------- /v2m/Bionic--muppets.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Bionic--muppets.v2mz -------------------------------------------------------------------------------- /v2m/Chip--no_tv.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Chip--no_tv.v2mz -------------------------------------------------------------------------------- /v2m/DJ_Jag--3jagista.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/DJ_Jag--3jagista.v2mz -------------------------------------------------------------------------------- /v2m/DJ_Jag--sanfrancsco.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/DJ_Jag--sanfrancsco.v2mz -------------------------------------------------------------------------------- /v2m/DJ_Jag--the_good.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/DJ_Jag--the_good.v2mz -------------------------------------------------------------------------------- /v2m/DYNAMiCS140685-Glary_Utilities_2.x.x_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/DYNAMiCS140685-Glary_Utilities_2.x.x_crk.v2mz -------------------------------------------------------------------------------- /v2m/DYNAMiCS140685-Platinum_Hide_IP_3.0.9.8_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/DYNAMiCS140685-Platinum_Hide_IP_3.0.9.8_crk.v2mz -------------------------------------------------------------------------------- /v2m/DYNAMiCS140685-Super_Hide_IP_3.1.3.2_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/DYNAMiCS140685-Super_Hide_IP_3.1.3.2_crk.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--angel_and_devil-orig_by_josss.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--angel_and_devil-orig_by_josss.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--breeze.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--breeze.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--coop-Quickyman--blindfolded.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--coop-Quickyman--blindfolded.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--coop-Quickyman--deepspace.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--coop-Quickyman--deepspace.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--coop-Quickyman--hardscratchrebound_screamin.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--coop-Quickyman--hardscratchrebound_screamin.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--coop-Quickyman--melody_break.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--coop-Quickyman--melody_break.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--coop-Quickyman--no_sleep-oldversion.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--coop-Quickyman--no_sleep-oldversion.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--creditzpart_synhtezze.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--creditzpart_synhtezze.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--distorted_reality.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--distorted_reality.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--experimental_trance.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--experimental_trance.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--introtune.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--introtune.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--muddle_in_the_artificial_universe.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--muddle_in_the_artificial_universe.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--scream.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--scream.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--sinestic_prays.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--sinestic_prays.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--supersonic-shortmix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--supersonic-shortmix.v2mz -------------------------------------------------------------------------------- /v2m/Dafunk--thesis.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dafunk--thesis.v2mz -------------------------------------------------------------------------------- /v2m/Dalezy--arkham_1798.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dalezy--arkham_1798.v2mz -------------------------------------------------------------------------------- /v2m/Dalezy--blackout_in_mordor.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dalezy--blackout_in_mordor.v2mz -------------------------------------------------------------------------------- /v2m/Dalezy--friday_the_6th.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dalezy--friday_the_6th.v2mz -------------------------------------------------------------------------------- /v2m/Dalezy--malewitsch.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dalezy--malewitsch.v2mz -------------------------------------------------------------------------------- /v2m/Dalezy--resistance_is_futile.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dalezy--resistance_is_futile.v2mz -------------------------------------------------------------------------------- /v2m/Darkman007--first.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Darkman007--first.v2mz -------------------------------------------------------------------------------- /v2m/Darkman007--sphr.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Darkman007--sphr.v2mz -------------------------------------------------------------------------------- /v2m/Dent--stupid_title_my_girlfriend_gave_me.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dent--stupid_title_my_girlfriend_gave_me.v2mz -------------------------------------------------------------------------------- /v2m/Dq--8ball.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dq--8ball.v2mz -------------------------------------------------------------------------------- /v2m/Dq--break_loose.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dq--break_loose.v2mz -------------------------------------------------------------------------------- /v2m/Dq--coop-Biff--3d_igel-intro.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dq--coop-Biff--3d_igel-intro.v2mz -------------------------------------------------------------------------------- /v2m/Dq--coop-Biff--3d_igel-main.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dq--coop-Biff--3d_igel-main.v2mz -------------------------------------------------------------------------------- /v2m/Dq--coop-Biff--rastro.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Dq--coop-Biff--rastro.v2mz -------------------------------------------------------------------------------- /v2m/Entropy--fr-010_art-entroxion-sanxion_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Entropy--fr-010_art-entroxion-sanxion_remix.v2mz -------------------------------------------------------------------------------- /v2m/Groovemasta_04--elektrospack.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Groovemasta_04--elektrospack.v2mz -------------------------------------------------------------------------------- /v2m/Hanes--zink_small.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Hanes--zink_small.v2mz -------------------------------------------------------------------------------- /v2m/Higen--coder_colors.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Higen--coder_colors.v2mz -------------------------------------------------------------------------------- /v2m/Higen--viagpuz.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Higen--viagpuz.v2mz -------------------------------------------------------------------------------- /v2m/Huepow00--rustyruins_ala_v2.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Huepow00--rustyruins_ala_v2.v2mz -------------------------------------------------------------------------------- /v2m/IJs--multi_theft_auto_credits.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/IJs--multi_theft_auto_credits.v2mz -------------------------------------------------------------------------------- /v2m/IJs--that_progressive_trance-like_song.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/IJs--that_progressive_trance-like_song.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--5_minutes.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--5_minutes.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--Trubo.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--Trubo.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--boloto_rise.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--boloto_rise.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--boloto_walk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--boloto_walk.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--digitale_i_-_sine_novel.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--digitale_i_-_sine_novel.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--digitale_ii_-_narratones.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--digitale_ii_-_narratones.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--dispelled_illusion.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--dispelled_illusion.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--ethical_drug.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--ethical_drug.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--july.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--july.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--spire.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--spire.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--subcelestial_beauty.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--subcelestial_beauty.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--subcelestial_brilliance.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--subcelestial_brilliance.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--subcelestial_expectation.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--subcelestial_expectation.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--subcelestial_freedom.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--subcelestial_freedom.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--subcelestial_silence.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--subcelestial_silence.v2mz -------------------------------------------------------------------------------- /v2m/Icefall--subcelestial_tranquility.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Icefall--subcelestial_tranquility.v2mz -------------------------------------------------------------------------------- /v2m/Izard--antiphore.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Izard--antiphore.v2mz -------------------------------------------------------------------------------- /v2m/Izard--dahlia.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Izard--dahlia.v2mz -------------------------------------------------------------------------------- /v2m/Jandor--stars.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Jandor--stars.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-011_picknick_in_the_meadows.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-011_picknick_in_the_meadows.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-013_flybye-loader.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-013_flybye-loader.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-013_flybye-main-brullwurfel_edition.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-013_flybye-main-brullwurfel_edition.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-013_flybye-main.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-013_flybye-main.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-030_candytron-josie.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-030_candytron-josie.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-041_debris-loader.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-041_debris-loader.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-041_debris-main.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-041_debris-main.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-048_precision.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-048_precision.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-052_platinum.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-052_platinum.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-08_the_product-loader.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-08_the_product-loader.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-08_the_product-main.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-08_the_product-main.v2mz -------------------------------------------------------------------------------- /v2m/KB--fr-minus-07-we_cell_out.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/KB--fr-minus-07-we_cell_out.v2mz -------------------------------------------------------------------------------- /v2m/Kaktusen--konami.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Kaktusen--konami.v2mz -------------------------------------------------------------------------------- /v2m/Kaktusen--mupй.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Kaktusen--mupй.v2mz -------------------------------------------------------------------------------- /v2m/Knopperfrisch--bubblefin.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Knopperfrisch--bubblefin.v2mz -------------------------------------------------------------------------------- /v2m/Little_Bitchard--radial_symmetry.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Little_Bitchard--radial_symmetry.v2mz -------------------------------------------------------------------------------- /v2m/Lyzzard--R2D2_flying_home.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Lyzzard--R2D2_flying_home.v2mz -------------------------------------------------------------------------------- /v2m/Lyzzard--comic_bakery.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Lyzzard--comic_bakery.v2mz -------------------------------------------------------------------------------- /v2m/Lyzzard--deep_blue_welcomes_you.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Lyzzard--deep_blue_welcomes_you.v2mz -------------------------------------------------------------------------------- /v2m/Lyzzard--mekka_&_symposium_2000_invitation.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Lyzzard--mekka_&_symposium_2000_invitation.v2mz -------------------------------------------------------------------------------- /v2m/MAP--coop-Cosowi--rewind.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/MAP--coop-Cosowi--rewind.v2mz -------------------------------------------------------------------------------- /v2m/Marlon--multiscenist.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Marlon--multiscenist.v2mz -------------------------------------------------------------------------------- /v2m/Marlon--zuibath.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Marlon--zuibath.v2mz -------------------------------------------------------------------------------- /v2m/Melwyn--precision.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Melwyn--precision.v2mz -------------------------------------------------------------------------------- /v2m/Mixer--incognito.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Mixer--incognito.v2mz -------------------------------------------------------------------------------- /v2m/Mrwb--Smoothie.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Mrwb--Smoothie.v2mz -------------------------------------------------------------------------------- /v2m/Mrwb--pocketrocket.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Mrwb--pocketrocket.v2mz -------------------------------------------------------------------------------- /v2m/Paniq--maschinenzeit.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Paniq--maschinenzeit.v2mz -------------------------------------------------------------------------------- /v2m/Pista--crystal_gate-loader.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Pista--crystal_gate-loader.v2mz -------------------------------------------------------------------------------- /v2m/Pista--crystal_gate-main.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Pista--crystal_gate-main.v2mz -------------------------------------------------------------------------------- /v2m/Pista_and_Irwine--extrait-dreams.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Pista_and_Irwine--extrait-dreams.v2mz -------------------------------------------------------------------------------- /v2m/Preston--chiptown.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Preston--chiptown.v2mz -------------------------------------------------------------------------------- /v2m/Preston--demo_or_suck.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Preston--demo_or_suck.v2mz -------------------------------------------------------------------------------- /v2m/Preston--offworld.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Preston--offworld.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--agony_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--agony_remix.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--alone_in_darkness.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--alone_in_darkness.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--arcane_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--arcane_remix.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--around_the_bass.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--around_the_bass.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--breakbeconacid.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--breakbeconacid.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--clever_little_badass.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--clever_little_badass.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--crazybreak.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--crazybreak.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--dansze_mucyka-reed-fairlight.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--dansze_mucyka-reed-fairlight.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--daxx-tristar_hymne-quickyman_v2m_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--daxx-tristar_hymne-quickyman_v2m_remix.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--depechemode-photographic.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--depechemode-photographic.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--depechemode-precious.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--depechemode-precious.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--full_contact.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--full_contact.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--funny_rythm.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--funny_rythm.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--funny_v2.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--funny_v2.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--gazebo-i_like_chopin.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--gazebo-i_like_chopin.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--global_deejays-sound_of_san_fransisco.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--global_deejays-sound_of_san_fransisco.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--hey_dude.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--hey_dude.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--horizon_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--horizon_remix.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--house_of_love.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--house_of_love.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--jesperk_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--jesperk_remix.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--madonna-die_another_day.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--madonna-die_another_day.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--melancholictrance-ft_ravetracer(tristar.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--melancholictrance-ft_ravetracer(tristar.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--movietrack-captain_future.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--movietrack-captain_future.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--my_dream_of_silence.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--my_dream_of_silence.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--ndw-majortom.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--ndw-majortom.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--no_way.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--no_way.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--nostalgy.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--nostalgy.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--outphatmix_introtune.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--outphatmix_introtune.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--paranoimia.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--paranoimia.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--phantasy.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--phantasy.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--pianolove.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--pianolove.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--plantcaravan-pantera.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--plantcaravan-pantera.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--powertrance.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--powertrance.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--running_hoop.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--running_hoop.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--scooter-hyper_hyper.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--scooter-hyper_hyper.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--slavko_avsenik_-trompetenecho.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--slavko_avsenik_-trompetenecho.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--slavko_avsenik_-trompetenecho_v2.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--slavko_avsenik_-trompetenecho_v2.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--sometime_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--sometime_remix.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--stop_the_user.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--stop_the_user.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--strwarp_remake.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--strwarp_remake.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--synthetic_panorama.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--synthetic_panorama.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--technohammer_finish.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--technohammer_finish.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--the_freaker.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--the_freaker.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--the_metalleffect.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--the_metalleffect.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--the_simple_trancemix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--the_simple_trancemix.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--to_short.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--to_short.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tribute_2_guenter_kraemer-ft_am-fm.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tribute_2_guenter_kraemer-ft_am-fm.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-2005_remix_pseudo.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-2005_remix_pseudo.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-2006_complexity.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-2006_complexity.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-2006_conversation_antarctica.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-2006_conversation_antarctica.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-2006_remix_game-tune.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-2006_remix_game-tune.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-amiga_classix-classic_tristar_boulderdemo.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-amiga_classix-classic_tristar_boulderdemo.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-amiga_classix-classic_tristar_boulderdemo_v2.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-amiga_classix-classic_tristar_boulderdemo_v2.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-amiga_classix-classic_tristar_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-amiga_classix-classic_tristar_remix.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-amiga_classix-classic_tristar_sound_01.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-amiga_classix-classic_tristar_sound_01.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-amiga_classix-the_end_theme.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-amiga_classix-the_end_theme.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-amiga_classix-the_legend.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-amiga_classix-the_legend.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar-paranoimia_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar-paranoimia_remix.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--tristar_bp2008-unsuspecting.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--tristar_bp2008-unsuspecting.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--turrican3_reremix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--turrican3_reremix.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--vectronix_bladebeat.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--vectronix_bladebeat.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--welcome_mr_saw.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--welcome_mr_saw.v2mz -------------------------------------------------------------------------------- /v2m/Quickyman--zoolook.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Quickyman--zoolook.v2mz -------------------------------------------------------------------------------- /v2m/RES-File_Recovery_7.3b111_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/RES-File_Recovery_7.3b111_kg.v2mz -------------------------------------------------------------------------------- /v2m/RESURRECTiON-CleanMyPC_Registry_Cleaner_4.10_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/RESURRECTiON-CleanMyPC_Registry_Cleaner_4.10_kg.v2mz -------------------------------------------------------------------------------- /v2m/RESURRECTiON-PowerCHM_5.x_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/RESURRECTiON-PowerCHM_5.x_kg.v2mz -------------------------------------------------------------------------------- /v2m/Ronny--fr-019_poem_to_a_horse-final_version.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Ronny--fr-019_poem_to_a_horse-final_version.v2mz -------------------------------------------------------------------------------- /v2m/Ronny--fr-019_poem_to_a_horse-party_version.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Ronny--fr-019_poem_to_a_horse-party_version.v2mz -------------------------------------------------------------------------------- /v2m/Rubicante--chaostrance.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Rubicante--chaostrance.v2mz -------------------------------------------------------------------------------- /v2m/Rubicante--psydrop.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Rubicante--psydrop.v2mz -------------------------------------------------------------------------------- /v2m/Rubicante--the_prophecy.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Rubicante--the_prophecy.v2mz -------------------------------------------------------------------------------- /v2m/SDV-CheckMail_5.4.3_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/SDV-CheckMail_5.4.3_crk.v2mz -------------------------------------------------------------------------------- /v2m/SDV-DU_Meter_5.4.3387_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/SDV-DU_Meter_5.4.3387_crk.v2mz -------------------------------------------------------------------------------- /v2m/SDV-WindowManager_1.7.2_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/SDV-WindowManager_1.7.2_crk.v2mz -------------------------------------------------------------------------------- /v2m/SMT--projekkt_64.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/SMT--projekkt_64.v2mz -------------------------------------------------------------------------------- /v2m/Saddict--test2.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Saddict--test2.v2mz -------------------------------------------------------------------------------- /v2m/Sanity--nyt-ttt.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Sanity--nyt-ttt.v2mz -------------------------------------------------------------------------------- /v2m/Scratchpad--je_taime_mon_steak_hache.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Scratchpad--je_taime_mon_steak_hache.v2mz -------------------------------------------------------------------------------- /v2m/Slash--dream_cache.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Slash--dream_cache.v2mz -------------------------------------------------------------------------------- /v2m/Slash--germ.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Slash--germ.v2mz -------------------------------------------------------------------------------- /v2m/Slash--times-party_version.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Slash--times-party_version.v2mz -------------------------------------------------------------------------------- /v2m/Slash--times.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Slash--times.v2mz -------------------------------------------------------------------------------- /v2m/Soft_Maniac--full_access.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Soft_Maniac--full_access.v2mz -------------------------------------------------------------------------------- /v2m/Soft_Maniac--happy_new_2009_year.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Soft_Maniac--happy_new_2009_year.v2mz -------------------------------------------------------------------------------- /v2m/TAD--Ahim--A-bomb_Ablazed-shit_cut.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--Ahim--A-bomb_Ablazed-shit_cut.v2mz -------------------------------------------------------------------------------- /v2m/TAD--Forgotten_Souls_v2_reflextion.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--Forgotten_Souls_v2_reflextion.v2mz -------------------------------------------------------------------------------- /v2m/TAD--Meow.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--Meow.v2mz -------------------------------------------------------------------------------- /v2m/TAD--lousy_day.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--lousy_day.v2mz -------------------------------------------------------------------------------- /v2m/TAD--primitive_pop.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--primitive_pop.v2mz -------------------------------------------------------------------------------- /v2m/TAD--short-0plus.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--short-0plus.v2mz -------------------------------------------------------------------------------- /v2m/TAD--short-1pattern.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--short-1pattern.v2mz -------------------------------------------------------------------------------- /v2m/TAD--short-FM_2.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--short-FM_2.v2mz -------------------------------------------------------------------------------- /v2m/TAD--short-Fear_2.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--short-Fear_2.v2mz -------------------------------------------------------------------------------- /v2m/TAD--short-Organ.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--short-Organ.v2mz -------------------------------------------------------------------------------- /v2m/TAD--short-Piano.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--short-Piano.v2mz -------------------------------------------------------------------------------- /v2m/TAD--short-Vesna-must_Die.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--short-Vesna-must_Die.v2mz -------------------------------------------------------------------------------- /v2m/TAD--short-intro.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TAD--short-intro.v2mz -------------------------------------------------------------------------------- /v2m/THETA-Bejeweled_Twistnfo_1.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/THETA-Bejeweled_Twistnfo_1.v2mz -------------------------------------------------------------------------------- /v2m/THETA-Bejeweled_Twistnfo_2.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/THETA-Bejeweled_Twistnfo_2.v2mz -------------------------------------------------------------------------------- /v2m/THETA-Game_Maker_8.1.135_nfo.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/THETA-Game_Maker_8.1.135_nfo.v2mz -------------------------------------------------------------------------------- /v2m/THETA-Motherload_1.037_Goldium_editionnfo.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/THETA-Motherload_1.037_Goldium_editionnfo.v2mz -------------------------------------------------------------------------------- /v2m/TLG-Alawar_Games_UniCrack_0.5.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/TLG-Alawar_Games_UniCrack_0.5.v2mz -------------------------------------------------------------------------------- /v2m/Tchai--orchestress.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Tchai--orchestress.v2mz -------------------------------------------------------------------------------- /v2m/Tristan--riot_of_flowers.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Tristan--riot_of_flowers.v2mz -------------------------------------------------------------------------------- /v2m/Tristan--vortex_2.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Tristan--vortex_2.v2mz -------------------------------------------------------------------------------- /v2m/Turri--magical.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Turri--magical.v2mz -------------------------------------------------------------------------------- /v2m/Under_SEH-Active_DVD_to_WMV_Ripper_1.3_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Under_SEH-Active_DVD_to_WMV_Ripper_1.3_crk.v2mz -------------------------------------------------------------------------------- /v2m/Under_SEH-AusLogics_BoostSpeed_4.1.4.135_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Under_SEH-AusLogics_BoostSpeed_4.1.4.135_crk.v2mz -------------------------------------------------------------------------------- /v2m/Under_SEH-MLDownloader_7.1.0.9_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Under_SEH-MLDownloader_7.1.0.9_crk.v2mz -------------------------------------------------------------------------------- /v2m/Under_SEH-PCMedik_6.8.20.2010_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Under_SEH-PCMedik_6.8.20.2010_kg.v2mz -------------------------------------------------------------------------------- /v2m/Under_SEH-PGWARE.PCMedik_6.6.14.2010_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Under_SEH-PGWARE.PCMedik_6.6.14.2010_kg.v2mz -------------------------------------------------------------------------------- /v2m/Under_SEH-WindowSpace_2.0.8_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Under_SEH-WindowSpace_2.0.8_crk.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--acid_in_space3.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--acid_in_space3.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--c64delay_osdm_track.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--c64delay_osdm_track.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--depechemode-a_pain_that_im_used_to.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--depechemode-a_pain_that_im_used_to.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--dreamer.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--dreamer.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--fr-011_picknick_in_the_meadows-brullwurfel_edition.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--fr-011_picknick_in_the_meadows-brullwurfel_edition.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--fr-013_flybye-loader-brullwurfel_edition.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--fr-013_flybye-loader-brullwurfel_edition.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--fr-014_garbage_collection-main-brullwurfel_edition.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--fr-014_garbage_collection-main-brullwurfel_edition.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--fr-024_welcome_to_...-breakpoint_2003.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--fr-024_welcome_to_...-breakpoint_2003.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--fr-027_out_of_the_blue.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--fr-027_out_of_the_blue.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--fr-037_the_code_inside.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--fr-037_the_code_inside.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--gods_theme_conversion.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--gods_theme_conversion.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--going_to_away.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--going_to_away.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--greetz_to_breakpoint.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--greetz_to_breakpoint.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--happy_birthday_kb-fr08_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--happy_birthday_kb-fr08_remix.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--hardscratch_rebound.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--hardscratch_rebound.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--hyperzapper.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--hyperzapper.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--iam_not_still.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--iam_not_still.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--immersing_in_sea_abyss.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--immersing_in_sea_abyss.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--kfc_birthday_present.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--kfc_birthday_present.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--movietrack-mortalkombat.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--movietrack-mortalkombat.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--no_sleep-newer.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--no_sleep-newer.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--ouverture.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--ouverture.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--overture_part_ii.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--overture_part_ii.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--power_run_remake.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--power_run_remake.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--projone.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--projone.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--regression.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--regression.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--soul.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--soul.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--the_2nd_movement-sid_remix.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--the_2nd_movement-sid_remix.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--time_and_space.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--time_and_space.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--tristar-amiga_classix-classic_tristar_partysound.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--tristar-amiga_classix-classic_tristar_partysound.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--welcome_to_vectronix_disco-without_vocals.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--welcome_to_vectronix_disco-without_vocals.v2mz -------------------------------------------------------------------------------- /v2m/V2mPlayer--welcome_to_vectronix_disco.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/V2mPlayer--welcome_to_vectronix_disco.v2mz -------------------------------------------------------------------------------- /v2m/Vildauget--osmozis.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Vildauget--osmozis.v2mz -------------------------------------------------------------------------------- /v2m/Wayfinder--fr-014_garbage_collection-main.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Wayfinder--fr-014_garbage_collection-main.v2mz -------------------------------------------------------------------------------- /v2m/Wayfinder--fr-021-unreleased-main.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Wayfinder--fr-021-unreleased-main.v2mz -------------------------------------------------------------------------------- /v2m/Wayfinder--fr-022_ein.schlag-loader.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Wayfinder--fr-022_ein.schlag-loader.v2mz -------------------------------------------------------------------------------- /v2m/Wayfinder--fr-022_ein.schlag-main.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Wayfinder--fr-022_ein.schlag-main.v2mz -------------------------------------------------------------------------------- /v2m/Wayfinder--fr-029_dopplerdefekt.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Wayfinder--fr-029_dopplerdefekt.v2mz -------------------------------------------------------------------------------- /v2m/Wayfinder--fr-041_debris-sfx.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Wayfinder--fr-041_debris-sfx.v2mz -------------------------------------------------------------------------------- /v2m/Wayfinder--kkrieger-chapter_i.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Wayfinder--kkrieger-chapter_i.v2mz -------------------------------------------------------------------------------- /v2m/Wayfinder--short_stuff.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Wayfinder--short_stuff.v2mz -------------------------------------------------------------------------------- /v2m/WickedZ--trance_style.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/WickedZ--trance_style.v2mz -------------------------------------------------------------------------------- /v2m/WickedZ--ultra_short.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/WickedZ--ultra_short.v2mz -------------------------------------------------------------------------------- /v2m/William_Hooligan--rip_van_vegas.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/William_Hooligan--rip_van_vegas.v2mz -------------------------------------------------------------------------------- /v2m/Xclusr--noname.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Xclusr--noname.v2mz -------------------------------------------------------------------------------- /v2m/Yoda--fr-minus-03-party.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Yoda--fr-minus-03-party.v2mz -------------------------------------------------------------------------------- /v2m/Yoda--fr-minus-03.2_rausch-o-mat.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Yoda--fr-minus-03.2_rausch-o-mat.v2mz -------------------------------------------------------------------------------- /v2m/Zugly--corporate_seeds_pvp.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Zugly--corporate_seeds_pvp.v2mz -------------------------------------------------------------------------------- /v2m/Zugly--farwerkk_003.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Zugly--farwerkk_003.v2mz -------------------------------------------------------------------------------- /v2m/Zugly--morning_upanishad.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Zugly--morning_upanishad.v2mz -------------------------------------------------------------------------------- /v2m/Zugly--ripoff_iii.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Zugly--ripoff_iii.v2mz -------------------------------------------------------------------------------- /v2m/Zugly--zi5_this_machine.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/Zugly--zi5_this_machine.v2mz -------------------------------------------------------------------------------- /v2m/freudian_slippers-rocket_sauce.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/freudian_slippers-rocket_sauce.v2mz -------------------------------------------------------------------------------- /v2m/iOTA-MTop_HTML_Password_Lock_5.0_nfo_1.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/iOTA-MTop_HTML_Password_Lock_5.0_nfo_1.v2mz -------------------------------------------------------------------------------- /v2m/iOTA-MTop_HTML_Password_Lock_5.0_nfo_2.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/iOTA-MTop_HTML_Password_Lock_5.0_nfo_2.v2mz -------------------------------------------------------------------------------- /v2m/iOTA-Recover_Keys_Enterprise_5.0.0.56_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/iOTA-Recover_Keys_Enterprise_5.0.0.56_crk.v2mz -------------------------------------------------------------------------------- /v2m/iOTA-Stereoscopic_Player_1.6.1_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/iOTA-Stereoscopic_Player_1.6.1_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-ArtIcons_Pro_5.24_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-ArtIcons_Pro_5.24_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-BVS_Solitaire_Collection_5.3_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-BVS_Solitaire_Collection_5.3_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-DeskSoft_HardCopy_Pro_3.2.1_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-DeskSoft_HardCopy_Pro_3.2.1_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-Glary_Utilities_2.x.x.x_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-Glary_Utilities_2.x.x.x_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-HardCopy_3.2.0_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-HardCopy_3.2.0_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-Kyodai_Mahjongg_20.00_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-Kyodai_Mahjongg_20.00_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-Kyodai_Mahjongg_2006_1.42_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-Kyodai_Mahjongg_2006_1.42_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-Moleskinsoft_Clone_Remover_3.7_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-Moleskinsoft_Clone_Remover_3.7_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-Moleskinsoft_Clone_Remover_3.8_Pro_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-Moleskinsoft_Clone_Remover_3.8_Pro_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-Moleskinsoft_Clone_Remover_Pro_3.4_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-Moleskinsoft_Clone_Remover_Pro_3.4_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-Moo0_RightClicker_Pro_1.x.x.x_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-Moo0_RightClicker_Pro_1.x.x.x_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-RimArts_Becky_Internet_Mail_2.x.x.x_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-RimArts_Becky_Internet_Mail_2.x.x.x_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-Simpo_Products_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-Simpo_Products_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-Total_Commander_6-7.x.x_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-Total_Commander_6-7.x.x_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-Total_Commander_6.x.x-7.x.x_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-Total_Commander_6.x.x-7.x.x_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-WinPatch_1.x.x.x_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-WinPatch_1.x.x.x_crk.v2mz -------------------------------------------------------------------------------- /v2m/kZ-WinRAR_3.x.x.x_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/kZ-WinRAR_3.x.x.x_crk.v2mz -------------------------------------------------------------------------------- /v2m/pzero_new.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/pzero_new.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Advanced_Postal_Envelope_1.3.3_build_4.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Advanced_Postal_Envelope_1.3.3_build_4.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-All_My_Movies_3.7_build_1200_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-All_My_Movies_3.7_build_1200_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-All_to_All_AudioConvert_1.13_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-All_to_All_AudioConvert_1.13_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Apollo_DVD_Copy_4.5.4_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Apollo_DVD_Copy_4.5.4_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Audio_Converter_and_Mixer_3.0_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Audio_Converter_and_Mixer_3.0_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Audio_Convertor_Plus_2.2_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Audio_Convertor_Plus_2.2_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-CD_DVD_Data_Recovery_1.0_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-CD_DVD_Data_Recovery_1.0_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Color_Schemer_Studio_1.5_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Color_Schemer_Studio_1.5_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-DOTMOF_1.24_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-DOTMOF_1.24_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Direct_Flash_Download_1.01_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Direct_Flash_Download_1.01_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Drive_Discovery_2.1_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Drive_Discovery_2.1_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Easy_HTML_Autorun_Builder_1.6.0_build_059_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Easy_HTML_Autorun_Builder_1.6.0_build_059_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Easy_Video_to_Audio_Converter_1.3.4_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Easy_Video_to_Audio_Converter_1.3.4_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-FilePacker_1.1_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-FilePacker_1.1_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Flash_Sound_Grabber_1.10_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Flash_Sound_Grabber_1.10_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Handy_Recovery_2.0_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Handy_Recovery_2.0_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-MOV_to_AVI_MPEG_WMV_Converter_1.8.4_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-MOV_to_AVI_MPEG_WMV_Converter_1.8.4_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-MP3_Joiner_1.0_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-MP3_Joiner_1.0_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-MetaProducts_Flash_and_Media_Capture_1.2.43_SR1_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-MetaProducts_Flash_and_Media_Capture_1.2.43_SR1_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-MetaProducts_Inquiry_Standart_1.6.423_SR1_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-MetaProducts_Inquiry_Standart_1.6.423_SR1_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-MetaProducts_Mass_Downloader_3.3.691_SR1_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-MetaProducts_Mass_Downloader_3.3.691_SR1_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-MetaProducts_Offline_Explorer_Enterprise_4.8.2650_SR1_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-MetaProducts_Offline_Explorer_Enterprise_4.8.2650_SR1_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-MetaProducts_Offline_Explorer_Pro_4.8.2628_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-MetaProducts_Offline_Explorer_Pro_4.8.2628_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-MetaProducts_Picture_Downloader_1.0.589_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-MetaProducts_Picture_Downloader_1.0.589_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-MetaProducts_Portable_Offline_Browser_4.8.2628_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-MetaProducts_Portable_Offline_Browser_4.8.2628_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-MetaProducts_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-MetaProducts_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-N1_DVD_Ripper_5.3_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-N1_DVD_Ripper_5.3_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-NetPlanning_2.03_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-NetPlanning_2.03_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Registry_Operator_3.6_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Registry_Operator_3.6_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-StyleBuilder_2.021000.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-StyleBuilder_2.021000.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Ultra_Mpeg_Converter_1.9.0_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Ultra_Mpeg_Converter_1.9.0_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Universal_Desktop_Ruler_2.9.1118_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Universal_Desktop_Ruler_2.9.1118_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-WinTools.net_Professional_6.5.1_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-WinTools.net_Professional_6.5.1_crk.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-Xilisoft_OGG_MP3_Converter_2.1.63_kg.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-Xilisoft_OGG_MP3_Converter_2.1.63_kg.v2mz -------------------------------------------------------------------------------- /v2m/tPORt-unEbookEdit_2.20.765_crk.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/tPORt-unEbookEdit_2.20.765_crk.v2mz -------------------------------------------------------------------------------- /v2m/vx--kxxt_demo.v2mz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgilje/v2m-player/385ad6956202d09a2912ef91df9c44e13f9e4a84/v2m/vx--kxxt_demo.v2mz --------------------------------------------------------------------------------