2024-09-21 02:23:59 -03:00
|
|
|
//
|
2024-12-09 05:31:58 -03:00
|
|
|
// SpeedButton.m
|
2024-09-21 02:23:59 -03:00
|
|
|
// Cog
|
|
|
|
//
|
2024-12-09 05:31:58 -03:00
|
|
|
// Created by Christopher Snowhill on 9/20/24.
|
|
|
|
// Copyright 2024 __LoSnoCo__. All rights reserved.
|
2024-09-21 02:23:59 -03:00
|
|
|
//
|
|
|
|
|
2024-12-09 05:31:58 -03:00
|
|
|
#import "SpeedButton.h"
|
2024-09-21 02:23:59 -03:00
|
|
|
#import "PlaybackController.h"
|
|
|
|
|
2024-12-09 05:31:58 -03:00
|
|
|
static double reverseSpeedScale(double input, double min, double max) {
|
|
|
|
input = sqrtf((input - 0.2) * 10000.0 / (5.0 - 0.2));
|
|
|
|
return (input * (max - min) / 100.0) + min;
|
|
|
|
}
|
|
|
|
|
|
|
|
@implementation SpeedButton {
|
2024-09-21 02:23:59 -03:00
|
|
|
NSPopover *popover;
|
|
|
|
NSViewController *viewController;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)awakeFromNib {
|
|
|
|
popover = [[NSPopover alloc] init];
|
|
|
|
popover.behavior = NSPopoverBehaviorTransient;
|
|
|
|
[popover setContentSize:_popView.bounds.size];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)mouseDown:(NSEvent *)theEvent {
|
|
|
|
[popover close];
|
|
|
|
|
|
|
|
popover.contentViewController = nil;
|
|
|
|
viewController = [[NSViewController alloc] init];
|
|
|
|
viewController.view = _popView;
|
|
|
|
popover.contentViewController = viewController;
|
|
|
|
|
|
|
|
[popover showRelativeToRect:self.bounds ofView:self preferredEdge:NSRectEdgeMaxY];
|
|
|
|
|
|
|
|
[super mouseDown:theEvent];
|
|
|
|
}
|
|
|
|
|
2024-12-09 05:31:58 -03:00
|
|
|
- (IBAction)pressLock:(id)sender {
|
|
|
|
BOOL speedLock = [[NSUserDefaults standardUserDefaults] boolForKey:@"speedLock"];
|
|
|
|
speedLock = !speedLock;
|
|
|
|
[_LockButton setTitle:speedLock ? @"🔒" : @"🔓"];
|
|
|
|
[[NSUserDefaults standardUserDefaults] setBool:speedLock forKey:@"speedLock"];
|
|
|
|
|
|
|
|
if(speedLock) {
|
|
|
|
const double pitchValue = ([_PitchSlider doubleValue] - [_PitchSlider minValue]) / ([_PitchSlider maxValue] - [_PitchSlider minValue]);
|
|
|
|
const double tempoValue = ([_TempoSlider doubleValue] - [_TempoSlider minValue]) / ([_TempoSlider maxValue] - [_TempoSlider minValue]);
|
|
|
|
const double averageValue = (pitchValue + tempoValue) * 0.5;
|
|
|
|
[_PitchSlider setDoubleValue:(averageValue * ([_PitchSlider maxValue] - [_PitchSlider minValue])) + [_PitchSlider minValue]];
|
|
|
|
[_TempoSlider setDoubleValue:(averageValue * ([_TempoSlider maxValue] - [_TempoSlider minValue])) + [_TempoSlider minValue]];
|
|
|
|
|
|
|
|
[[_PitchSlider target] changePitch:_PitchSlider];
|
|
|
|
[[_TempoSlider target] changeTempo:_TempoSlider];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (IBAction)pressReset:(id)sender {
|
|
|
|
[_PitchSlider setDoubleValue:reverseSpeedScale(1.0, [_PitchSlider minValue], [_PitchSlider maxValue])];
|
|
|
|
[_TempoSlider setDoubleValue:reverseSpeedScale(1.0, [_TempoSlider minValue], [_TempoSlider maxValue])];
|
|
|
|
|
|
|
|
[[_PitchSlider target] changePitch:_PitchSlider];
|
|
|
|
[[_TempoSlider target] changeTempo:_TempoSlider];
|
|
|
|
}
|
|
|
|
|
2024-09-21 02:23:59 -03:00
|
|
|
@end
|