For example, if you have a map that looks like below
... //Storyboard Layer 4 (Overlay) //Storyboard Sound Samples [TimingPoints] -23,240,4,2,0,50,1,0 6697,240,4,2,0,50,1,0 15817,240,4,2,0,50,1,0 17737,-166.666666666667,4,2,0,50,0,0 18457,240,4,2,0,25,1,0 ... 174702,240,4,2,0,50,1,0 202782,240,4,2,0,50,1,0 240222,428.571428571429,4,2,0,50,1,0 281364,480,4,2,0,50,1,0 329364,240,4,2,0,50,1,0 [HitObjects] 448,192,17737,5,0,0:0:0:0: ...
You found out that the map is on reference BPM 200, you would like to change it to 100.
(Had the idea of calling it Z-Line because it should be at the end and also it's zero offset.)
Simply add a line of offset 0 (Note: 600 because 60,000/100 = 600)
0,600,4,2,0,50,1,0
at the end, so:
... 174702,240,4,2,0,50,1,0 202782,240,4,2,0,50,1,0 240222,428.571428571429,4,2,0,50,1,0 281364,480,4,2,0,50,1,0 329364,240,4,2,0,50,1,0 0,600,4,2,0,50,1,0 < --- HERE [HitObjects] 448,192,17737,5,0,0:0:0:0: ...
You would notice that the reference would change. This works for any bpm, not for all offsets though.
You may need to move the offset to the negatives in some rare occasions.
This works because osu!'s algorithm assumes a sorted TimingPoint .osu file.
I wrote a small article speculating on why it works.