diff --git a/Assets/Example Delegate/DelegateTester.cs b/Assets/Example Delegate/DelegateTester.cs index d62136a..41796f6 100644 --- a/Assets/Example Delegate/DelegateTester.cs +++ b/Assets/Example Delegate/DelegateTester.cs @@ -18,11 +18,17 @@ void Knob(MidiChannel channel, int knobNumber, float knobValue) Debug.Log("Knob: " + knobNumber + "," + knobValue); } + void Bend(MidiChannel channel, float bend) + { + Debug.Log("Bend: " + bend); + } + void OnEnable() { MidiMaster.noteOnDelegate += NoteOn; MidiMaster.noteOffDelegate += NoteOff; MidiMaster.knobDelegate += Knob; + MidiMaster.pitchBendDelegate += Bend; } void OnDisable() @@ -30,5 +36,6 @@ void OnDisable() MidiMaster.noteOnDelegate -= NoteOn; MidiMaster.noteOffDelegate -= NoteOff; MidiMaster.knobDelegate -= Knob; + MidiMaster.pitchBendDelegate -= Bend; } } diff --git a/Assets/Example PitchBend/Example PitchBend.unity b/Assets/Example PitchBend/Example PitchBend.unity new file mode 100644 index 0000000..6ab6fbb --- /dev/null +++ b/Assets/Example PitchBend/Example PitchBend.unity @@ -0,0 +1,370 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 1, g: 1, b: 1, a: 1} + m_AmbientEquatorColor: {r: 1, g: 1, b: 1, a: 1} + m_AmbientGroundColor: {r: 1, g: 1, b: 1, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 1 + m_BakeResolution: 50 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 0 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 0 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &88975960 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 88975965} + - component: {fileID: 88975964} + - component: {fileID: 88975963} + - component: {fileID: 88975962} + - component: {fileID: 88975961} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &88975961 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 88975960} + m_Enabled: 1 +--- !u!124 &88975962 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 88975960} + m_Enabled: 1 +--- !u!92 &88975963 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 88975960} + m_Enabled: 1 +--- !u!20 &88975964 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 88975960} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.15619594, g: 0.17265896, b: 0.19852942, a: 0.019607844} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 50 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &88975965 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 88975960} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 8, y: 5, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &232682406 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 120770, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_Name + value: PitchBendIndicator + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 437276, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 431802, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalPosition.x + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 431802, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} + propertyPath: m_LocalPosition.y + value: 5 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 39e8548065bf6994799a68de6b6756f0, type: 3} +--- !u!1 &338998383 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 338998387} + - component: {fileID: 338998386} + - component: {fileID: 338998385} + - component: {fileID: 338998384} + m_Layer: 0 + m_Name: Bar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &338998384 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338998383} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &338998385 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338998383} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &338998386 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338998383} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &338998387 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338998383} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 8, y: 5, z: 1} + m_LocalScale: {x: 13.76, y: 0.12, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Example PitchBend/Example PitchBend.unity.meta b/Assets/Example PitchBend/Example PitchBend.unity.meta new file mode 100644 index 0000000..79cb3a6 --- /dev/null +++ b/Assets/Example PitchBend/Example PitchBend.unity.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 9910dda81c3a1074b8cfa2921bb6d52d +DefaultImporter: + userData: diff --git a/Assets/Example PitchBend/PitchBendIndicator.cs b/Assets/Example PitchBend/PitchBendIndicator.cs new file mode 100644 index 0000000..317de8e --- /dev/null +++ b/Assets/Example PitchBend/PitchBendIndicator.cs @@ -0,0 +1,16 @@ +using UnityEngine; +using MidiJack; + +public class PitchBendIndicator : MonoBehaviour +{ + void Awake() + { + transform.localScale = Vector3.one; + } + + void Update() + { + var p = MidiMaster.GetBend(); + transform.localPosition = new Vector3(0, p, 0); + } +} diff --git a/Assets/Example PitchBend/PitchBendIndicator.cs.meta b/Assets/Example PitchBend/PitchBendIndicator.cs.meta new file mode 100644 index 0000000..1a5a921 --- /dev/null +++ b/Assets/Example PitchBend/PitchBendIndicator.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 53e4036cafddd8c40834180be3bcfc8e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Example PitchBend/PitchBendIndicator.prefab b/Assets/Example PitchBend/PitchBendIndicator.prefab new file mode 100644 index 0000000..945f241 --- /dev/null +++ b/Assets/Example PitchBend/PitchBendIndicator.prefab @@ -0,0 +1,124 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &120770 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 437276} + - component: {fileID: 1189295360081504515} + m_Layer: 0 + m_Name: PitchBendIndicator + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &437276 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120770} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 431802} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1189295360081504515 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120770} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 53e4036cafddd8c40834180be3bcfc8e, type: 3} + m_Name: + m_EditorClassIdentifier: + PitchBendNumber: 0 +--- !u!1 &188880 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 431802} + - component: {fileID: 3337278} + - component: {fileID: 2397268} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &431802 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 188880} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 437276} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3337278 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 188880} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2397268 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 188880} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10302, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 diff --git a/Assets/Example PitchBend/PitchBendIndicator.prefab.meta b/Assets/Example PitchBend/PitchBendIndicator.prefab.meta new file mode 100644 index 0000000..808ecc1 --- /dev/null +++ b/Assets/Example PitchBend/PitchBendIndicator.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 39e8548065bf6994799a68de6b6756f0 +timeCreated: 1434717976 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MidiJack/MidiDriver.cs b/Assets/MidiJack/MidiDriver.cs index ffc408f..c5bd0ed 100644 --- a/Assets/MidiJack/MidiDriver.cs +++ b/Assets/MidiJack/MidiDriver.cs @@ -44,10 +44,14 @@ class ChannelState // Knob number to knob value mapping public Dictionary _knobMap; + // PitchBend -1 to +1 + public float _pitchBend; + public ChannelState() { _noteArray = new float[128]; _knobMap = new Dictionary(); + _pitchBend = 0.0f; } } @@ -99,6 +103,12 @@ public float GetKnob(MidiChannel channel, int knobNumber, float defaultValue) return defaultValue; } + public float GetBend(MidiChannel channel) + { + UpdateIfNeeded(); + return _channelArray[(int)channel]._pitchBend; + } + #endregion #region Event Delegates @@ -106,10 +116,12 @@ public float GetKnob(MidiChannel channel, int knobNumber, float defaultValue) public delegate void NoteOnDelegate(MidiChannel channel, int note, float velocity); public delegate void NoteOffDelegate(MidiChannel channel, int note); public delegate void KnobDelegate(MidiChannel channel, int knobNumber, float knobValue); + public delegate void PitchBendDelegate(MidiChannel channel, float bend); public NoteOnDelegate noteOnDelegate { get; set; } public NoteOffDelegate noteOffDelegate { get; set; } public KnobDelegate knobDelegate { get; set; } + public PitchBendDelegate pitchBendDelegate { get; set; } #endregion @@ -248,6 +260,17 @@ void Update() knobDelegate((MidiChannel)channelNumber, message.data1, level); } + // PitchBend message? + if (statusCode == 0xe) + { + var bendInt = ((int)message.data2 << 7) | (int)message.data2; + var bend = (((float)bendInt / 16383.0f) * 2.0f) - 1.0f; + _channelArray[channelNumber]._pitchBend = bend; + _channelArray[(int)MidiChannel.All]._pitchBend = bend; + if (pitchBendDelegate != null) + pitchBendDelegate((MidiChannel)channelNumber, bend); + } + #if UNITY_EDITOR // Record the message. _totalMessageCount++; diff --git a/Assets/MidiJack/MidiMaster.cs b/Assets/MidiJack/MidiMaster.cs index d888604..96bb9ac 100644 --- a/Assets/MidiJack/MidiMaster.cs +++ b/Assets/MidiJack/MidiMaster.cs @@ -41,6 +41,11 @@ public static MidiDriver.KnobDelegate knobDelegate { set { MidiDriver.Instance.knobDelegate = value; } } + public static MidiDriver.PitchBendDelegate pitchBendDelegate { + get { return MidiDriver.Instance.pitchBendDelegate; } + set { MidiDriver.Instance.pitchBendDelegate = value; } + } + // Returns the key state (on: velocity, off: zero). public static float GetKey(MidiChannel channel, int noteNumber) { @@ -95,5 +100,15 @@ public static float GetKnob(int knobNumber, float defaultValue = 0) { return MidiDriver.Instance.GetKnob(MidiChannel.All, knobNumber, defaultValue); } + + public static float GetBend(MidiChannel channel) + { + return MidiDriver.Instance.GetBend(channel); + } + + public static float GetBend() + { + return MidiDriver.Instance.GetBend(MidiChannel.All); + } } } diff --git a/MidiJack.unitypackage b/MidiJack.unitypackage index a3c88b4..1e15ed6 100644 Binary files a/MidiJack.unitypackage and b/MidiJack.unitypackage differ diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 78b2941..828e38d 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1 @@ -m_EditorVersion: 5.1.1f1 -m_StandardAssetsVersion: 0 +m_EditorVersion: 2018.3.11f1 diff --git a/README.md b/README.md index 906e6ce..6e1508f 100644 --- a/README.md +++ b/README.md @@ -55,11 +55,16 @@ mixed status of all active channels. Returns the list of active controllers. +- MidiMaster.GetBend (channel) + + Returns pitch bend value. The value ranges from -1.0 to 1.0. + There are also delegates for the each type of MIDI event. - MidiMaster.noteOnDelegate (channel, noteNumber, velocity) - MidiMaster.noteOffDelegate (channel, noteNumber) - MidiMaster.knobDelegate (channel, knobNumber, konbValue) +- MidiMaster.pitchBendDelegate (channel, bend) MIDI Monitor Window -------------------