I suspect that the signal is a bit longer than 1:48, closer to 1:49, but whatever software you use to report this length simply truncates it. An exact measure is the number of samples in the signal.
When this signal is split into overlapping frames, it can happen that only very few samples are left and thus a new frame is created. FramesSignal stops as soon as every sample of the signal was covered by at least one frame. Please see the 'end' parameter description in the "Notes" section of the
FramedSignal documentation.
The location of a frame is relative to its centre, thus is could happen that the reported centre is outside the signal. One could argue that this is not intuitive, but it is the expected behaviour. We could consider adding a 'truncate' option to the 'end' parameter which stops as soon as the centre is outside the signal, though.
One thing still surprises me a bit. Are you talking about madmom frames or how do you compute the frames for pitch estimation?
P.S. it is not really considered good programming style to import something with a name usually used for something different. In your case you refer to or import madmom.features.onsets simply as madmom.