diff --git a/docs/ReleaseNotes.md b/docs/ReleaseNotes.md index d5ac4d4..9faabce 100644 --- a/docs/ReleaseNotes.md +++ b/docs/ReleaseNotes.md @@ -1,14 +1,13 @@ # Release Notes -## PiPedal 1.2.41 -Version 1.2 is officially released. +## PiPedal 1.2.41 Release This version includes the following new features: - Supports Raspberry Pi 5. - Supports Rasberry Pi OS Bookworm. - TooB ML allows uploading of models. See below for further details. -- TooB ML allows uploading of model collections contained in .zip files. - TooBML support for large models (e.g. GuitarML Proteus models) +- Upload .zip file bundles to all File plugin controls. - Uploads can be organized into sub-directories. - Various minor improvements to TooB plugin user interfaces. diff --git a/react/src/FilePropertyDialog.tsx b/react/src/FilePropertyDialog.tsx index 7c17ddb..9105244 100644 --- a/react/src/FilePropertyDialog.tsx +++ b/react/src/FilePropertyDialog.tsx @@ -370,7 +370,7 @@ export default withStyles(styles, { withTheme: true })( { this.navigate(""); }} - sx={{ display: 'flex', alignItems: 'center' }} + sx={{ display: 'flex', alignItems: 'center',cursor: "default" }} > Home @@ -383,7 +383,7 @@ export default withStyles(styles, { withTheme: true })( target = pathConcat(target, directories[i]); let myTarget = target; breadcrumbs.push(( - { this.navigate(myTarget) }}> {directories[i]} @@ -392,7 +392,9 @@ export default withStyles(styles, { withTheme: true })( { let lastdirectory = directories[directories.length - 1]; breadcrumbs.push(( - {lastdirectory} + {lastdirectory} )); } diff --git a/react/src/Lv2Plugin.tsx b/react/src/Lv2Plugin.tsx index 2204183..d0b0b2b 100644 --- a/react/src/Lv2Plugin.tsx +++ b/react/src/Lv2Plugin.tsx @@ -26,7 +26,7 @@ interface Deserializable { } -export class Port implements Deserializable { +export class Port implements Deserializable { deserialize(input: any): Port { this.port_index = input.port_index; this.symbol = input.symbol; @@ -54,28 +54,27 @@ export class Port implements Deserializable { static deserialize_array(input: any): Port[] { let result: Port[] = []; - for (let i = 0; i < input.length; ++i) - { + for (let i = 0; i < input.length; ++i) { result[i] = new Port().deserialize(input[i]); } return result; } - port_index: number = -1; - symbol: string = ""; - name: string = ""; - min_value: number = 0; - max_value: number = 1; - default_value: number = 0.5; - scale_points: ScalePoint[] = []; - is_input: boolean = false; - is_output: boolean = false + port_index: number = -1; + symbol: string = ""; + name: string = ""; + min_value: number = 0; + max_value: number = 1; + default_value: number = 0.5; + scale_points: ScalePoint[] = []; + is_input: boolean = false; + is_output: boolean = false is_control_port: boolean = false; - is_audio_port: boolean = false; - is_atom_port: boolean = false; - is_valid: boolean = false; - supports_midi: boolean = false; + is_audio_port: boolean = false; + is_atom_port: boolean = false; + is_valid: boolean = false; + supports_midi: boolean = false; supports_time_position: boolean = false; - port_group: string = ""; + port_group: string = ""; comment: string = ""; is_bypass: boolean = false; is_program_controller: boolean = false; @@ -91,10 +90,9 @@ export class PortGroup { return this; } - static deserialize_array(input: any) : PortGroup[] { + static deserialize_array(input: any): PortGroup[] { let result: PortGroup[] = []; - for (let i = 0; i < input.length; ++i) - { + for (let i = 0; i < input.length; ++i) { result.push(new PortGroup().deserialize(input[i])); } return result; @@ -114,67 +112,71 @@ export class UiFileType { this.mimeType = input.mimeType; return this; } - static deserialize_array(input: any): UiFileType[] - { + static deserialize_array(input: any): UiFileType[] { let result: UiFileType[] = []; - for (let i = 0; i < input.length; ++i) - { + for (let i = 0; i < input.length; ++i) { result[i] = new UiFileType().deserialize(input[i]); } return result; } - private static IsAndroid() : boolean - { + private static IsAndroid(): boolean { return /Android/i.test(navigator.userAgent); } - static MergeMimeTypes(fileTypes: UiFileType[]): string - { - if (fileTypes.length === 0) { + static MergeMimeTypes(fileTypes: UiFileType[]): string { + if (fileTypes.length === 0) { return ""; } - let result = fileTypes[0].mimeType; - for (let i = 1; i < fileTypes.length; ++i) - { - let fileType = fileTypes[i]; - if (fileType.mimeType !== result) - { - if (result.startsWith("audio/") && fileType.mimeType.startsWith("audio/")) - { - result = "audio/*"; - } else if (result.startsWith("video/") && fileType.mimeType.startsWith("video/")) - { - result = "video/*"; - } else if (result.startsWith("text/") && fileType.mimeType.startsWith("text/")) - { - result = "text/*"; - } else { - result = "application/octet-stream"; - } - } - } - if (this.IsAndroid()) - { - if (result.startsWith("audio/")) result = "audio/*"; - if (result.startsWith("video/")) result = "video/*"; - if (result.startsWith("text/")) result = "text/*"; + if (this.IsAndroid()) { + return ""; // allow selection of .zip files, plus whatever. We'll catch it later. } else { // chrome desktop thinks "application/octet-stream" is .exe, .com, or .bat. // Feed it file extensions isntead. - if (result === "application/octet-stream") - { - result = ""; - for (let i = 0; i < fileTypes.length; ++i) - { - if (i !== 0) + let result = ""; + for (let i = 0; i < fileTypes.length; ++i) { + let fileType = fileTypes[i]; + if (fileType.fileExtension !== "") { + if (result.length !== 0) // prefer file extensions. { - result += ','; + result += ","; + result += fileType.fileExtension; + } + } else { + if (fileType.mimeType !== result) { + let t = ""; + if (result.startsWith("audio/") && fileType.mimeType.startsWith("audio/")) { + t = "audio/*"; + } else if (result.startsWith("video/") && fileType.mimeType.startsWith("video/")) { + t = "video/*"; + } else if (result.startsWith("text/") && fileType.mimeType.startsWith("text/")) { + t = "text/*"; + } + if (t.length !== 0) { + if (result.length !== 0) { + result += ","; + } + result += t; + } } - result += fileTypes[i].fileExtension; } } + let hasZip = false; + let types = result.split(","); + for (let thisType of types) { + if (thisType === ".zip") { + hasZip = true; + break; + } + } + + // add .zip files + if (!hasZip) { + if (result.length !== 0) { + result += ",.zip"; + } + } + return result; } - return result; } name: string = ""; fileExtension: string = ""; @@ -182,19 +184,16 @@ export class UiFileType { } export class UiPropertyNotification { - deserialize(input: any): UiPropertyNotification - { + deserialize(input: any): UiPropertyNotification { this.portIndex = input.portIndex; this.symbol = input.symbol; this.plugin = input.plugin; this.protocol = input.protocol; return this; } - static deserialize_array(input: any): UiPropertyNotification[] - { + static deserialize_array(input: any): UiPropertyNotification[] { let result: UiPropertyNotification[] = []; - for (let i = 0; i < input.length; ++i) - { + for (let i = 0; i < input.length; ++i) { result[i] = new UiPropertyNotification().deserialize(input[i]); } return result; @@ -207,8 +206,7 @@ export class UiPropertyNotification { }; export class UiFrequencyPlot { - deserialize(input: any): UiFrequencyPlot - { + deserialize(input: any): UiFrequencyPlot { this.patchProperty = input.patchProperty; this.index = input.index; this.portGroup = input.portGroup; @@ -220,11 +218,9 @@ export class UiFrequencyPlot { this.width = input.width; return this; } - static deserialize_array(input: any): UiFrequencyPlot[] - { + static deserialize_array(input: any): UiFrequencyPlot[] { let result: UiFrequencyPlot[] = []; - for (let i = 0; i < input.length; ++i) - { + for (let i = 0; i < input.length; ++i) { result[i] = new UiFrequencyPlot().deserialize(input[i]); } return result; @@ -242,78 +238,73 @@ export class UiFrequencyPlot { }; export class UiFileProperty { - deserialize(input: any): UiFileProperty - { - this.label = input.label; - this.fileTypes = UiFileType.deserialize_array(input.fileTypes); - this.patchProperty = input.patchProperty; - this.directory = input.directory; - this.index = input.index; - this.portGroup = input.portGroup; - this.resourceDirectory = input.resourceDirectory??""; - return this; - } - static deserialize_array(input: any): UiFileProperty[] - { - let result: UiFileProperty[] = []; - for (let i = 0; i < input.length; ++i) - { - result[i] = new UiFileProperty().deserialize(input[i]); - } - return result; + deserialize(input: any): UiFileProperty { + this.label = input.label; + this.fileTypes = UiFileType.deserialize_array(input.fileTypes); + this.patchProperty = input.patchProperty; + this.directory = input.directory; + this.index = input.index; + this.portGroup = input.portGroup; + this.resourceDirectory = input.resourceDirectory ?? ""; + return this; + } + static deserialize_array(input: any): UiFileProperty[] { + let result: UiFileProperty[] = []; + for (let i = 0; i < input.length; ++i) { + result[i] = new UiFileProperty().deserialize(input[i]); } + return result; + } - private static getFileExtension(name: string): string { - let pos = name.lastIndexOf('.'); - let filenamePos = name.lastIndexOf('/') +1; - filenamePos = Math.max(name.lastIndexOf('\\')+1); - filenamePos = Math.max(name.lastIndexOf(':')+1); - if (pos < filenamePos) - { - return ""; - } - - if (pos !== -1) { - return name.substring(pos); - } + private static getFileExtension(name: string): string { + let pos = name.lastIndexOf('.'); + let filenamePos = name.lastIndexOf('/') + 1; + filenamePos = Math.max(name.lastIndexOf('\\') + 1); + filenamePos = Math.max(name.lastIndexOf(':') + 1); + if (pos < filenamePos) { return ""; } - - wantsFile(filename: string) : boolean { - if (this.fileTypes.length === 0) { + + if (pos !== -1) { + return name.substring(pos); + } + return ""; + } + + wantsFile(filename: string): boolean { + if (this.fileTypes.length === 0) { + return true; + } + let extension = UiFileProperty.getFileExtension(filename); + if (extension === ".zip") { + return true; + } + for (let fileType of this.fileTypes) { + if (fileType.fileExtension === extension) { return true; } - let extension = UiFileProperty.getFileExtension(filename); - for (let fileType of this.fileTypes) - { - if (fileType.fileExtension === extension ) - { - return true; - } - if (fileType.fileExtension === "*" || fileType.fileExtension === "") - { - return true; - } + if (fileType.fileExtension === "*" || fileType.fileExtension === "") { + return true; } - return false; } + return false; + } - label: string = ""; - fileTypes: UiFileType[] = []; - patchProperty: string = ""; - directory: string = ""; - index: number = -1; - portGroup: string = ""; - resourceDirectory: string = ""; + label: string = ""; + fileTypes: UiFileType[] = []; + patchProperty: string = ""; + directory: string = ""; + index: number = -1; + portGroup: string = ""; + resourceDirectory: string = ""; }; -export class Lv2Plugin implements Deserializable { - deserialize(input: any): Lv2Plugin - { +export class Lv2Plugin implements Deserializable { + deserialize(input: any): Lv2Plugin { this.uri = input.uri; this.name = input.name; - this.brand = input.name? input.name: ""; - this.label = input.label? input.label: this.name; + this.brand = input.name ? input.name : ""; + this.label = input.label ? input.label : this.name; this.plugin_class = input.plugin_class; this.supported_features = input.supported_features; this.required_features = input.required_features; @@ -321,23 +312,20 @@ export class Lv2Plugin implements Deserializable { this.author_name = input.author_name; this.author_homepage = input.author_homepage; this.comment = input.comment; - this.ports= Port.deserialize_array(input.ports); + this.ports = Port.deserialize_array(input.ports); this.port_groups = PortGroup.deserialize_array(input.port_groups); - if (input.fileProperties) - { + if (input.fileProperties) { this.fileProperties = UiFileProperty.deserialize_array(input.fileProperties) } else { this.fileProperties = []; } - if (input.frequencyPlots) - { + if (input.frequencyPlots) { this.frequencyPlots = UiFrequencyPlot.deserialize_array(input.frequencyPlots) } else { this.frequencyPlots = []; } - if (input.uiPortNotifications) - { + if (input.uiPortNotifications) { this.uiPortNotifications = UiPropertyNotification.deserialize_array(input.uiPortNotifications); } else { this.uiPortNotifications = []; @@ -346,36 +334,34 @@ export class Lv2Plugin implements Deserializable { } static EmptyFeatures: string[] = []; - uri: string = ""; - name: string = ""; - brand: string = ""; - label: string = ""; - plugin_class: string = ""; + uri: string = ""; + name: string = ""; + brand: string = ""; + label: string = ""; + plugin_class: string = ""; supported_features: string[] = Lv2Plugin.EmptyFeatures; - required_features: string[] = Lv2Plugin.EmptyFeatures; - optional_features: string[] = Lv2Plugin.EmptyFeatures; - author_name: string = ""; - author_homepage: string = ""; - comment: string = ""; - ports: Port[] = Port.EmptyPorts; - port_groups: PortGroup[] = []; - fileProperties: UiFileProperty[] = []; - frequencyPlots: UiFrequencyPlot[] = []; + required_features: string[] = Lv2Plugin.EmptyFeatures; + optional_features: string[] = Lv2Plugin.EmptyFeatures; + author_name: string = ""; + author_homepage: string = ""; + comment: string = ""; + ports: Port[] = Port.EmptyPorts; + port_groups: PortGroup[] = []; + fileProperties: UiFileProperty[] = []; + frequencyPlots: UiFrequencyPlot[] = []; uiPortNotifications: UiPropertyNotification[] = []; } -export class ScalePoint implements Deserializable { +export class ScalePoint implements Deserializable { deserialize(input: any): ScalePoint { this.value = input.value; this.label = input.label; return this; } - static deserialize_array(input: any): ScalePoint[] - { + static deserialize_array(input: any): ScalePoint[] { let result: ScalePoint[] = []; - for (let i = 0; i < input.length; ++i) - { + for (let i = 0; i < input.length; ++i) { result[i] = new ScalePoint().deserialize(input[i]); } return result; @@ -386,9 +372,9 @@ export class ScalePoint implements Deserializable { export enum PluginType { // Reserved types used in pedalboards. - None="", - InvalidPlugin= "InvalidPlugin", - + None = "", + InvalidPlugin = "InvalidPlugin", + Plugin = "Plugin", AllpassPlugin = "AllpassPlugin", AmplifierPlugin = "AmplifierPlugin", @@ -428,7 +414,7 @@ export enum PluginType { UtilityPlugin = "UtilityPlugin", WaveshaperPlugin = "WaveshaperPlugin", - // psuedo plugin type for the Amps node of the filter dialog. + // psuedo plugin type for the Amps node of the filter dialog. PiPedalAmpsNode = "PiPedalAmpsNode", // pseudo plugin types for splitter. @@ -457,9 +443,8 @@ export enum ControlType { OutputSelect } -export class UiControl implements Deserializable { - deserialize(input: any): UiControl - { +export class UiControl implements Deserializable { + deserialize(input: any): UiControl { this.symbol = input.symbol; this.name = input.name; this.index = input.index; @@ -480,27 +465,23 @@ export class UiControl implements Deserializable { this.units = input.units as Units; this.comment = input.comment ?? ""; - this.is_bypass = input.is_bypass ? true: false; - this.is_program_controller = input.is_program_controller? true: false; + this.is_bypass = input.is_bypass ? true : false; + this.is_program_controller = input.is_program_controller ? true : false; this.custom_units = input.custom_units ?? ""; - this.connection_optional = input.connection_optional ? true: false; + this.connection_optional = input.connection_optional ? true : false; - if (this.is_bypass) - { + if (this.is_bypass) { this.not_on_gui = true; } this.controlType = ControlType.Dial; - if (!this.is_input) - { - if (this.units === Units.midiNote) - { + if (!this.is_input) { + if (this.units === Units.midiNote) { this.controlType = ControlType.Tuner; - } else if (this.units === Units.db) - { + } else if (this.units === Units.db) { this.controlType = ControlType.DbVu; } else if (this.enumeration_property) { this.controlType = ControlType.OutputSelect; @@ -508,45 +489,36 @@ export class UiControl implements Deserializable { this.controlType = ControlType.Vu; } } - if (this.isValidEnumeration()) - { + if (this.isValidEnumeration()) { this.controlType = ControlType.Select; - if (this.scale_points.length === 2) - { + if (this.scale_points.length === 2) { this.controlType = ControlType.ABSwitch; } } else { - if (this.toggled_property || (this.integer_property && this.min_value === 0 && this.max_value === 1)) - { + if (this.toggled_property || (this.integer_property && this.min_value === 0 && this.max_value === 1)) { this.controlType = ControlType.OnOffSwitch; } } return this; } - applyProperties(properties: Partial): UiControl - { - return {...this,...properties}; + applyProperties(properties: Partial): UiControl { + return { ...this, ...properties }; } private hasScalePoint(value: number): boolean { - for (let scale_point of this.scale_points) - { + for (let scale_point of this.scale_points) { if (scale_point.value === value) return true; } return false; } - private isValidEnumeration() : boolean { + private isValidEnumeration(): boolean { if (this.enumeration_property) return true; - if (this.toggled_property && this.min_value === 0 && this.max_value === 1) - { - if (this.hasScalePoint(this.min_value) && this.hasScalePoint(this.max_value)) - { + if (this.toggled_property && this.min_value === 0 && this.max_value === 1) { + if (this.hasScalePoint(this.min_value) && this.hasScalePoint(this.max_value)) { return true; } } - if (this.integer_property && this.min_value === 0 && this.max_value === 1) - { - if (this.hasScalePoint(this.min_value) && this.hasScalePoint(this.max_value)) - { + if (this.integer_property && this.min_value === 0 && this.max_value === 1) { + if (this.hasScalePoint(this.min_value) && this.hasScalePoint(this.max_value)) { return true; } } @@ -557,23 +529,22 @@ export class UiControl implements Deserializable { static deserialize_array(input: any): UiControl[] { let result: UiControl[] = []; - for (let i = 0; i < input.length; ++i) - { + for (let i = 0; i < input.length; ++i) { result[i] = new UiControl().deserialize(input[i]); } return result; } symbol: string = ""; - name: string = ""; + name: string = ""; index: number = -1; is_input: boolean = true; min_value: number = 0; max_value: number = 1; - default_value:number = 0.5; + default_value: number = 0.5; is_logarithmic: boolean = false; display_priority: number = -1; range_steps: number = 0; - integer_property:boolean = false; + integer_property: boolean = false; enumeration_property: boolean = false; trigger: boolean = false; not_on_gui: boolean = false; @@ -589,16 +560,13 @@ export class UiControl implements Deserializable { // Return the value of the closest scale_point. - clampSelectValue(value: number): number{ - if (this.scale_points.length !== 0) - { + clampSelectValue(value: number): number { + if (this.scale_points.length !== 0) { let minError = 1.0E100; let bestValue = value; - for (let i = 0; i < this.scale_points.length; ++i) - { - let error = Math.abs(this.scale_points[i].value-value); - if (error < minError) - { + for (let i = 0; i < this.scale_points.length; ++i) { + let error = Math.abs(this.scale_points[i].value - value); + if (error < minError) { minError = error; bestValue = this.scale_points[i].value; } @@ -609,20 +577,20 @@ export class UiControl implements Deserializable { } } - isHidden() : boolean { + isHidden(): boolean { return this.not_on_gui || (this.connection_optional && !this.is_input); } - isOnOffSwitch() : boolean { + isOnOffSwitch(): boolean { return this.controlType === ControlType.OnOffSwitch; } isAbToggle(): boolean { return this.controlType === ControlType.ABSwitch; } - isSelect() : boolean { + isSelect(): boolean { return this.controlType === ControlType.Select; } - isOutputSelect() : boolean { + isOutputSelect(): boolean { return !this.is_input && this.controlType === ControlType.OutputSelect; } @@ -630,23 +598,23 @@ export class UiControl implements Deserializable { isLamp(): boolean { return this.toggled_property && this.scale_points.length === 0 && !this.is_input; } - isDial() : boolean { + isDial(): boolean { return this.controlType === ControlType.Dial; } - isTuner() : boolean { + isTuner(): boolean { return this.controlType === ControlType.Tuner; } - isVu() : boolean { + isVu(): boolean { return this.controlType === ControlType.Vu; } - isDbVu() : boolean { + isDbVu(): boolean { return this.controlType === ControlType.DbVu; } valueToRange(value: number): number { - if (this.toggled_property) return value === 0 ? 0: 1; + if (this.toggled_property) return value === 0 ? 0 : 1; if (this.integer_property || this.enumeration_property) { value = Math.round(value); @@ -659,11 +627,11 @@ export class UiControl implements Deserializable { return range; } - rangeToValue(range: number) : number { + rangeToValue(range: number): number { if (range < 0) range = 0; if (range > 1) range = 1; - if (this.toggled_property) return range === 0? 0: 1; + if (this.toggled_property) return range === 0 ? 0 : 1; let value = range * (this.max_value - this.min_value) + this.min_value; if (this.integer_property || this.enumeration_property) { @@ -680,11 +648,9 @@ export class UiControl implements Deserializable { value = Math.round(value); } - for (let i = 0; i < this.scale_points.length; ++i) - { + for (let i = 0; i < this.scale_points.length; ++i) { let scalePoint = this.scale_points[i]; - if (scalePoint.value === value) - { + if (scalePoint.value === value) { return scalePoint.label; } } @@ -738,8 +704,7 @@ export class UiControl implements Deserializable { } return text; } - formatShortValue(value: number): string - { + formatShortValue(value: number): string { if (this.enumeration_property) { for (let i = 0; i < this.scale_points.length; ++i) { let scale_point = this.scale_points[i]; @@ -761,17 +726,16 @@ export class UiControl implements Deserializable { } } - + } export class UiPlugin implements Deserializable { - deserialize(input: any): UiPlugin - { + deserialize(input: any): UiPlugin { this.uri = input.uri; this.name = input.name; - this.brand = input.brand ? input.brand: ""; - this.label = input.label? input.label: this.name; + this.brand = input.brand ? input.brand : ""; + this.label = input.label ? input.label : this.name; this.plugin_type = input.plugin_type as PluginType; this.plugin_display_type = input.plugin_display_type; this.author_name = input.author_name; @@ -783,14 +747,12 @@ export class UiPlugin implements Deserializable { this.description = input.description; this.controls = UiControl.deserialize_array(input.controls); this.port_groups = PortGroup.deserialize_array(input.port_groups); - if (input.fileProperties) - { + if (input.fileProperties) { this.fileProperties = UiFileProperty.deserialize_array(input.fileProperties) } else { this.fileProperties = []; } - if (input.frequencyPlots) - { + if (input.frequencyPlots) { this.frequencyPlots = UiFrequencyPlot.deserialize_array(input.frequencyPlots) } else { this.frequencyPlots = []; @@ -802,8 +764,7 @@ export class UiPlugin implements Deserializable { } static deserialize_array(input: any): UiPlugin[] { let result: UiPlugin[] = []; - for (let i = 0; i < input.length; ++i) - { + for (let i = 0; i < input.length; ++i) { result[i] = new UiPlugin().deserialize(input[i]); } return result; @@ -814,191 +775,182 @@ export class UiPlugin implements Deserializable { } getControl(key: string): UiControl | undefined { - for (let i = 0; i < this.controls.length; ++i) - { + for (let i = 0; i < this.controls.length; ++i) { let control = this.controls[i]; - if (control.symbol === key) - { + if (control.symbol === key) { return control; } - } + } return undefined; } - - getPortGroupByUri(uri: string) :PortGroup | null - { - for (let i = 0; i < this.port_groups.length; ++i) - { + + getPortGroupByUri(uri: string): PortGroup | null { + for (let i = 0; i < this.port_groups.length; ++i) { let port_group = this.port_groups[i]; - if (port_group.uri === uri) - { + if (port_group.uri === uri) { return port_group; } } return null; } - getPortGroupBySymbol(symbol: string): PortGroup | null - { - for (let i = 0; i < this.port_groups.length; ++i) - { + getPortGroupBySymbol(symbol: string): PortGroup | null { + for (let i = 0; i < this.port_groups.length; ++i) { let port_group = this.port_groups[i]; - if (port_group.symbol === symbol) - { + if (port_group.symbol === symbol) { return port_group; } } return null; } - uri: string = ""; - name: string = ""; - brand: string = ""; - label: string = ""; - plugin_type: PluginType = PluginType.InvalidPlugin; + uri: string = ""; + name: string = ""; + brand: string = ""; + label: string = ""; + plugin_type: PluginType = PluginType.InvalidPlugin; plugin_display_type: string = ""; - author_name: string = ""; - author_homepage: string = ""; - audio_inputs: number = 0; - audio_outputs: number = 0; - has_midi_input: number = 0; - has_midi_output: number = 0; - description: string = ""; - controls: UiControl[] = []; - port_groups: PortGroup[] = []; - fileProperties: UiFileProperty[] = []; - frequencyPlots: UiFrequencyPlot[] = []; - is_vst3 : boolean = false; + author_name: string = ""; + author_homepage: string = ""; + audio_inputs: number = 0; + audio_outputs: number = 0; + has_midi_input: number = 0; + has_midi_output: number = 0; + description: string = ""; + controls: UiControl[] = []; + port_groups: PortGroup[] = []; + fileProperties: UiFileProperty[] = []; + frequencyPlots: UiFrequencyPlot[] = []; + is_vst3: boolean = false; } -export function makeSplitUiPlugin(): UiPlugin -{ +export function makeSplitUiPlugin(): UiPlugin { return new UiPlugin().deserialize({ - uri: "uri://two-play/pipedal/pedalboard#Split", - name: "Split", - brand: "", - label: "", - plugin_type: PluginType.SplitA, + uri: "uri://two-play/pipedal/pedalboard#Split", + name: "Split", + brand: "", + label: "", + plugin_type: PluginType.SplitA, plugin_display_type: "Split", - author_name: "", - author_homepage: "", - audio_inputs: 1, - audio_outputs: 1, - has_midi_input: 0, - has_midi_output: 0, + author_name: "", + author_homepage: "", + audio_inputs: 1, + audio_outputs: 1, + has_midi_input: 0, + has_midi_output: 0, description: "", - controls: [ + controls: [ new UiControl().applyProperties({ symbol: "splitType", - name: "Type", + name: "Type", index: 0, is_input: true, min_value: 0.0, - max_value: 2.0, + max_value: 2.0, enumeration_property: true, scale_points: [ - new ScalePoint().deserialize({value: 0, label: "A/B"}), - new ScalePoint().deserialize({value: 1, label: "mix"}), - new ScalePoint().deserialize({value: 1, label: "L/R"}), + new ScalePoint().deserialize({ value: 0, label: "A/B" }), + new ScalePoint().deserialize({ value: 1, label: "mix" }), + new ScalePoint().deserialize({ value: 1, label: "L/R" }), ], is_bypass: false, is_program_controller: false, custom_units: "", connection_optional: false, - - }) , + + }), new UiControl().applyProperties({ symbol: "select", - name: "Select", + name: "Select", index: 1, is_input: true, min_value: 0.0, - max_value: 1.0, + max_value: 1.0, enumeration_property: true, scale_points: [ - new ScalePoint().deserialize({value: 0, label: "A"}), - new ScalePoint().deserialize({value: 1, label: "B"}), + new ScalePoint().deserialize({ value: 0, label: "A" }), + new ScalePoint().deserialize({ value: 1, label: "B" }), ], is_bypass: false, is_program_controller: false, custom_units: "", connection_optional: false, - - }) , + + }), new UiControl().applyProperties({ symbol: "mix", - name: "Mix", + name: "Mix", index: 2, is_input: true, min_value: -1.0, - max_value: 1.0, + max_value: 1.0, is_bypass: false, is_program_controller: false, custom_units: "", connection_optional: false, - - }) , + + }), new UiControl().applyProperties({ symbol: "panL", - name: "Pan Top", + name: "Pan Top", index: 3, is_input: true, min_value: -1.0, - max_value: 1.0, + max_value: 1.0, is_bypass: false, is_program_controller: false, custom_units: "", connection_optional: false, - - }) , + + }), new UiControl().applyProperties({ symbol: "volL", - name: "Vol Top", + name: "Vol Top", index: 4, is_input: true, min_value: -60.0, - max_value: 12.0, + max_value: 12.0, is_bypass: false, is_program_controller: false, custom_units: "", connection_optional: false, - - }) , + + }), new UiControl().applyProperties({ symbol: "panR", - name: "Pan Bottom", + name: "Pan Bottom", index: 5, is_input: true, min_value: -1.0, - max_value: 1.0, + max_value: 1.0, is_bypass: false, is_program_controller: false, custom_units: "", connection_optional: false, - - }) , + + }), new UiControl().applyProperties({ symbol: "volR", - name: "Vol Bottom", + name: "Vol Bottom", index: 6, is_input: true, min_value: -60.0, - max_value: 12.0, + max_value: 12.0, is_bypass: false, is_program_controller: false, custom_units: "", connection_optional: false, - }) + }) ], - port_groups: [], + port_groups: [], fileProperties: [], frequencyPlots: [], - is_vst3 : false, - + is_vst3: false, + } ); } diff --git a/todo.txt b/todo.txt index fcf7c67..b68f42a 100644 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,3 @@ -- change icons on gallery in index.html -- provide direct link to docs on both landing pages. - feature: redo ./makepackage so that it runs without sudo. - Bug: text Cursor hovering over the breadcrumb bar in file property dialog. - Bug: Turning off wifi-direct sould re-enable NetworkManager.