♫ osu!HitsoundManager ♫ v0.2 [2015-11-16]

Total Posts
Topic Starter
♫ Welcome to the osu! Hit Sound Manager project page! ♫

Download: osu!hitSoundManager v0.2
Current State: Experimental v0.2, Last Windows x86 Build 2015-11-16, binary not signed.


This is a productivity tool designed for 🎹 osu!mania 🎹.
The tool only supports the copying of hitsound file and volume from hit-objects to hit-objects and storyboards.
As we speak, this tool only works for hitsounds attached by "Sample Import". Hitsounds inherited from timing points / whistle / clap / finish have not been treated yet, but will likely be implemented in the next release (v0.3).


  1. Missing DLL error occurs when attempting to run the program.
    Solution: Approach VCRedist C++ x86 & x64 with AR 9.8 and install the x86 version.
  2. Antivirus says it's a virus!
    Solution: owo I need your trust owo... please ignore the warning or white-list the program.


  1. This is not a hitsound copier. It is a semi-automatic hitsound mapping tool.
  2. It should perfectly map all hitsound from source hit objects to your target file.
    i.e. the "no source hitsound left behind" policy.
  3. It will distribute volume as fairly as possible for each source hit object, and send the hitsound to storyboard if the target doesn't have a note at the offset.
    i.e. this usually happens when mapping from harder diffs to easier diffs, but this tool will prevent hitsound from disappearing when mapping.
  4. The code could be adapted to other game modes if the ending hitsound of the sliders and spinners are correctly dealt with.

  1. Hitsound your choice of difficulty (source file) with Sample Import (CTRL+SHIFT+I ) and make sure you saved the file.
    In "File » Open *.osu file in notepad", copy the hit objects below section header [HitObjects] to the edit control on the left side.
    64,192,14294,1,0,0:0:0:66:LR_HiHat SClick 2.wav
    448,192,14505,1,0,0:0:0:66:LR_Snare Hit.wav
    64,192,14716,1,0,0:0:0:66:LR_HiHat SClick 2.wav

  2. Click Simplify to obtain simplified and edit-friendly version of the hit objects-- this will not affect your .osu file.
  3. Open any difficulty to be hitsound (target file).
    Again, use "File » Open *.osu file in notepad" and copy everything under [HitObjects] to the edit control on the right.

  4. Click on Magicopy.
  5. Copy hitsounds file to the target file (the second file you open in the notepad or other editing software).
    If you see storyboard samples that are generated under the line "//Storyboard Sound Samples" after clicking "Magicopy", paste them under //Storyboard Sound Samples in the target file.
Source: The source file at offset 9900 has 1 note with Hitsound1.wav on volume of 32%.
Target: The target file at offset 9900 has 3 notes with no hitsound.

1. Copy the source hit-objects into the "source" edit control and the target hit-objects into the "target" edit control.

2. Click on "Simplify" to remove redundant information from the source hit-objects. Feel free to edit this result.

3. Click on "Magicopy" such that the 3 notes on offset 9900 each receive approximately one-third volume (11%) of the original hitsound (32%) with the hitsound file name intact.
Source: The source file at offset 120833 has 2 notes different hitsounds on different volume.
Target: The target file at offset 120833 has 3 notes with no hitsound at offset 120833 and an extra note at offset 120964.

1. Copy source hit-objects into "source" edit control.
2. Click on the "Simplify" button.
3. Copy target hit-objects into "target" edit control.
4. Click on the "Magicopy" button.

Results: The hitsound with higher volume (70%) is mapped on to two hit objects (35% each) while the hitsound with lower volume (50%) is carried to the remaining one.
Source: The source file has 3 notes at offset 500 with 3 different hitsounds on various volumes.
Target: The target file has only 1 note at 500 offset and two other notes on other times.

1. Copy source hit-objects into "source" edit control.
2. Click on the "Simplify" button.
3. Copy target hit-objects into "target" edit control.
4. Click on the "Magicopy" button.

Results: The hitsound with the highest volume (70%) is mapped with higher priority while the hitsound with lower volumes (40% and 20%) are reformatted as storyboard events. The two non-hitsound notes in the target file are copied as-is.
Magicopy can't be more productive...
  1. (FrenzyLi) Gakuen Seikatsu Bu - Friend Shitai ( 🎹 WIP )
    Hitsounder: LordRaika (starts a new diff [Hitsound])
    MagiCopier: FrenzyLi (copies all hitsounds into 4 diffs in less than 2 minutes)
    Note: Timing point hitsound is set to custom set #92 to provide hitsound for notes that aren't provided a sample-import hitsound.
  2. (Rivals_7) Mimori Suzuko - Yumemiru! Shinjiru! Mirai Kanaete! ( 🎹 Pending )
    Hitsounder: LordRaika (15 minutes listening repeatly, 10 minutes selecting hitsounds, 3 hours making hitsound diff)
    MagiCopier: LordRaika (3 minutes to map the sample import hitsounds to all difficulties)
    Note: Even if the map is modded, the hitsound can be reapplied anytime using the osu!HitsoundManager.
  3. (Jepetski) xi - Blue Zenith ( 🎹 Pending )
    Hitsounder: FrenzyLi (30 minutes isolating bass kick from song, 1 hour finding good piano pitch, 3 hours making hitsound diff)
    MagiCopier: Jepetski (10 minute copy)
    Note: Verifying what hitsounding tool is used. Entry could be removed if MagiCopy is not used.

Known Issues


Additional Information

v0.2 - Minor Release - Bug Fix
  1. Bug fix for file names with white spaces.
  2. Keeping hitsounded target hit-objects intact after "Magicopy".
  3. Corrected the syntax for outputting osu spinners (which are osu!mania sliders) in the target edit control.
  4. Corrected "[Hit Objects]" to "[HitObjects]".
v0.1 - Major Release - Experimental Build
  1. The "Magicopy" build.
📖 Conceptual Design
  1. (LordRaika) - concept of the osu!mania Perfect Hitsound Tool and testing
💻 Implementation
  1. (FrenzyLi) - C++ Design and implementation of "Magicopy" build (v0.1) on Windows

You're the boss >w<b
im testing this build , and having some issue, gotta comes up with something more along with some feature to finalize this.

EDIT : ok, things to finalize :

A) add information for "requirement"
since this program need this MSCVP to run properly , need to install x86 ,AND x64 if x86 doesnt work.
im using 64bit, installing x64 doesnt work, it needs the other one, so to be safe, just install both?

B) blank?,just out of curious, dont remove this since it still can be used for upcoming feature...
is this blank one safe? i mean it does nothing or affects nothing on the right side , right?

Left Side :
64,192,14294,1,0,0:0:0:66:LR_HiHat SClick 2.wav
448,192,14505,1,0,0:0:0:66:LR_Snare Hit.wav
64,192,14716,1,0,0:0:0:66:LR_HiHat SClick 2.wav
64,192,15139,1,0,0:0:0:66:LR_HiHat SClick 2.wav
448,192,15350,1,0,0:0:0:66:LR_Snare Hit.wav
64,192,15562,1,0,0:0:0:66:LR_HiHat SClick 2.wav
64,192,15984,1,0,0:0:0:66:LR_HiHat SClick 2.wav
448,192,16195,1,0,0:0:0:66:LR_Snare Hit.wav

after its simplify :
14083 | 50 | LR4_KickVTRK.wav
14294 | 66 | LR_HiHat
14505 | 66 | LR_Snare
14716 | 66 | LR_HiHat
14928 | 50 | LR4_KickVTRK.wav
15139 | 66 | LR_HiHat
15350 | 66 | LR_Snare
15562 | 66 | LR_HiHat
15773 | 50 | LR4_KickVTRK.wav
15984 | 66 | LR_HiHat
16195 | 66 | LR_Snare
16407 | 0 |

hope it does nothing for Magicopy :)
after this is perfect for mania, this blank, can be added for next feature that works for STD(hopefully XD)

C) missing note on right side,

still having above setting for the left ^ (that start with 14083 and end with 16407 with 0 volume)

Right Side :

After Magicopy , missing note on bold note above :
[Hit Objects]

//Storyboard Sound Samples

only missing 2 original note:

so umm, add a filter, to ignore right side's note thats already hitsounded, and Do not delete it, haha...

it works charming.... i think we need to post something like

"feature section"(this is different with normal hitsound copier)

"requirement"(some people might need to disable antivirus for this)

and "Step on using it/ button explanation"

^^b thx for this!!
Wow nice!
Topic Starter

LordRaika wrote:

You're the boss >w<b
im testing this build , and having some issue, gotta comes up with something more along with some feature to finalize this.
... ...
^^b thx for this!!
I'll fix that hopefully soon enough. Well, my current logic goes like this:
  1. the blanks on the left hand side does not carry over to the target hit objects,
  2. the hitsounds with volume 0 does not carry over to the target hit objects.
You also note the missing space bars, and it should be caused by reading using wstringstream operator << instead of reading the rest of the line. Whitespaces are not correctly read using that operator and I should use getline.

[GraveChaos] wrote:

Wow nice!
owo nice~
Topic Starter
Download: osu!hitSoundManager v0.2
Current State: Experimental v0.2, Last Windows x86 Build 2015-11-16, binary not signed.
Issues fixed and a working binary is built. Post is updated.
Daym this looks really cool and useful Good job!
I will test it out at some point keep it up man. :)
Topic Starter

Mat wrote:

Daym this looks really cool and useful Good job!
I will test it out at some point keep it up man. :)
Noticed by Mat sen-pai. I will keep up with the awesomeness.

Confirmed major issue in v0.2: (Now Resolved)
After saving the magicopy target hit objects in notepad, the osu!editor does not parse slider volume and sound files correctly.
DAMN IT, only v0.2 and we got so far >w< , i test anything that could broke the program, but no error or strange behaviour, nice one~

Additional notice for the information on first post :
some miss here >>> <<< at target file is written as 9900 , supposed to be 120833 , yep... just this XD

and to finalize osumania sample import section function/feature, (so we can move on to work on default hitsound to be work for other mode)

1) MagiCopy really keeping the hitsound intact on target, but... let's take a look at this case

21954 | 85 | LR_Clap DS.wav
22765 | 55 | LR_Clap Low Drop.wav
22765 | 60 | LR_Clap DS.wav

going to MagiCopy this :
320,192,21954,1,0,0:0:0:85:LR_Clap DS.wav
64,192,22765,1,0,0:0:0:55:LR_Clap Low Drop.wav
448,192,22765,1,0,0:0:0:60:LR_Clap DS.wav

and the result became like :

64,192,21954,128,0,22359:0:0:0:85:LR_Clap DS.wav
320,192,21954,1,0,0:0:0:85:LR_Clap DS.wav
192,192,22765,1,0,0:0:0:60:LR_Clap DS.wav
320,192,22765,1,0,0:0:0:55:LR_Clap Low Drop.wav
64,192,22765,1,0,0:0:0:55:LR_Clap Low Drop.wav
448,192,22765,1,0,0:0:0:60:LR_Clap DS.wav

just wondering, if we can add another filter for it :
#if the target already have 1 hitsound SAME with source, 21954 offset, and 1 more nonhitsound at 21954
the best result should be, divide the volume equally from it..., if its only have 1 note and the hitsound is already same, the current one
will result on adding the 1hitsound from source to storyboard sample, which makes it double or too much.
but if the "1 hitsound" is not same with source... ofc we just ignore it and hitsound the other one with full volume

^ this is not really a big deal, since target supposed to be all non hitsound...
but if it works, MagiCopy can also work to update a difficulty (that already have hitsound) to the latest source of hitsound.

2) Copy to Clipboard button for "MagiCopy section"

yeah, might help someone that doesnt know how to copy all of it since we cant use CTRL+A yet
(some people might select and SLOWLY drag it all the way to the bottom.... while the fact is we can place the cursor selection to start
and press CTRL+SHIFT+END , hahaha XD, but not every people know this)

btw, i think... maybe this could easily works for the current text control? OwO

that's all <3
Do not open this.... ... its... a really really long wall of text
should it work for standard that only have 1 hitsound at one offset, we absolutely dont need to divide hitsound
we also CANNOT deal with missing hitsound since we CANT send default CLAP/WHISTLE/FINISH to storyboard

therefore, im thinking that you said you want to divide the right text control into 2 section? 70% for {hitobjects} and 30% for //SSS
i was just... RIGHT , THIS IS IT, this could be a very handful to finalize this last feature.

what do we do about it? i want to talk about the logical flowchart here :
#if the simplify button is pressed, add a pop out/prompt question "Osu!Standard / Osu!Mania" as choice.
osu!mania and it works the same as current one.
osu!standard AND it works the same but only different in //storyboard sample sound section

now the //SSS section will changed into //Missing Hitsound List
it contains the exact simplify code that cant find matching offset on the target difficulty.

^ that could work as reporter, to let mapper know the copy is done, and have some missing hitsound
NORMALLY in STD, missing hitsound won't be really bad, but for some perfectionist, they might want to check those missing and deal with it.

Allrite,finally lets start on the script T^T , here goes the long shit XD

first, some basic intro about the parameter:

NoteType: is mostly 1, i found 5 as new combo, 2 as slider, 6 for new combo and its a slider
Sound: 2=Whistle, 4=Finish, 8=Clap, and works for 6=W+E , 10= W+R, 12=E+R, 14=W+E+R
SampleSet: 0=Auto, 1=Normal, 2=Soft, 3=Drum (As usual, auto get their value from the timing's setting later on the game)
Additions: 0=Auto, 1=Normal, 2=Soft, 3=Drum
Custom: Custom sound number, notice the 33, it means Custom Set 33 and its Soft(2), ignoring timing setting.

that works same with every single note, on osu!Std,osu!mania (note that STD is same with CTB in script)
fully understanding that could really really save the logic for the filter of MagiCopy >w<

NOW THE REAL PROBLEM is... the complex and challange will be on slider's hitsound >_<
here goes some experimental from me... :

Code :
8,48,1115,6,0,B|72:48|114:47|114:47|208:48,1,180.000001192093 ///"1" , its a normal slider, 1start 1end
8,128,1912,1,0,0:0:0:0: ///your average normal note
8,208,2072,2,0,L|80:208,6,45.0000002980232 ///It Repeats 6 times, and total of 7 that can be HS including the head/start of slider
8,296,3189,5,0,0:0:0:0: ///your average normal note
80,288,3349,1,0,0:0:0:0: ///your average normal note

L|80:208 is a slider, and with the node's axis.
I notice the code B|72:48|114:47|114:47|208:48 appear, only if the slider have multiple dot/node to form the slider.
while the |114:47|114:47| is basically 2node into 1same position to make the slider bends straight. (ok, this is not important at all)

OH WAIT! IT HAS nothing to do with hitsounding XD , lets skip this shyt...
now, still on those notes, lets start giving them a bomb...

and Code became like this :
8,48,1115,6,0,B|72:48|114:47|114:47|208:48,1,180.000001192093,2|8,0:0|0:0,0:0:0:0: ///i give whistle on the beginning, and clap on the end.
the blue is start slider's hitsound, and red is end/tail, the next two 0:0 value of blue is the SampleSet and Addition setting (i will cover this later)
the next two red is SampleSet and Additions setting for tail's hitsound so it makes sense.

8,128,1912,1,6,0:0:0:0: ///i give a whistle and finish, yeah, a simple one

///i give W,E,R,WE,WR,ER,&WER (total 7) along with their respective 0:0 setting for each SampleSet and Addition

8,296,3189,5,12,0:0:0:0: ///i give finish and clap for this

80,288,3349,1,4,0:0:0:0: ///only finish

uhm, basically copying from single note is SUPER easy, the simplify could looks like this.....







is.... the moment..... when i realize.....
osu for around 8 years, i never seen or heard osu!standard copier/hitsounder tool. orz

this is probably the most we can do from the data above :
1115 | 0 | Whistle | Auto,Auto,0,0 |
1912 | 0 | Whistle+Finish | Auto,Auto,0,0 |
2072 | 0 | Whistle | Auto,Auto,0,0 |
3189 | 0 | Finish+Clap | Auto,Auto,0,0 |
3349 | 0 | Finish | Auto,Auto,0,0 |

just leave the volume 0, it will use the timing's setting volume.
as for the bold one... "OK GOOD QUESTION...., i know the next question will be...
where is the hitsound for the tail? for 2nd repeat slider, 3rd repeat slider and so on..."

the answer is... we can have the value of what hitsound it is, its easy... but we can not ever get the offset value BEFORE...
we knew what makes the offset of the tail, 2nd repeat slider and so on....

ok, look at this once again :
8,48,1115,6,0,B|72:48|114:47|114:47|208:48,1,180.000001192093,2|8,2:0|0:2,0:0:0:0: (have the length of 2/1 slider)
///in editor, the tail should be at 1753

8,208,2072,2,0,L|80:208,6,45.0000002980232,2|4|8|6|10|12|14,0:0|0:0|0:0|0:0|0:0|0:0|0:0,0:0:0:0: (1/2 slider that repeat 6 times)
///in editor, all the offset : 2232, 2391, 2551, 2710, 2870, 3029

all because of the bold value, i assume that is "the length" of the slider, yes it is, and its probably divide with bpm, and snap or something like that.
so in editor they got their exact offset. well... i cant figure how those 2 bold value could give us 1753, and 2232, 2391, 2551, 2710, 2870, 3029

T^T im.... ugh.....

this is very troublesome, i hope you are still with me XD
ok, LETS conclude and makes life easier....
  1. its only works for OSU!MANIA , AAAAA, (well for the beginning this was the only purpose.... sry STD guys, i tried my best XD)
    well, at least for mania it could works perfectly of any kind of hitsound, any notes.
  2. for osu!standard... we gives the mapper a warning, "that this tool doesnt works properly on slider"
    but if they insist, it still works... but limited only to a single note...
    IT WILL WORKS, but when MagiCopy found a slider, as usual... it wont works like it should be... (RIP slider's hitsound)
    complicated since long ago.... p/3329393 XD
  3. you are free to ignore standard slider stuff... once and for all.

umm umm, everything is clear and the logic should be easy to make this final.... >w<
just one more thing, oh right, about the SampleSet and Additions

152,184,9999,1,12,2:3:0:0: ///has the setting of SampleSet = Soft, and Additions = Drum
its a setting for hitsound set ignoring timing's setting > can be set in editor from this tool...

according to above script, the single note in Standard, will give hitsound of soft-hitnormal + drum-hitfinish + drum-hitclap
errr its okay if you dont really get this(not really important), all we need is to store the value and copied it correctly >w<

for finalize of the simplify list... it could looks like this
{Offset|Volume|SampleSet|Additions|Hitsound|Custom#}                                                <<< you might need to add this new header XD
9999 | 0 | Soft | Drum | Finish+Clap                                                                                   <<< as usual, volume 0 means "Auto"
32768 | 44 | Nrml | Auto | Clap                                                                                           <<< sometimes, its not 0, so it should be carry over
65536 | 0 | Auto | Nrml | Whistle | CustomSet:"92"
1024 | 80 | ---- | ---- | LR4_BassDropXR.wav

a little bit more complex now but still more user friendly to list down all the hitsound XD
#for Custom, no need to add it to list IF the value is 0, since its 'RARELY' used, you could almost never find any mapper use this setting
for hitsounding their map beside DjPop's map and my Hitsound Guide map(its not even for rank XD)
but yeah, if the "Simplify" found the value is not 0, might want to add it to copy list...

for more additional NB,.. those setting is exist to deny the existences of timing setting haha
the extra |SampleSet|Additions|Custom| < yea this little thingy.
some mapper use this since they dont want to add new timing every single time especially for specific note.

More to Note that..... SAMPLE IMPORT's hitsound is the priority... means if you found audio file name on the last line...
you can ignore the rest... and only take the volume and audio file name like the above
1024 | 80 | ---- | ---- | LR4_BassDropXR.wav
(because even if you copy all the SampleSet|additions|Custom for it, its not going to affects sample import's hitsound at all)
in short... do as you please >w<

FINAL note...(finally).... for the IF filtering, all assuming having same offset, source and target.
  1. if source have 1 clap 0 volume, target have 2 note : "only 1 clap is given to 1 note, 1 missing"
    (NOT really neccessary to list/report this missing unless if we got feedback, some mapper need this in the future)
    and report missing only for default hitsound, since sample import will never missing, it goes to //SSS section
  2. if source have 1 clap and volume >= 10, target have 2 note or more : "then it should start to divide vlm and give both clap"
    9% volume and less, its best to not divide it and not giving other note the clap, just 1 clap of 9% volume,
    and the LOWEST divide volume possibility should be 5%, should the source have 20%volume, and copy to 6 note,
    each note will have 5% volume (total 30%vol, its okay... really... mania rarely have 6 note all the times anyway)
  3. if source have 1 clap(2) and 1 clap+whistle(10) , target only have 1 note : "only clap+whistle is copied"
    and this time , the clap(2) will be on the report list.
  4. if source have 1 clap(2) and 1 clap+whistle(10) , target have 1 clap(2) and 1 note : "the 1 note will get clap+whistle"
  5. if source have SampleSet,additions,customset setting, overwrite the target's setting regardless of note amount.
    volume still depend on note amount.
  6. if Simplify found audio file name, while its also found clap and other setting : "it will only takes Audio name and volume"
    ignoring sampleset,additions,customset.
  7. Magicopy NEVER check for target's Sampleset,additions,and customset, :
    "only check for this >note amount(by same offset),audio name(used by sampleimport),W-E-R,and volume"
    then it writes from source to target. ok hope i didnt missed any scenario

at last, i can say im done...
sry for the long shyt >_<
take your time, this is only for extra feature... as im already very satisfy with v0.2
v0.2 really works perfect, thats only for SampleImport,yeah...

if this works for default, idk if we should promote it into v0.9 since its only doesnt work for slider, but perfect for any other things.

Writing time 3hours++
i dont knw what to say anymore XD

just... pls take your time ^^'
I have problem converting this file (Source):

to target:

using version 0.2 [2015-11-16]

waiting for your debug, thanks for the wonderful program
Topic Starter
This project has been discontinued.
Please sign in to reply.

New reply