pull/1/head
asb2m10 10 years ago
parent 9f8c11346e
commit df045032ce
  1. 96
      Builds/Linux/Makefile
  2. 86
      Builds/MacOSX/Dexed.xcodeproj/project.pbxproj
  3. BIN
      Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate
  4. 46
      Builds/VisualStudio2012/Dexed.vcxproj
  5. 102
      Builds/VisualStudio2012/Dexed.vcxproj.filters
  6. 46
      Builds/VisualStudio2013/Dexed.vcxproj
  7. 102
      Builds/VisualStudio2013/Dexed.vcxproj.filters
  8. 64
      Dexed.jucer
  9. 6
      README.md
  10. 287
      Source/EngineMkI.cpp
  11. 32
      Source/EngineMkI.h
  12. 209
      Source/EngineOpl.cpp
  13. 34
      Source/EngineOpl.h
  14. 29
      Source/PluginData.cpp
  15. 27
      Source/PluginEditor.cpp
  16. 3
      Source/PluginEditor.h
  17. 4
      Source/PluginParam.cpp
  18. 35
      Source/PluginProcessor.cpp
  19. 26
      Source/PluginProcessor.h
  20. 4
      Source/msfa/controllers.h
  21. 84
      Source/msfa/dx7note.cc
  22. 3
      Source/msfa/dx7note.h
  23. 123
      Source/msfa/fm_core.cc
  24. 30
      Source/msfa/fm_core.h
  25. 102
      Source/msfa/fm_op_kernel.cc
  26. 19
      Source/msfa/fm_op_kernel.h
  27. 2
      Source/msfa/synth.h

@ -51,9 +51,15 @@ ifeq ($(CONFIG),Release)
endif
OBJECTS := \
$(OBJDIR)/PluginProcessor_a059e380.o \
$(OBJDIR)/PluginParam_c683be7b.o \
$(OBJDIR)/PluginData_e9169086.o \
$(OBJDIR)/PluginFx_d84f776e.o \
$(OBJDIR)/EngineMkI_615efdaa.o \
$(OBJDIR)/EngineOpl_d5a0e5ea.o \
$(OBJDIR)/PluginEditor_94d4fb09.o \
$(OBJDIR)/GlobalEditor_4b9bc379.o \
$(OBJDIR)/ParamDialog_aca81c16.o \
$(OBJDIR)/OperatorEditor_b03d363a.o \
$(OBJDIR)/DXLookNFeel_cfc3afa2.o \
$(OBJDIR)/DXComponents_a6963633.o \
$(OBJDIR)/freqlut_ca864b55.o \
$(OBJDIR)/lfo_a7533573.o \
$(OBJDIR)/dx7note_176ee213.o \
@ -63,13 +69,9 @@ OBJECTS := \
$(OBJDIR)/fm_op_kernel_f831cdd1.o \
$(OBJDIR)/pitchenv_d3341dc7.o \
$(OBJDIR)/sin_b36ef3f0.o \
$(OBJDIR)/PluginEditor_94d4fb09.o \
$(OBJDIR)/GlobalEditor_4b9bc379.o \
$(OBJDIR)/ParamDialog_aca81c16.o \
$(OBJDIR)/OperatorEditor_b03d363a.o \
$(OBJDIR)/DXLookNFeel_cfc3afa2.o \
$(OBJDIR)/DXComponents_a6963633.o \
$(OBJDIR)/PluginFx_d84f776e.o \
$(OBJDIR)/PluginProcessor_a059e380.o \
$(OBJDIR)/PluginParam_c683be7b.o \
$(OBJDIR)/PluginData_e9169086.o \
$(OBJDIR)/SysexComm_f57b4ecd.o \
$(OBJDIR)/BinaryData_ce4232d4.o \
$(OBJDIR)/juce_audio_basics_2442e4ea.o \
@ -104,19 +106,49 @@ strip:
@echo Stripping Dexed
-@strip --strip-unneeded $(OUTDIR)/$(TARGET)
$(OBJDIR)/PluginProcessor_a059e380.o: ../../Source/PluginProcessor.cpp
$(OBJDIR)/PluginFx_d84f776e.o: ../../Source/PluginFx.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling PluginProcessor.cpp"
@echo "Compiling PluginFx.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/PluginParam_c683be7b.o: ../../Source/PluginParam.cpp
$(OBJDIR)/EngineMkI_615efdaa.o: ../../Source/EngineMkI.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling PluginParam.cpp"
@echo "Compiling EngineMkI.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/PluginData_e9169086.o: ../../Source/PluginData.cpp
$(OBJDIR)/EngineOpl_d5a0e5ea.o: ../../Source/EngineOpl.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling PluginData.cpp"
@echo "Compiling EngineOpl.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/PluginEditor_94d4fb09.o: ../../Source/PluginEditor.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling PluginEditor.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/GlobalEditor_4b9bc379.o: ../../Source/GlobalEditor.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling GlobalEditor.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/ParamDialog_aca81c16.o: ../../Source/ParamDialog.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling ParamDialog.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/OperatorEditor_b03d363a.o: ../../Source/OperatorEditor.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling OperatorEditor.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/DXLookNFeel_cfc3afa2.o: ../../Source/DXLookNFeel.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling DXLookNFeel.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/DXComponents_a6963633.o: ../../Source/DXComponents.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling DXComponents.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/freqlut_ca864b55.o: ../../Source/msfa/freqlut.cc
@ -164,39 +196,19 @@ $(OBJDIR)/sin_b36ef3f0.o: ../../Source/msfa/sin.cc
@echo "Compiling sin.cc"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/PluginEditor_94d4fb09.o: ../../Source/PluginEditor.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling PluginEditor.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/GlobalEditor_4b9bc379.o: ../../Source/GlobalEditor.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling GlobalEditor.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/ParamDialog_aca81c16.o: ../../Source/ParamDialog.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling ParamDialog.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/OperatorEditor_b03d363a.o: ../../Source/OperatorEditor.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling OperatorEditor.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/DXLookNFeel_cfc3afa2.o: ../../Source/DXLookNFeel.cpp
$(OBJDIR)/PluginProcessor_a059e380.o: ../../Source/PluginProcessor.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling DXLookNFeel.cpp"
@echo "Compiling PluginProcessor.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/DXComponents_a6963633.o: ../../Source/DXComponents.cpp
$(OBJDIR)/PluginParam_c683be7b.o: ../../Source/PluginParam.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling DXComponents.cpp"
@echo "Compiling PluginParam.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/PluginFx_d84f776e.o: ../../Source/PluginFx.cpp
$(OBJDIR)/PluginData_e9169086.o: ../../Source/PluginData.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling PluginFx.cpp"
@echo "Compiling PluginData.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/SysexComm_f57b4ecd.o: ../../Source/SysexComm.cpp

@ -17,9 +17,15 @@
A7D45B047CA84D7EF7018CDC = {isa = PBXBuildFile; fileRef = 2F55D83145737DE69999DB92; };
7E444608AFB10ED54DB5C9AB = {isa = PBXBuildFile; fileRef = 5E966C95FACF7B8D5A907FE3; };
813B2285513D65DDA30AA6E3 = {isa = PBXBuildFile; fileRef = 6F9852573AA442CFBAD9695F; };
1CBFE444B43C89E749602B7F = {isa = PBXBuildFile; fileRef = 45ADFD8885BE76C7F7D999AC; };
623AFA9E78826CA0136251DF = {isa = PBXBuildFile; fileRef = 59D15F780D468B587F9C7E78; };
8BE2A084394DA3E45DDB5646 = {isa = PBXBuildFile; fileRef = 7936BBAA586387B2FAFB958B; };
B18C192606DF6079E7B9AEB9 = {isa = PBXBuildFile; fileRef = 8BADEB7BF1A65E83A7A1736D; };
697C52FD23363CB2EB9075C6 = {isa = PBXBuildFile; fileRef = 8BEBEDCAD409EE3A5D383B6D; };
4B27ACC5993C8C74FFCDD3BB = {isa = PBXBuildFile; fileRef = 61F792AFE04C15F413A4F766; };
478699B4EF80A1A1C0D34C10 = {isa = PBXBuildFile; fileRef = 018D0FB9E97B68D2EB3E3F72; };
C510246D7D5E162C9DE63DDE = {isa = PBXBuildFile; fileRef = 19CEF599CB23958AC63D427E; };
CD1CF0C6B4AB9F4C8175FE08 = {isa = PBXBuildFile; fileRef = F221CF21582EE0B8FE774583; };
082D6FF34EFF195C3A3B0CFB = {isa = PBXBuildFile; fileRef = 838E63F5800CA577B92EF6AE; };
D5A4D43A16EA4C71D53E96CD = {isa = PBXBuildFile; fileRef = A02775EA788AD4BF7DD1B1A1; };
8121E10419E2D99645EA254E = {isa = PBXBuildFile; fileRef = D984CE634945077E682B48F3; };
3AB728E101D7B85DD39C5CC8 = {isa = PBXBuildFile; fileRef = 3715DFDD7A1B12083F051F5A; };
FAC9C3E771D11FDA4DFAF17E = {isa = PBXBuildFile; fileRef = 2D26E2304C0F6FC633936014; };
47C317B0F77A29ECA0400B2B = {isa = PBXBuildFile; fileRef = AE09B4C2A4BDE8FDA01A8A13; };
@ -29,13 +35,9 @@
434647C21C803FA8A4D44A70 = {isa = PBXBuildFile; fileRef = 78CA76788217B98287D9E007; };
95105DC8536836A06FD5C7BB = {isa = PBXBuildFile; fileRef = 51E5757E2D48E638F9A4CB61; };
0D3132A8B412AE9E63024927 = {isa = PBXBuildFile; fileRef = B0230FCCA099E6430411DFC9; };
478699B4EF80A1A1C0D34C10 = {isa = PBXBuildFile; fileRef = 018D0FB9E97B68D2EB3E3F72; };
C510246D7D5E162C9DE63DDE = {isa = PBXBuildFile; fileRef = 19CEF599CB23958AC63D427E; };
CD1CF0C6B4AB9F4C8175FE08 = {isa = PBXBuildFile; fileRef = F221CF21582EE0B8FE774583; };
082D6FF34EFF195C3A3B0CFB = {isa = PBXBuildFile; fileRef = 838E63F5800CA577B92EF6AE; };
D5A4D43A16EA4C71D53E96CD = {isa = PBXBuildFile; fileRef = A02775EA788AD4BF7DD1B1A1; };
8121E10419E2D99645EA254E = {isa = PBXBuildFile; fileRef = D984CE634945077E682B48F3; };
B18C192606DF6079E7B9AEB9 = {isa = PBXBuildFile; fileRef = 8BADEB7BF1A65E83A7A1736D; };
1CBFE444B43C89E749602B7F = {isa = PBXBuildFile; fileRef = 45ADFD8885BE76C7F7D999AC; };
623AFA9E78826CA0136251DF = {isa = PBXBuildFile; fileRef = 59D15F780D468B587F9C7E78; };
8BE2A084394DA3E45DDB5646 = {isa = PBXBuildFile; fileRef = 7936BBAA586387B2FAFB958B; };
EC23F9F2EE10A2DE3CB6D406 = {isa = PBXBuildFile; fileRef = 65BE679590BFE2466E16EA67; };
1C87DA0B69D67481FC6CF4FD = {isa = PBXBuildFile; fileRef = 54363D0B39B88D43447C0123; };
E3FA856CA4DB2009BB0F13E7 = {isa = PBXBuildFile; fileRef = 505852570B48EB3F18076B03; };
@ -389,6 +391,7 @@
600DDC87EB44F5B6EFA1500F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h"; sourceTree = "SOURCE_ROOT"; };
61A517E758E2BF89FF445D7F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryBlock.cpp"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp"; sourceTree = "SOURCE_ROOT"; };
61E56039E1D2929463E58D62 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlyphArrangement.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h"; sourceTree = "SOURCE_ROOT"; };
61F792AFE04C15F413A4F766 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EngineOpl.cpp; path = ../../Source/EngineOpl.cpp; sourceTree = "SOURCE_ROOT"; };
6273BD6D40C9A904273C592F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_utils.mm"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
63B73D99B066179BB9661D4E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChoicePropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
6475DF69D5BDC709E275BF4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WeakReference.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h"; sourceTree = "SOURCE_ROOT"; };
@ -456,6 +459,7 @@
7936BBAA586387B2FAFB958B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginData.cpp; path = ../../Source/PluginData.cpp; sourceTree = "SOURCE_ROOT"; };
7A0FB6545BA2E344A1F45EA5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Decibels.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h"; sourceTree = "SOURCE_ROOT"; };
7A26D67672786E0663369D49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilterAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; };
7A58027CF8C6967B02370E01 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EngineOpl.h; path = ../../Source/EngineOpl.h; sourceTree = "SOURCE_ROOT"; };
7A739B1B4B833A4668904CA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedObject.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h"; sourceTree = "SOURCE_ROOT"; };
7A854175B4E6D35ABB7D4E45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_URL.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_URL.h"; sourceTree = "SOURCE_ROOT"; };
7A905E3EE096DAA1D7BA7ABD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TabbedButtonBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp"; sourceTree = "SOURCE_ROOT"; };
@ -510,6 +514,7 @@
8B87D00DA619D83BA6926E28 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h"; sourceTree = "SOURCE_ROOT"; };
8BADEB7BF1A65E83A7A1736D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginFx.cpp; path = ../../Source/PluginFx.cpp; sourceTree = "SOURCE_ROOT"; };
8BBE375590444CD57A311DD2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Time.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.h"; sourceTree = "SOURCE_ROOT"; };
8BEBEDCAD409EE3A5D383B6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EngineMkI.cpp; path = ../../Source/EngineMkI.cpp; sourceTree = "SOURCE_ROOT"; };
8C4A3CBB322357AF0CA3C2CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileListComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h"; sourceTree = "SOURCE_ROOT"; };
8CA96F07FD8390BD5EEC909B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsDisplayComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h"; sourceTree = "SOURCE_ROOT"; };
8CE45844BA3103D92458CFB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Singleton.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h"; sourceTree = "SOURCE_ROOT"; };
@ -690,6 +695,7 @@
C1CB32E507C8F16FFF6014F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationBase.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h"; sourceTree = "SOURCE_ROOT"; };
C1E13F0AFFDADDB080D11B74 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Drawable.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp"; sourceTree = "SOURCE_ROOT"; };
C1FFEA64DED8E45D6A8F17F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageFileFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
C222D35AC4FC5C2A3BB0F8B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EngineMkI.h; path = ../../Source/EngineMkI.h; sourceTree = "SOURCE_ROOT"; };
C294314DFA3B047D1F745A23 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringRef.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringRef.h"; sourceTree = "SOURCE_ROOT"; };
C29DCEB09280116E3F4E87C3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorListener.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"; sourceTree = "SOURCE_ROOT"; };
C2AA393651CBC37DCD7718BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OperatorEditor.h; path = ../../Source/OperatorEditor.h; sourceTree = "SOURCE_ROOT"; };
@ -883,6 +889,26 @@
F472964B0FFEE5615B72CE3D = {isa = PBXGroup; children = (
0E3FA3D7B11FC7D19CC634BE,
15B75D829C40872D542A38B8, ); name = Resources; sourceTree = "<group>"; };
0652CE27AE4971C99654E3BF = {isa = PBXGroup; children = (
8BADEB7BF1A65E83A7A1736D,
DC75DFCDFCDB425927B11EC0,
C222D35AC4FC5C2A3BB0F8B6,
8BEBEDCAD409EE3A5D383B6D,
61F792AFE04C15F413A4F766,
7A58027CF8C6967B02370E01, ); name = dsp; sourceTree = "<group>"; };
427DD4218ED26D69B0149A90 = {isa = PBXGroup; children = (
018D0FB9E97B68D2EB3E3F72,
BD25F7AC4728A7875B6AE9D5,
19CEF599CB23958AC63D427E,
4B70CBF4DB4E571EDF5D3114,
F221CF21582EE0B8FE774583,
9AAC5E6C1A21F8FE2F66F0E0,
838E63F5800CA577B92EF6AE,
C2AA393651CBC37DCD7718BD,
A02775EA788AD4BF7DD1B1A1,
29D6A187B80D22EB609C256D,
D984CE634945077E682B48F3,
4567FB06348FF519FDC6D698, ); name = ui; sourceTree = "<group>"; };
BDC5059F1563FD8DD69AD324 = {isa = PBXGroup; children = (
3715DFDD7A1B12083F051F5A,
8F395B738E7AB81A0333AF96,
@ -907,6 +933,9 @@
3BE8F91A99E8F48CB9F10C1F,
68D35AFE11BAA35EAE497D47, ); name = msfa; sourceTree = "<group>"; };
29B923E6EB12F97B68585AFC = {isa = PBXGroup; children = (
0652CE27AE4971C99654E3BF,
427DD4218ED26D69B0149A90,
BDC5059F1563FD8DD69AD324,
0BD21CA621B7350EBED18C0A,
45ADFD8885BE76C7F7D999AC,
5C0A1B7E2BF8FCAF5A1E8616,
@ -914,21 +943,6 @@
EA6FC4F1F0D6EAE661569905,
7936BBAA586387B2FAFB958B,
C56E401381FF968837F82364,
BDC5059F1563FD8DD69AD324,
018D0FB9E97B68D2EB3E3F72,
BD25F7AC4728A7875B6AE9D5,
19CEF599CB23958AC63D427E,
4B70CBF4DB4E571EDF5D3114,
F221CF21582EE0B8FE774583,
9AAC5E6C1A21F8FE2F66F0E0,
838E63F5800CA577B92EF6AE,
C2AA393651CBC37DCD7718BD,
A02775EA788AD4BF7DD1B1A1,
29D6A187B80D22EB609C256D,
D984CE634945077E682B48F3,
4567FB06348FF519FDC6D698,
8BADEB7BF1A65E83A7A1736D,
DC75DFCDFCDB425927B11EC0,
65BE679590BFE2466E16EA67,
F258C148A5FB04C70976E92A, ); name = Source; sourceTree = "<group>"; };
C21CEF3B473FDC99270B7623 = {isa = PBXGroup; children = (
@ -1988,9 +2002,15 @@
9D042F9D005532F763A72C26,
E293B9570C97E4BAD129D4A2, ); runOnlyForDeploymentPostprocessing = 0; };
9DB7317ADCFFCEAB747A09AF = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
1CBFE444B43C89E749602B7F,
623AFA9E78826CA0136251DF,
8BE2A084394DA3E45DDB5646,
B18C192606DF6079E7B9AEB9,
697C52FD23363CB2EB9075C6,
4B27ACC5993C8C74FFCDD3BB,
478699B4EF80A1A1C0D34C10,
C510246D7D5E162C9DE63DDE,
CD1CF0C6B4AB9F4C8175FE08,
082D6FF34EFF195C3A3B0CFB,
D5A4D43A16EA4C71D53E96CD,
8121E10419E2D99645EA254E,
3AB728E101D7B85DD39C5CC8,
FAC9C3E771D11FDA4DFAF17E,
47C317B0F77A29ECA0400B2B,
@ -2000,13 +2020,9 @@
434647C21C803FA8A4D44A70,
95105DC8536836A06FD5C7BB,
0D3132A8B412AE9E63024927,
478699B4EF80A1A1C0D34C10,
C510246D7D5E162C9DE63DDE,
CD1CF0C6B4AB9F4C8175FE08,
082D6FF34EFF195C3A3B0CFB,
D5A4D43A16EA4C71D53E96CD,
8121E10419E2D99645EA254E,
B18C192606DF6079E7B9AEB9,
1CBFE444B43C89E749602B7F,
623AFA9E78826CA0136251DF,
8BE2A084394DA3E45DDB5646,
EC23F9F2EE10A2DE3CB6D406,
1C87DA0B69D67481FC6CF4FD,
E3FA856CA4DB2009BB0F13E7,

@ -139,9 +139,15 @@
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\Source\PluginProcessor.cpp"/>
<ClCompile Include="..\..\Source\PluginParam.cpp"/>
<ClCompile Include="..\..\Source\PluginData.cpp"/>
<ClCompile Include="..\..\Source\PluginFx.cpp"/>
<ClCompile Include="..\..\Source\EngineMkI.cpp"/>
<ClCompile Include="..\..\Source\EngineOpl.cpp"/>
<ClCompile Include="..\..\Source\PluginEditor.cpp"/>
<ClCompile Include="..\..\Source\GlobalEditor.cpp"/>
<ClCompile Include="..\..\Source\ParamDialog.cpp"/>
<ClCompile Include="..\..\Source\OperatorEditor.cpp"/>
<ClCompile Include="..\..\Source\DXLookNFeel.cpp"/>
<ClCompile Include="..\..\Source\DXComponents.cpp"/>
<ClCompile Include="..\..\Source\msfa\freqlut.cc"/>
<ClCompile Include="..\..\Source\msfa\lfo.cc"/>
<ClCompile Include="..\..\Source\msfa\dx7note.cc"/>
@ -151,13 +157,9 @@
<ClCompile Include="..\..\Source\msfa\fm_op_kernel.cc"/>
<ClCompile Include="..\..\Source\msfa\pitchenv.cc"/>
<ClCompile Include="..\..\Source\msfa\sin.cc"/>
<ClCompile Include="..\..\Source\PluginEditor.cpp"/>
<ClCompile Include="..\..\Source\GlobalEditor.cpp"/>
<ClCompile Include="..\..\Source\ParamDialog.cpp"/>
<ClCompile Include="..\..\Source\OperatorEditor.cpp"/>
<ClCompile Include="..\..\Source\DXLookNFeel.cpp"/>
<ClCompile Include="..\..\Source\DXComponents.cpp"/>
<ClCompile Include="..\..\Source\PluginFx.cpp"/>
<ClCompile Include="..\..\Source\PluginProcessor.cpp"/>
<ClCompile Include="..\..\Source\PluginParam.cpp"/>
<ClCompile Include="..\..\Source\PluginData.cpp"/>
<ClCompile Include="..\..\Source\SysexComm.cpp"/>
<ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
@ -1137,10 +1139,15 @@
<ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_plugin_client\VST\juce_VST_Wrapper.cpp"/>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\Source\Dexed.h"/>
<ClInclude Include="..\..\Source\PluginProcessor.h"/>
<ClInclude Include="..\..\Source\PluginParam.h"/>
<ClInclude Include="..\..\Source\PluginData.h"/>
<ClInclude Include="..\..\Source\PluginFx.h"/>
<ClInclude Include="..\..\Source\EngineMkI.h"/>
<ClInclude Include="..\..\Source\EngineOpl.h"/>
<ClInclude Include="..\..\Source\PluginEditor.h"/>
<ClInclude Include="..\..\Source\GlobalEditor.h"/>
<ClInclude Include="..\..\Source\ParamDialog.h"/>
<ClInclude Include="..\..\Source\OperatorEditor.h"/>
<ClInclude Include="..\..\Source\DXLookNFeel.h"/>
<ClInclude Include="..\..\Source\DXComponents.h"/>
<ClInclude Include="..\..\Source\msfa\freqlut.h"/>
<ClInclude Include="..\..\Source\msfa\lfo.h"/>
<ClInclude Include="..\..\Source\msfa\aligned_buf.h"/>
@ -1154,13 +1161,10 @@
<ClInclude Include="..\..\Source\msfa\pitchenv.h"/>
<ClInclude Include="..\..\Source\msfa\sin.h"/>
<ClInclude Include="..\..\Source\msfa\synth.h"/>
<ClInclude Include="..\..\Source\PluginEditor.h"/>
<ClInclude Include="..\..\Source\GlobalEditor.h"/>
<ClInclude Include="..\..\Source\ParamDialog.h"/>
<ClInclude Include="..\..\Source\OperatorEditor.h"/>
<ClInclude Include="..\..\Source\DXLookNFeel.h"/>
<ClInclude Include="..\..\Source\DXComponents.h"/>
<ClInclude Include="..\..\Source\PluginFx.h"/>
<ClInclude Include="..\..\Source\Dexed.h"/>
<ClInclude Include="..\..\Source\PluginProcessor.h"/>
<ClInclude Include="..\..\Source\PluginParam.h"/>
<ClInclude Include="..\..\Source\PluginData.h"/>
<ClInclude Include="..\..\Source\SysexComm.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>

@ -11,6 +11,12 @@
<Filter Include="Dexed\Source">
<UniqueIdentifier>{C5AF6998-922C-E781-8C7B-4ACFAA05FAAF}</UniqueIdentifier>
</Filter>
<Filter Include="Dexed\Source\dsp">
<UniqueIdentifier>{EE0092B5-FA3D-099B-26E9-69F3D4015B6B}</UniqueIdentifier>
</Filter>
<Filter Include="Dexed\Source\ui">
<UniqueIdentifier>{E8836FFB-4C51-AB5B-8C6B-4E91BE22AB22}</UniqueIdentifier>
</Filter>
<Filter Include="Dexed\Source\msfa">
<UniqueIdentifier>{9DB0CF5F-F6E7-E40E-5CE4-E122873AC45A}</UniqueIdentifier>
</Filter>
@ -271,14 +277,32 @@
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\Source\PluginProcessor.cpp">
<Filter>Dexed\Source</Filter>
<ClCompile Include="..\..\Source\PluginFx.cpp">
<Filter>Dexed\Source\dsp</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\PluginParam.cpp">
<Filter>Dexed\Source</Filter>
<ClCompile Include="..\..\Source\EngineMkI.cpp">
<Filter>Dexed\Source\dsp</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\PluginData.cpp">
<Filter>Dexed\Source</Filter>
<ClCompile Include="..\..\Source\EngineOpl.cpp">
<Filter>Dexed\Source\dsp</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\PluginEditor.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\GlobalEditor.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\ParamDialog.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\OperatorEditor.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\DXLookNFeel.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\DXComponents.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\msfa\freqlut.cc">
<Filter>Dexed\Source\msfa</Filter>
@ -307,25 +331,13 @@
<ClCompile Include="..\..\Source\msfa\sin.cc">
<Filter>Dexed\Source\msfa</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\PluginEditor.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\GlobalEditor.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\ParamDialog.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\OperatorEditor.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\DXLookNFeel.cpp">
<ClCompile Include="..\..\Source\PluginProcessor.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\DXComponents.cpp">
<ClCompile Include="..\..\Source\PluginParam.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\PluginFx.cpp">
<ClCompile Include="..\..\Source\PluginData.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\SysexComm.cpp">
@ -1419,17 +1431,32 @@
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\Source\Dexed.h">
<Filter>Dexed\Source</Filter>
<ClInclude Include="..\..\Source\PluginFx.h">
<Filter>Dexed\Source\dsp</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\PluginProcessor.h">
<Filter>Dexed\Source</Filter>
<ClInclude Include="..\..\Source\EngineMkI.h">
<Filter>Dexed\Source\dsp</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\PluginParam.h">
<Filter>Dexed\Source</Filter>
<ClInclude Include="..\..\Source\EngineOpl.h">
<Filter>Dexed\Source\dsp</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\PluginData.h">
<Filter>Dexed\Source</Filter>
<ClInclude Include="..\..\Source\PluginEditor.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\GlobalEditor.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\ParamDialog.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\OperatorEditor.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\DXLookNFeel.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\DXComponents.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\msfa\freqlut.h">
<Filter>Dexed\Source\msfa</Filter>
@ -1470,25 +1497,16 @@
<ClInclude Include="..\..\Source\msfa\synth.h">
<Filter>Dexed\Source\msfa</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\PluginEditor.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\GlobalEditor.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\ParamDialog.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\OperatorEditor.h">
<ClInclude Include="..\..\Source\Dexed.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\DXLookNFeel.h">
<ClInclude Include="..\..\Source\PluginProcessor.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\DXComponents.h">
<ClInclude Include="..\..\Source\PluginParam.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\PluginFx.h">
<ClInclude Include="..\..\Source\PluginData.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\SysexComm.h">

@ -138,9 +138,15 @@
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\Source\PluginProcessor.cpp"/>
<ClCompile Include="..\..\Source\PluginParam.cpp"/>
<ClCompile Include="..\..\Source\PluginData.cpp"/>
<ClCompile Include="..\..\Source\PluginFx.cpp"/>
<ClCompile Include="..\..\Source\EngineMkI.cpp"/>
<ClCompile Include="..\..\Source\EngineOpl.cpp"/>
<ClCompile Include="..\..\Source\PluginEditor.cpp"/>
<ClCompile Include="..\..\Source\GlobalEditor.cpp"/>
<ClCompile Include="..\..\Source\ParamDialog.cpp"/>
<ClCompile Include="..\..\Source\OperatorEditor.cpp"/>
<ClCompile Include="..\..\Source\DXLookNFeel.cpp"/>
<ClCompile Include="..\..\Source\DXComponents.cpp"/>
<ClCompile Include="..\..\Source\msfa\freqlut.cc"/>
<ClCompile Include="..\..\Source\msfa\lfo.cc"/>
<ClCompile Include="..\..\Source\msfa\dx7note.cc"/>
@ -150,13 +156,9 @@
<ClCompile Include="..\..\Source\msfa\fm_op_kernel.cc"/>
<ClCompile Include="..\..\Source\msfa\pitchenv.cc"/>
<ClCompile Include="..\..\Source\msfa\sin.cc"/>
<ClCompile Include="..\..\Source\PluginEditor.cpp"/>
<ClCompile Include="..\..\Source\GlobalEditor.cpp"/>
<ClCompile Include="..\..\Source\ParamDialog.cpp"/>
<ClCompile Include="..\..\Source\OperatorEditor.cpp"/>
<ClCompile Include="..\..\Source\DXLookNFeel.cpp"/>
<ClCompile Include="..\..\Source\DXComponents.cpp"/>
<ClCompile Include="..\..\Source\PluginFx.cpp"/>
<ClCompile Include="..\..\Source\PluginProcessor.cpp"/>
<ClCompile Include="..\..\Source\PluginParam.cpp"/>
<ClCompile Include="..\..\Source\PluginData.cpp"/>
<ClCompile Include="..\..\Source\SysexComm.cpp"/>
<ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
@ -1136,10 +1138,15 @@
<ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_plugin_client\VST\juce_VST_Wrapper.cpp"/>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\Source\Dexed.h"/>
<ClInclude Include="..\..\Source\PluginProcessor.h"/>
<ClInclude Include="..\..\Source\PluginParam.h"/>
<ClInclude Include="..\..\Source\PluginData.h"/>
<ClInclude Include="..\..\Source\PluginFx.h"/>
<ClInclude Include="..\..\Source\EngineMkI.h"/>
<ClInclude Include="..\..\Source\EngineOpl.h"/>
<ClInclude Include="..\..\Source\PluginEditor.h"/>
<ClInclude Include="..\..\Source\GlobalEditor.h"/>
<ClInclude Include="..\..\Source\ParamDialog.h"/>
<ClInclude Include="..\..\Source\OperatorEditor.h"/>
<ClInclude Include="..\..\Source\DXLookNFeel.h"/>
<ClInclude Include="..\..\Source\DXComponents.h"/>
<ClInclude Include="..\..\Source\msfa\freqlut.h"/>
<ClInclude Include="..\..\Source\msfa\lfo.h"/>
<ClInclude Include="..\..\Source\msfa\aligned_buf.h"/>
@ -1153,13 +1160,10 @@
<ClInclude Include="..\..\Source\msfa\pitchenv.h"/>
<ClInclude Include="..\..\Source\msfa\sin.h"/>
<ClInclude Include="..\..\Source\msfa\synth.h"/>
<ClInclude Include="..\..\Source\PluginEditor.h"/>
<ClInclude Include="..\..\Source\GlobalEditor.h"/>
<ClInclude Include="..\..\Source\ParamDialog.h"/>
<ClInclude Include="..\..\Source\OperatorEditor.h"/>
<ClInclude Include="..\..\Source\DXLookNFeel.h"/>
<ClInclude Include="..\..\Source\DXComponents.h"/>
<ClInclude Include="..\..\Source\PluginFx.h"/>
<ClInclude Include="..\..\Source\Dexed.h"/>
<ClInclude Include="..\..\Source\PluginProcessor.h"/>
<ClInclude Include="..\..\Source\PluginParam.h"/>
<ClInclude Include="..\..\Source\PluginData.h"/>
<ClInclude Include="..\..\Source\SysexComm.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>

@ -11,6 +11,12 @@
<Filter Include="Dexed\Source">
<UniqueIdentifier>{C5AF6998-922C-E781-8C7B-4ACFAA05FAAF}</UniqueIdentifier>
</Filter>
<Filter Include="Dexed\Source\dsp">
<UniqueIdentifier>{EE0092B5-FA3D-099B-26E9-69F3D4015B6B}</UniqueIdentifier>
</Filter>
<Filter Include="Dexed\Source\ui">
<UniqueIdentifier>{E8836FFB-4C51-AB5B-8C6B-4E91BE22AB22}</UniqueIdentifier>
</Filter>
<Filter Include="Dexed\Source\msfa">
<UniqueIdentifier>{9DB0CF5F-F6E7-E40E-5CE4-E122873AC45A}</UniqueIdentifier>
</Filter>
@ -271,14 +277,32 @@
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\Source\PluginProcessor.cpp">
<Filter>Dexed\Source</Filter>
<ClCompile Include="..\..\Source\PluginFx.cpp">
<Filter>Dexed\Source\dsp</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\PluginParam.cpp">
<Filter>Dexed\Source</Filter>
<ClCompile Include="..\..\Source\EngineMkI.cpp">
<Filter>Dexed\Source\dsp</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\PluginData.cpp">
<Filter>Dexed\Source</Filter>
<ClCompile Include="..\..\Source\EngineOpl.cpp">
<Filter>Dexed\Source\dsp</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\PluginEditor.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\GlobalEditor.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\ParamDialog.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\OperatorEditor.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\DXLookNFeel.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\DXComponents.cpp">
<Filter>Dexed\Source\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\msfa\freqlut.cc">
<Filter>Dexed\Source\msfa</Filter>
@ -307,25 +331,13 @@
<ClCompile Include="..\..\Source\msfa\sin.cc">
<Filter>Dexed\Source\msfa</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\PluginEditor.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\GlobalEditor.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\ParamDialog.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\OperatorEditor.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\DXLookNFeel.cpp">
<ClCompile Include="..\..\Source\PluginProcessor.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\DXComponents.cpp">
<ClCompile Include="..\..\Source\PluginParam.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\PluginFx.cpp">
<ClCompile Include="..\..\Source\PluginData.cpp">
<Filter>Dexed\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\SysexComm.cpp">
@ -1419,17 +1431,32 @@
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\Source\Dexed.h">
<Filter>Dexed\Source</Filter>
<ClInclude Include="..\..\Source\PluginFx.h">
<Filter>Dexed\Source\dsp</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\PluginProcessor.h">
<Filter>Dexed\Source</Filter>
<ClInclude Include="..\..\Source\EngineMkI.h">
<Filter>Dexed\Source\dsp</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\PluginParam.h">
<Filter>Dexed\Source</Filter>
<ClInclude Include="..\..\Source\EngineOpl.h">
<Filter>Dexed\Source\dsp</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\PluginData.h">
<Filter>Dexed\Source</Filter>
<ClInclude Include="..\..\Source\PluginEditor.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\GlobalEditor.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\ParamDialog.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\OperatorEditor.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\DXLookNFeel.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\DXComponents.h">
<Filter>Dexed\Source\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\msfa\freqlut.h">
<Filter>Dexed\Source\msfa</Filter>
@ -1470,25 +1497,16 @@
<ClInclude Include="..\..\Source\msfa\synth.h">
<Filter>Dexed\Source\msfa</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\PluginEditor.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\GlobalEditor.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\ParamDialog.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\OperatorEditor.h">
<ClInclude Include="..\..\Source\Dexed.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\DXLookNFeel.h">
<ClInclude Include="..\..\Source\PluginProcessor.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\DXComponents.h">
<ClInclude Include="..\..\Source\PluginParam.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\PluginFx.h">
<ClInclude Include="..\..\Source\PluginData.h">
<Filter>Dexed\Source</Filter>
</ClInclude>
<ClInclude Include="..\..\Source\SysexComm.h">

@ -16,15 +16,33 @@
<FILE id="gfRTZ1" name="builtin_pgm.zip" compile="0" resource="1" file="Resources/builtin_pgm.zip"/>
</GROUP>
<GROUP id="{EA38D88A-6B79-E394-8B57-FA22D50C4D86}" name="Source">
<FILE id="pBbZ9Y" name="Dexed.h" compile="0" resource="0" file="Source/Dexed.h"/>
<FILE id="Yp2cX4" name="PluginProcessor.cpp" compile="1" resource="0"
file="Source/PluginProcessor.cpp"/>
<FILE id="ob0Eek" name="PluginProcessor.h" compile="0" resource="0"
file="Source/PluginProcessor.h"/>
<FILE id="ZRipB1" name="PluginParam.cpp" compile="1" resource="0" file="Source/PluginParam.cpp"/>
<FILE id="uqNUvy" name="PluginParam.h" compile="0" resource="0" file="Source/PluginParam.h"/>
<FILE id="AvgZG4" name="PluginData.cpp" compile="1" resource="0" file="Source/PluginData.cpp"/>
<FILE id="M4UYNO" name="PluginData.h" compile="0" resource="0" file="Source/PluginData.h"/>
<GROUP id="{1B64F271-8E56-F19A-FF63-094159E5EF7B}" name="dsp">
<FILE id="bvvgdq" name="PluginFx.cpp" compile="1" resource="0" file="Source/PluginFx.cpp"/>
<FILE id="E4gace" name="PluginFx.h" compile="0" resource="0" file="Source/PluginFx.h"/>
<FILE id="Fyf1ag" name="EngineMkI.h" compile="0" resource="0" file="Source/EngineMkI.h"/>
<FILE id="gZfpcq" name="EngineMkI.cpp" compile="1" resource="0" file="Source/EngineMkI.cpp"/>
<FILE id="gY0vZ2" name="EngineOpl.cpp" compile="1" resource="0" file="Source/EngineOpl.cpp"/>
<FILE id="TF7JMc" name="EngineOpl.h" compile="0" resource="0" file="Source/EngineOpl.h"/>
</GROUP>
<GROUP id="{998D2187-B355-9C12-0FB2-2D048B83342D}" name="ui">
<FILE id="Ec211k" name="PluginEditor.cpp" compile="1" resource="0"
file="Source/PluginEditor.cpp"/>
<FILE id="lZFsG0" name="PluginEditor.h" compile="0" resource="0" file="Source/PluginEditor.h"/>
<FILE id="thAIGQ" name="GlobalEditor.cpp" compile="1" resource="0"
file="Source/GlobalEditor.cpp"/>
<FILE id="CxMFcr" name="GlobalEditor.h" compile="0" resource="0" file="Source/GlobalEditor.h"/>
<FILE id="eZN5P2" name="ParamDialog.cpp" compile="1" resource="0" file="Source/ParamDialog.cpp"/>
<FILE id="fijjBN" name="ParamDialog.h" compile="0" resource="0" file="Source/ParamDialog.h"/>
<FILE id="oUObPG" name="OperatorEditor.cpp" compile="1" resource="0"
file="Source/OperatorEditor.cpp"/>
<FILE id="ChJDca" name="OperatorEditor.h" compile="0" resource="0"
file="Source/OperatorEditor.h"/>
<FILE id="TgCdkS" name="DXLookNFeel.cpp" compile="1" resource="0" file="Source/DXLookNFeel.cpp"/>
<FILE id="V4bLcd" name="DXLookNFeel.h" compile="0" resource="0" file="Source/DXLookNFeel.h"/>
<FILE id="yOSLIH" name="DXComponents.cpp" compile="1" resource="0"
file="Source/DXComponents.cpp"/>
<FILE id="x2E8Zg" name="DXComponents.h" compile="0" resource="0" file="Source/DXComponents.h"/>
</GROUP>
<GROUP id="{CEBA9AF6-1C73-85F6-A187-56A246098441}" name="msfa">
<FILE id="wvG22S" name="freqlut.cc" compile="1" resource="0" file="Source/msfa/freqlut.cc"/>
<FILE id="dulZMd" name="freqlut.h" compile="0" resource="0" file="Source/msfa/freqlut.h"/>
@ -49,25 +67,15 @@
<FILE id="TGO2sW" name="sin.h" compile="0" resource="0" file="Source/msfa/sin.h"/>
<FILE id="SqG02X" name="synth.h" compile="0" resource="0" file="Source/msfa/synth.h"/>
</GROUP>
<FILE id="Ec211k" name="PluginEditor.cpp" compile="1" resource="0"
file="Source/PluginEditor.cpp"/>
<FILE id="lZFsG0" name="PluginEditor.h" compile="0" resource="0" file="Source/PluginEditor.h"/>
<FILE id="thAIGQ" name="GlobalEditor.cpp" compile="1" resource="0"
file="Source/GlobalEditor.cpp"/>
<FILE id="CxMFcr" name="GlobalEditor.h" compile="0" resource="0" file="Source/GlobalEditor.h"/>
<FILE id="eZN5P2" name="ParamDialog.cpp" compile="1" resource="0" file="Source/ParamDialog.cpp"/>
<FILE id="fijjBN" name="ParamDialog.h" compile="0" resource="0" file="Source/ParamDialog.h"/>
<FILE id="oUObPG" name="OperatorEditor.cpp" compile="1" resource="0"
file="Source/OperatorEditor.cpp"/>
<FILE id="ChJDca" name="OperatorEditor.h" compile="0" resource="0"
file="Source/OperatorEditor.h"/>
<FILE id="TgCdkS" name="DXLookNFeel.cpp" compile="1" resource="0" file="Source/DXLookNFeel.cpp"/>
<FILE id="V4bLcd" name="DXLookNFeel.h" compile="0" resource="0" file="Source/DXLookNFeel.h"/>
<FILE id="yOSLIH" name="DXComponents.cpp" compile="1" resource="0"
file="Source/DXComponents.cpp"/>
<FILE id="x2E8Zg" name="DXComponents.h" compile="0" resource="0" file="Source/DXComponents.h"/>
<FILE id="bvvgdq" name="PluginFx.cpp" compile="1" resource="0" file="Source/PluginFx.cpp"/>
<FILE id="E4gace" name="PluginFx.h" compile="0" resource="0" file="Source/PluginFx.h"/>
<FILE id="pBbZ9Y" name="Dexed.h" compile="0" resource="0" file="Source/Dexed.h"/>
<FILE id="Yp2cX4" name="PluginProcessor.cpp" compile="1" resource="0"
file="Source/PluginProcessor.cpp"/>
<FILE id="ob0Eek" name="PluginProcessor.h" compile="0" resource="0"
file="Source/PluginProcessor.h"/>
<FILE id="ZRipB1" name="PluginParam.cpp" compile="1" resource="0" file="Source/PluginParam.cpp"/>
<FILE id="uqNUvy" name="PluginParam.h" compile="0" resource="0" file="Source/PluginParam.h"/>
<FILE id="AvgZG4" name="PluginData.cpp" compile="1" resource="0" file="Source/PluginData.cpp"/>
<FILE id="M4UYNO" name="PluginData.h" compile="0" resource="0" file="Source/PluginData.h"/>
<FILE id="KLqlYP" name="SysexComm.cpp" compile="1" resource="0" file="Source/SysexComm.cpp"/>
<FILE id="DWALdR" name="SysexComm.h" compile="0" resource="0" file="Source/SysexComm.h"/>
</GROUP>

@ -35,10 +35,12 @@ Changelog
---------
#### Version 0.7.0 (current sprint)
* Preliminary Algo 4 & 6 feedback support
* DX Engine 'Dirty DX' emulation
* DX Engine LFO amplitude
* DX Engine 'Dirty DX' emulation, including based on OPL chips
* DX Engine LFO amplitude. This still needs some tunings
* Fixed stucked notes when programs where changed
* Added the 'INIT' button to re-initialize a program
* Fixed engine envelop wrong timing if it was not 44100Khz
* Filter only .syx files when using the Dexed_cart.zip file
#### Version 0.6.1
* Mouse over + LFO type fix + pitch eg values

@ -0,0 +1,287 @@
/*
==============================================================================
EngineMkI.cpp
Created: 25 Aug 2014 12:08:00am
Author: Pascal Gauthier
==============================================================================
*/
#include "EngineMkI.h"
#include <math.h>
#include <cstdlib>
#include "sin.h"
void EngineMkI::compute(int32_t *output, FmOpParams *params, int algorithm,
int32_t *fb_buf, int feedback_shift, const Controllers *controllers) {
const int kLevelThresh = 1120;
const FmAlgorithm alg = algorithms[algorithm];
bool has_contents[3] = { true, false, false };
for (int op = 0; op < 6; op++) {
int flags = alg.ops[op];
bool add = (flags & OUT_BUS_ADD) != 0;
FmOpParams &param = params[op];
int inbus = (flags >> 4) & 3;
int outbus = flags & 3;
int32_t *outptr = (outbus == 0) ? output : buf_[outbus - 1].get();
int32_t gain1 = param.gain[0];
int32_t gain2 = param.gain[1];
/*
if (gain1 >= kLevelThresh || gain2 >= kLevelThresh) {
if (!has_contents[outbus]) {
add = false;
}
if (inbus == 0 || !has_contents[inbus]) {
// PG: this is my 'dirty' implementation of FB for 2 and 3 operators...
// still needs some tuning...
if ((flags & 0xc0) == 0xc0 && feedback_shift < 16) {
switch ( algorithm ) {
// two operator feedback, process exception for ALGO 6
case 5 :
FmOpKernel::compute_fb2(outptr, params, fb_buf, feedback_shift);
param.phase += param.freq << LG_N;
params[1].phase += param.freq + params[1].freq << LG_N; // yuk, hack, we already processed op-5
op++; // ignore next operator;
break;
// three operator feedback, process exception for ALGO 4
case 3 :
FmOpKernel::compute_fb3(outptr, params, fb_buf, feedback_shift);
param.phase += param.freq << LG_N;
params[1].phase += param.freq + params[1].freq << LG_N; // hack, we already processed op-5 - op-4
params[2].phase += param.freq + params[1].freq + params[2].freq << LG_N; // yuk yuk
op += 2; // ignore the 2 other operators
break;
default:
// one operator feedback, normal proces
//cout << "\t" << op << " fb " << inbus << outbus << add << endl;
FmOpKernel::compute_fb(outptr, param.phase, param.freq,gain1, gain2, fb_buf, feedback_shift, add);
param.phase += param.freq << LG_N;
break;
}
has_contents[outbus] = true;
continue;
} else {
// cout << op << " pure " << inbus << outbus << add << endl;
FmOpKernel::compute_pure(outptr, param.phase, param.freq, gain1, gain2, add);
}
} else {
// cout << op << " normal " << inbus << outbus << " " << param.freq << add << endl;
FmOpKernel::compute(outptr, buf_[inbus - 1].get(),
param.phase, param.freq, gain1, gain2, add);
}
has_contents[outbus] = true;
} else if (!add) {
has_contents[outbus] = false;
}*/
param.phase += param.freq << LG_N;
}
}
/*
void FmOpKernel::compute(int32_t *output, const int32_t *input,
int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2, bool add, const Controllers *controllers) {
int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N;
int32_t gain = gain1;
int32_t phase = phase0;
if (hasNeon()) {
#ifdef HAVE_NEON
neon_fm_kernel(input, add ? output : zeros, output, N,
phase0, freq, gain, dgain);
#endif
} else {
if (add) {
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t y = Sin::lookup(phase + input[i]);
y &= controllers->sinBitFilter;
int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24;
output[i] += y1;
phase += freq;
}
} else {
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t y = Sin::lookup(phase + input[i]);
y &= controllers->sinBitFilter;
int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24;
output[i] = y1;
phase += freq;
}
}
}
}
void FmOpKernel::compute_pure(int32_t *output, int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2, bool add, const Controllers *controllers) {
int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N;
int32_t gain = gain1;
int32_t phase = phase0;
if (hasNeon()) {
#ifdef HAVE_NEON
neon_fm_kernel(zeros, add ? output : zeros, output, N,
phase0, freq, gain, dgain);
#endif
} else {
if (add) {
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t y = Sin::lookup(phase);
y &= controllers->sinBitFilter;
int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24;
output[i] += y1;
phase += freq;
}
} else {
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t y = Sin::lookup(phase);
y &= controllers->sinBitFilter;
int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24;
output[i] = y1;
phase += freq;
}
}
}
}
#define noDOUBLE_ACCURACY
#define HIGH_ACCURACY
void FmOpKernel::compute_fb(int32_t *output, int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2,
int32_t *fb_buf, int fb_shift, bool add, const Controllers *controllers) {
int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N;
int32_t gain = gain1;
int32_t phase = phase0;
int32_t y0 = fb_buf[0];
int32_t y = fb_buf[1];
if (add) {
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase + scaled_fb);
y &= controllers->sinBitFilter;
y = ((int64_t)y * (int64_t)gain) >> 24;
output[i] += y;
phase += freq;
}
} else {
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase + scaled_fb);
y &= controllers->sinBitFilter;
y = ((int64_t)y * (int64_t)gain) >> 24;
output[i] = y;
phase += freq;
}
}
fb_buf[0] = y0;
fb_buf[1] = y;
}
// exclusively used for ALGO 6 with feedback
void FmOpKernel::compute_fb2(int32_t *output, FmOpParams *parms, int32_t *fb_buf, int fb_shift, const Controllers *cont) {
int32_t dgain[2];
int32_t gain[2];
int32_t phase[2];
int32_t y0 = fb_buf[0];
int32_t y = fb_buf[1];
phase[0] = parms[0].phase;
phase[1] = parms[1].phase;
dgain[0] = (parms[0].gain[1] - parms[0].gain[0] + (N >> 1)) >> LG_N;
dgain[1] = (parms[1].gain[1] - parms[1].gain[0] + (N >> 1)) >> LG_N;
gain[0] = parms[0].gain[0];
gain[1] = parms[1].gain[1];
for (int i = 0; i < N; i++) {
// op 0
gain[0] += dgain[0];
int32_t scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase[0] + scaled_fb);
y = ((int64_t)y * (int64_t)gain) >> 24;
phase[0] += parms[0].freq;
// op 1
gain[1] += dgain[1];
scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase[1] + scaled_fb + y);
y = ((int64_t)y * (int64_t)gain) >> 24;
output[i] = y;
phase[1] += parms[1].freq;
}
fb_buf[0] = y0;
fb_buf[1] = y;
}
// exclusively used for ALGO 4 with feedback
void FmOpKernel::compute_fb3(int32_t *output, FmOpParams *parms, int32_t *fb_buf, int fb_shift, const Controllers *conts) {
int32_t dgain[3];
int32_t gain[3];
int32_t phase[3];
int32_t y0 = fb_buf[0];
int32_t y = fb_buf[1];
phase[0] = parms[0].phase;
phase[1] = parms[1].phase;
phase[2] = parms[2].phase;
dgain[0] = (parms[0].gain[1] - parms[0].gain[0] + (N >> 1)) >> LG_N;
dgain[1] = (parms[1].gain[1] - parms[1].gain[0] + (N >> 1)) >> LG_N;
dgain[2] = (parms[2].gain[1] - parms[2].gain[0] + (N >> 1)) >> LG_N;
gain[0] = parms[0].gain[0];
gain[1] = parms[1].gain[0];
gain[2] = parms[2].gain[0];
for (int i = 0; i < N; i++) {
// op 0
gain[0] += dgain[0];
int32_t scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase[0] + scaled_fb);
y = ((int64_t)y * (int64_t)gain) >> 24;
phase[0] += parms[0].freq;
// op 1
gain[1] += dgain[1];
scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase[1] + scaled_fb + y);
y = ((int64_t)y * (int64_t)gain) >> 24;
phase[1] += parms[1].freq;
// op 2
gain[2] += dgain[2];
scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase[2] + scaled_fb + y);
y = ((int64_t)y * (int64_t)gain) >> 24;
output[i] = y;
phase[2] += parms[2].freq;
}
fb_buf[0] = y0;
fb_buf[1] = y;
}
*/

@ -0,0 +1,32 @@
/*
==============================================================================
EngineMkI.h
Created: 25 Aug 2014 12:08:00am
Author: Pascal Gauthier
==============================================================================
*/
#ifndef ENGINEMKI_H_INCLUDED
#define ENGINEMKI_H_INCLUDED
#include "synth.h"
#include "aligned_buf.h"
#include "fm_op_kernel.h"
#include "controllers.h"
#include "fm_core.h"
class EngineMkI : public FmCore {
public:
virtual void compute(int32_t *output, FmOpParams *params, int algorithm,
int32_t *fb_buf, int feedback_shift, const Controllers *controllers);
static void compute_fb2(int32_t *output, FmOpParams *params, int32_t *fb_buf, int fb_shift);
static void compute_fb3(int32_t *output, FmOpParams *params, int32_t *fb_buf, int fb_shift);
};
#endif // ENGINEMKI_H_INCLUDED

@ -0,0 +1,209 @@
/*
* Copyright (C) 2014 Pascal Gauthier
* Copyright (C) 2012 Steffen Ohrendorf <steffen.ohrendorf@gmx.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Original Java Code: Copyright (C) 2008 Robson Cozendey <robson@cozendey.com>
*
* Some code based on forum posts in: http://forums.submarine.org.uk/phpBB/viewforum.php?f=9,
* Copyright (C) 2010-2013 by carbon14 and opl3
*/
#include "PluginProcessor.h"
const int32_t __attribute__ ((aligned(16))) zeros[N] = {0};
uint16_t SignBit = 0x8000;
uint16_t sinLogTable[256] = {
2137, 1731, 1543, 1419, 1326, 1252, 1190, 1137, 1091, 1050, 1013, 979, 949, 920, 894, 869,
846, 825, 804, 785, 767, 749, 732, 717, 701, 687, 672, 659, 646, 633, 621, 609,
598, 587, 576, 566, 556, 546, 536, 527, 518, 509, 501, 492, 484, 476, 468, 461,
453, 446, 439, 432, 425, 418, 411, 405, 399, 392, 386, 380, 375, 369, 363, 358,
352, 347, 341, 336, 331, 326, 321, 316, 311, 307, 302, 297, 293, 289, 284, 280,
276, 271, 267, 263, 259, 255, 251, 248, 244, 240, 236, 233, 229, 226, 222, 219,
215, 212, 209, 205, 202, 199, 196, 193, 190, 187, 184, 181, 178, 175, 172, 169,
167, 164, 161, 159, 156, 153, 151, 148, 146, 143, 141, 138, 136, 134, 131, 129,
127, 125, 122, 120, 118, 116, 114, 112, 110, 108, 106, 104, 102, 100, 98, 96,
94, 92, 91, 89, 87, 85, 83, 82, 80, 78, 77, 75, 74, 72, 70, 69,
67, 66, 64, 63, 62, 60, 59, 57, 56, 55, 53, 52, 51, 49, 48, 47,
46, 45, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30,
29, 28, 27, 26, 25, 24, 23, 23, 22, 21, 20, 20, 19, 18, 17, 17,
16, 15, 15, 14, 13, 13, 12, 12, 11, 10, 10, 9, 9, 8, 8, 7,
7, 7, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2,
2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0
};
uint16_t sinExpTable[256] = {
0, 3, 6, 8, 11, 14, 17, 20, 22, 25, 28, 31, 34, 37, 40, 42,
45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90,
93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 123, 126, 130, 133, 136, 139,
142, 145, 148, 152, 155, 158, 161, 164, 168, 171, 174, 177, 181, 184, 187, 190,
194, 197, 200, 204, 207, 210, 214, 217, 220, 224, 227, 231, 234, 237, 241, 244,
248, 251, 255, 258, 262, 265, 268, 272, 276, 279, 283, 286, 290, 293, 297, 300,
304, 308, 311, 315, 318, 322, 326, 329, 333, 337, 340, 344, 348, 352, 355, 359,
363, 367, 370, 374, 378, 382, 385, 389, 393, 397, 401, 405, 409, 412, 416, 420,
424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484,
488, 492, 496, 501, 505, 509, 513, 517, 521, 526, 530, 534, 538, 542, 547, 551,
555, 560, 564, 568, 572, 577, 581, 585, 590, 594, 599, 603, 607, 612, 616, 621,
625, 630, 634, 639, 643, 648, 652, 657, 661, 666, 670, 675, 680, 684, 689, 693,
698, 703, 708, 712, 717, 722, 726, 731, 736, 741, 745, 750, 755, 760, 765, 770,
774, 779, 784, 789, 794, 799, 804, 809, 814, 819, 824, 829, 834, 839, 844, 849,
854, 859, 864, 869, 874, 880, 885, 890, 895, 900, 906, 911, 916, 921, 927, 932,
937, 942, 948, 953, 959, 964, 969, 975, 980, 986, 991, 996, 1002, 1007, 1013, 1018
};
inline uint16_t sinLog( uint16_t phi ) {
const uint8_t index = (phi & 0xff);
switch( ( phi & 0x0300 ) ) {
case 0x0000:
// rising quarter wave Shape A
return sinLogTable[index];
case 0x0100:
// falling quarter wave Shape B
return sinLogTable[index ^ 0xFF];
case 0x0200:
// rising quarter wave -ve Shape C
return sinLogTable[index] | SignBit;
case 0x0300:
// falling quarter wave -ve Shape D
return sinLogTable[index ^ 0xFF] | SignBit;
}
return 0;
}
// 16 env units are ~3dB and halve the output
/**
* @brief OPL Sine Wave calculation
* @param[in] phase Wave phase (0..1023)
* @param[in] env Envelope value (0..511)
* @warning @a env will not be checked for correct values.
*/
inline int16_t oplSin( uint16_t phase, uint16_t env ) {
uint16_t expVal = sinLog(phase) + (env << 3);
const bool isSigned = expVal & SignBit;
expVal &= ~SignBit;
// expVal: 0..2137+511*8 = 0..6225
// result: 0..1018+1024
uint32_t result = 0x0400 + sinExpTable[( expVal & 0xff ) ^ 0xFF];
result <<= 1;
result >>= ( expVal >> 8 ); // exp
if( isSigned ) {
// -1 for one's complement
return -result - 1;
} else {
return result;
}
}
void EngineOpl::computeOpl(int32_t *output, const int32_t *input, int32_t phase0, int32_t freq, int32_t gain1, int32_t gain2, bool add) {
int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N;
int32_t gain = gain1;
int32_t phase = phase0;
const int32_t *adder = add ? output : zeros;
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t y = oplSin( (phase+input[i]) >> 14, gain1);
output[i] = (y << 15) + adder[i];
phase += freq;
}
}
void EngineOpl::computeOpl_pure(int32_t *output, int32_t phase0, int32_t freq, int32_t gain1, int32_t gain2, bool add) {
int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N;
int32_t gain = gain1;
int32_t phase = phase0;
const int32_t *adder = add ? output : zeros;
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t y = oplSin( phase >> 14, gain1);
output[i] = (y << 15) + adder[i];
phase += freq;
}
}
void EngineOpl::computeOpl_fb(int32_t *output, int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2,
int32_t *fb_buf, int fb_shift, bool add) {
int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N;
int32_t gain = gain1;
int32_t phase = phase0;
const int32_t *adder = add ? output : zeros;
int32_t y0 = fb_buf[0];
int32_t y = fb_buf[1];
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
int32_t y = oplSin( (phase+scaled_fb) >> 14, gain1);
output[i] = (y << 15) + adder[i];
phase += freq;
}
fb_buf[0] = y0;
fb_buf[1] = y;
}
void EngineOpl::compute(int32_t *output, FmOpParams *params, int algorithm,
int32_t *fb_buf, int feedback_shift, const Controllers *controllers) {
const int kLevelThresh = 505; // really ????
const FmAlgorithm alg = algorithms[algorithm];
bool has_contents[3] = { true, false, false };
for (int op = 0; op < 6; op++) {
int flags = alg.ops[op];
bool add = (flags & OUT_BUS_ADD) != 0;
FmOpParams &param = params[op];
int inbus = (flags >> 4) & 3;
int outbus = flags & 3;
int32_t *outptr = (outbus == 0) ? output : buf_[outbus - 1].get();
int32_t gain1 = 512-(param.level[0] >> 19);
int32_t gain2 = 512-(param.level[1] >> 19);
if (gain1 <= kLevelThresh || gain2 <= kLevelThresh) {
if (!has_contents[outbus]) {
add = false;
}
if (inbus == 0 || !has_contents[inbus]) {
// todo: more than one op in a feedback loop
if ((flags & 0xc0) == 0xc0 && feedback_shift < 16) {
// cout << op << " fb " << inbus << outbus << add << endl;
computeOpl_fb(outptr, param.phase, param.freq,
gain1, gain2,
fb_buf, feedback_shift, add);
} else {
// cout << op << " pure " << inbus << outbus << add << endl;
computeOpl_pure(outptr, param.phase, param.freq,
gain1, gain2, add);
}
} else {
// cout << op << " normal " << inbus << outbus << " " << param.freq << add << endl;
computeOpl(outptr, buf_[inbus - 1].get(),
param.phase, param.freq, gain1, gain2, add);
}
has_contents[outbus] = true;
} else if (!add) {
has_contents[outbus] = false;
}
param.phase += param.freq << LG_N;
}
}

@ -0,0 +1,34 @@
/*
==============================================================================
ExtraKernels.h
Created: 20 Aug 2014 8:21:43pm
Author: Pascal Gauthier
==============================================================================
*/
#ifndef EXTRAKERNELS_H_INCLUDED
#define EXTRAKERNELS_H_INCLUDED
#include "synth.h"
#include "aligned_buf.h"
#include "fm_op_kernel.h"
#include "controllers.h"
#include "fm_core.h"
class EngineOpl : public FmCore {
public:
virtual void compute(int32_t *output, FmOpParams *params, int algorithm,
int32_t *fb_buf, int feedback_shift, const Controllers *controllers);
void computeOpl(int32_t *output, const int32_t *input, int32_t phase0, int32_t freq, int32_t gain1, int32_t gain2, bool add);
void computeOpl_pure(int32_t *output, int32_t phase0, int32_t freq, int32_t gain1, int32_t gain2, bool add);
void computeOpl_fb(int32_t *output, int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2,
int32_t *fb_buf, int fb_gain, bool add);
};
#endif // EXTRAKERNELS_H_INCLUDED

@ -244,6 +244,24 @@ void DexedAudioProcessor::loadBuiltin(int idx) {
importSysex((char *) &syx_data);
}
void DexedAudioProcessor::resetToInitVoice() {
const char init_voice[] =
{ 99, 99, 99, 99, 99, 99, 99, 00, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7,
99, 99, 99, 99, 99, 99, 99, 00, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7,
99, 99, 99, 99, 99, 99, 99, 00, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7,
99, 99, 99, 99, 99, 99, 99, 00, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7,
99, 99, 99, 99, 99, 99, 99, 00, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7,
99, 99, 99, 99, 99, 99, 99, 00, 39, 0, 0, 0, 0, 0, 0, 0, 99, 0, 1, 0, 7,
99, 99, 99, 99, 50, 50, 50, 50, 0, 0, 1, 35, 0, 0, 0, 1, 0, 3, 24,
73, 78, 73, 84, 32, 86, 79, 73, 67, 69} ;
for(int i=0;i<sizeof(init_voice);i++) {
data[i] = init_voice[i];
}
panic();
triggerAsyncUpdate();
}
//==============================================================================
void DexedAudioProcessor::getStateInformation(MemoryBlock& destData) {
// You should use this method to store your parameters in the memory block.
@ -409,7 +427,12 @@ PopupMenu *CartridgeManager::fillContent(String root, ZipFile *userZip) {
zipIdx++;
continue;
}
if ( ! path.endsWithIgnoreCase(".syx") ) {
zipIdx++;
continue;
}
if ( ( ! path.startsWith(root) ) && root.length() != 0 )
return current;
@ -435,8 +458,8 @@ PopupMenu *CartridgeManager::fillContent(String root, ZipFile *userZip) {
if ( current == NULL )
current = new PopupMenu();
if ( tail.endsWithIgnoreCase(".syx") )
tail = tail.substring(0, tail.length()-4);
// remove the .syx extension
tail = tail.substring(0, tail.length()-4);
current->addItem(zipIdx + IDX_USER, tail);
}

@ -142,11 +142,21 @@ DexedAudioProcessorEditor::DexedAudioProcessorEditor (DexedAudioProcessor* owner
storeButton->addListener(this);
storeButton->setBounds(331, 6, 50, 18);
addAndMakeVisible(initButton = new TextButton("INIT"));
initButton->setButtonText("INIT");
initButton->addListener(this);
initButton->setBounds(385, 6, 50, 18);
addAndMakeVisible(monoButton = new TextButton("MONO"));
monoButton->setButtonText("MONO");
monoButton->addListener(this);
monoButton->setBounds(439, 6, 50, 18);
addAndMakeVisible(sendButton = new TextButton("SEND"));
sendButton->setVisible(false);
sendButton->setButtonText("SEND");
sendButton->addListener(this);
sendButton->setBounds(385, 6, 50, 18);
sendButton->setBounds(493, 6, 50, 18);
sendButton->setVisible(processor->sysexComm.isOutputActive());
addAndMakeVisible(midiMonitor = new MidiMonitor(&processor->sysexComm));
@ -155,7 +165,7 @@ DexedAudioProcessorEditor::DexedAudioProcessorEditor (DexedAudioProcessor* owner
addAndMakeVisible(settingsButton = new TextButton("PARMS"));
settingsButton->setButtonText("PARMS");
settingsButton->addListener(this);
settingsButton->setBounds(755, 6, 50, 18);
settingsButton->setBounds(754, 6, 50, 18);
addAndMakeVisible(aboutButton = new TextButton("ABOUT"));
aboutButton->setButtonText("ABOUT");
@ -318,12 +328,12 @@ void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) {
}
if (buttonThatWasClicked == settingsButton) {
int reso = processor->getEngineResolution();
int tp = processor->getEngineType();
AlertWindow window("","", AlertWindow::NoIcon, this);
ParamDialog param;
param.setColour(AlertWindow::backgroundColourId, Colour(0x32FFFFFF));
param.setDialogValues(processor->controllers, processor->sysexComm, reso);
param.setDialogValues(processor->controllers, processor->sysexComm, tp);
window.addCustomComponent(&param);
window.addButton("OK", 0);
@ -331,8 +341,8 @@ void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) {
if ( window.runModalLoop() != 0 )
return;
bool ret = param.getDialogValues(processor->controllers, processor->sysexComm, &reso);
processor->setEngineResolution(reso);
bool ret = param.getDialogValues(processor->controllers, processor->sysexComm, &tp);
processor->setEngineType(tp);
processor->savePreference();
if ( ret == false ) {
@ -343,6 +353,11 @@ void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) {
return;
}
if (buttonThatWasClicked == initButton ) {
processor->resetToInitVoice();
return;
}
if (buttonThatWasClicked == aboutButton) {
AboutBox about(this);
about.runModalLoop();

@ -51,6 +51,9 @@ class DexedAudioProcessorEditor : public AudioProcessorEditor,
ScopedPointer<TextButton> aboutButton;
ScopedPointer<TextButton> settingsButton;
ScopedPointer<TextButton> sendButton;
ScopedPointer<TextButton> initButton;
ScopedPointer<TextButton> monoButton;
ScopedPointer<Component> midiMonitor;
void storeProgram();

@ -513,8 +513,8 @@ void DexedAudioProcessor::loadPreference() {
sysexComm.setChl( prop.getIntValue( String("sysexChl") ) );
}
if ( prop.containsKey( String("engineResolution" ) ) ) {
engineResolution = prop.getIntValue( String(engineResolution) );
if ( prop.containsKey( String("engineType" ) ) ) {
engineType = prop.getIntValue( String("engineType") );
}
}

@ -56,7 +56,7 @@ DexedAudioProcessor::DexedAudioProcessor() {
normalizeDxVelocity = false;
sysexComm.listener = this;
keyboardState.addListener(&sysexComm);
engineResolution = -1;
engineType = -1;
memset(&voiceStatus, 0, sizeof(VoiceStatus));
@ -69,7 +69,7 @@ DexedAudioProcessor::DexedAudioProcessor() {
controllers.values_[kControllerPitchStep] = 0;
loadPreference();
setEngineResolution(DEXED_RESO_MODERN);
setEngineType(DEXED_ENGINE_MODERN);
for (int note = 0; note < MAX_ACTIVE_NOTES; ++note) {
voices[note].dx7_note = NULL;
@ -191,12 +191,9 @@ void DexedAudioProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& mi
for (int note = 0; note < MAX_ACTIVE_NOTES; ++note) {
if (voices[note].live) {
voices[note].dx7_note->compute(audiobuf.get(), lfovalue, lfodelay, &controllers);
uint32_t state = 0;
for (int j=0; j < N; ++j) {
int32 r = rand() & 0xFFFF;
int32_t val = audiobuf.get()[j]; //& 0xFFFFF000);// + r - state;
state = r;
int32_t val = audiobuf.get()[j]; //& 0xFFFFF000);
val = val >> 4;
int clip_val = val < -(1 << 24) ? 0x8000 : val >= (1 << 24) ? 0x7fff : val >> 9;
@ -425,29 +422,25 @@ void DexedAudioProcessor::handleIncomingMidiMessage(MidiInput* source, const Mid
}
int DexedAudioProcessor::getEngineResolution() {
return engineResolution;
int DexedAudioProcessor::getEngineType() {
return engineType;
}
void DexedAudioProcessor::setEngineResolution(int rs) {
switch (rs) {
case DEXED_RESO_MODERN :
controllers.sinBitFilter = -1;
controllers.dacBitFilter = -1;
controllers.mulBitFilter = -1;
void DexedAudioProcessor::setEngineType(int tp) {
switch (tp) {
case DEXED_ENGINE_MODERN :
controllers.core = &engineMsfa;
break;
case DEXED_RESO_MARKI:
case DEXED_ENGINE_MARKI:
controllers.sinBitFilter = 0xFFFFC000; // 10 bit
controllers.dacBitFilter = 0xFFFFF000; // semi 14 bit
controllers.core = &engineMkI;
break;
case DEXED_RESO_OPL:
controllers.sinBitFilter = 0xFFFF0000; // 9 bit
controllers.dacBitFilter = 0xFFFF0000;
case DEXED_ENGINE_OPL:
controllers.core = &engineOpl;
break;
}
engineResolution = rs;
engineType = tp;
}
// ====================================================================

@ -27,10 +27,13 @@
#include "msfa/dx7note.h"
#include "msfa/lfo.h"
#include "msfa/synth.h"
#include "msfa/fm_core.h"
#include "PluginParam.h"
#include "PluginData.h"
#include "PluginFx.h"
#include "SysexComm.h"
#include "EngineMkI.h"
#include "EngineOpl.h"
struct ProcessorVoice {
int midi_note;
@ -41,9 +44,9 @@ struct ProcessorVoice {
};
enum DexedEngineResolution {
DEXED_RESO_MODERN,
DEXED_RESO_MARKI,
DEXED_RESO_OPL
DEXED_ENGINE_MODERN,
DEXED_ENGINE_MARKI,
DEXED_ENGINE_OPL
};
//==============================================================================
@ -104,7 +107,11 @@ class DexedAudioProcessor : public AudioProcessor, public AsyncUpdater, public
bool getNextEvent(MidiBuffer::Iterator* iter,const int samplePos);
void handleIncomingMidiMessage(MidiInput* source, const MidiMessage& message);
uint32_t engineResolution;
uint32_t engineType;
FmCore engineMsfa;
EngineMkI engineMkI;
EngineOpl engineOpl;
public :
// in MIDI units (0x4000 is neutral)
@ -122,8 +129,8 @@ public :
float vuSignal;
int getEngineResolution();
void setEngineResolution(int rs);
int getEngineType();
void setEngineType(int rs);
Array<Ctrl*> ctrl;
@ -188,10 +195,11 @@ public :
//==============================================================================
int getNumPrograms();
int getCurrentProgram();
void setCurrentProgram (int index);
void setCurrentProgram(int index);
const String getProgramName (int index);
void changeProgramName (int index, const String& newName);
void changeProgramName(int index, const String& newName);
void resetToInitVoice();
//==============================================================================
void getStateInformation (MemoryBlock& destData);
void setStateInformation (const void* data, int sizeInBytes);

@ -23,6 +23,8 @@ const int kControllerPitch = 128;
const int kControllerPitchRange = 129;
const int kControllerPitchStep = 130;
class FmCore;
class Controllers {
public:
int values_[131];
@ -31,6 +33,8 @@ class Controllers {
uint32_t sinBitFilter; // bit filter based upon sin LUT lookup
uint32_t dacBitFilter; // bit filter based upon DAC resolution
uint32_t mulBitFilter; // bit filter based upon multipliers (?????)
FmCore *core;
};
#endif // __CONTROLLERS_H

@ -171,6 +171,7 @@ void Dx7Note::init(const char patch[156], int midinote, int velocity) {
// cout << op << " freq: " << freq << endl;
params_[op].phase = 0;
params_[op].gain[1] = 0;
params_[op].level[1] = 0;
ampmodsens_[op] = ampmodsenstab[patch[off + 14] & 3];
}
for (int i = 0; i < 4; i++) {
@ -187,48 +188,55 @@ void Dx7Note::init(const char patch[156], int midinote, int velocity) {
}
void Dx7Note::compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay,
const Controllers *ctrls) {
int32_t pitchmod = pitchenv_.getsample();
uint32_t pmd = pitchmoddepth_ * lfo_delay; // Q32
// TODO(PG) : make this integer friendly
uint32_t pwmd = (ctrls->values_[kControllerModWheel] * 0.7874) * (1 << 24);
int32_t senslfo = pitchmodsens_ * (lfo_val - (1 << 23));
uint32_t amd = ((int64_t)ampmoddepth_ * (int64_t)lfo_delay) >> 8; // Q24 :D
pitchmod += (((int64_t)pwmd) * (int64_t)senslfo) >> 39;
pitchmod += (((int64_t)pmd) * (int64_t)senslfo) >> 39;
const Controllers *ctrls) {
int32_t pitchmod = pitchenv_.getsample();
uint32_t pmd = pitchmoddepth_ * lfo_delay; // Q32
// TODO(PG) : make this integer friendly
uint32_t pwmd = (ctrls->values_[kControllerModWheel] * 0.7874) * (1 << 24);
int32_t senslfo = pitchmodsens_ * (lfo_val - (1 << 23));
uint32_t amd = ((int64_t) ampmoddepth_ * (int64_t) lfo_delay) >> 8; // Q24 :D
int pitchbend = ctrls->values_[kControllerPitch];
int32_t pb = (pitchbend - 0x2000);
if ( pb != 0 ) {
if ( ctrls->values_[kControllerPitchStep] == 0 ) {
pb = ((float)(pb << 11)) * ((float)ctrls->values_[kControllerPitchRange]) / 12.0;
} else {
int stp = 12 / ctrls->values_[kControllerPitchStep];
pb = pb * stp / 8191;
pb = (pb * (8191/stp)) << 11;
pitchmod += (((int64_t) pwmd) * (int64_t) senslfo) >> 39;
pitchmod += (((int64_t) pmd) * (int64_t) senslfo) >> 39;
int pitchbend = ctrls->values_[kControllerPitch];
int32_t pb = (pitchbend - 0x2000);
if (pb != 0) {
if (ctrls->values_[kControllerPitchStep] == 0) {
pb = ((float) (pb << 11)) * ((float) ctrls->values_[kControllerPitchRange]) / 12.0;
} else {
int stp = 12 / ctrls->values_[kControllerPitchStep];
pb = pb * stp / 8191;
pb = (pb * (8191 / stp)) << 11;
}
}
}
pitchmod += pb;
for (int op = 0; op < 6; op++) {
params_[op].gain[0] = params_[op].gain[1];
//int32_t gain = pow(2, 10 + level * (1.0 / (1 << 24)));
params_[op].freq = Freqlut::lookup(basepitch_[op] + pitchmod);
pitchmod += pb;
for (int op = 0; op < 6; op++) {
// PG: MEEEEEH, this needs to be cleanup. The amp mod is way better
// with the exp2 value than the original level that contains a fraction
// into the integer ?
//
// TODO: to clean up ! The AMD should be calculated on the level, not the gain
params_[op].gain[0] = params_[op].gain[1];
params_[op].level[0] = params_[op].level[1];
int32_t level = env_[op].getsample();
int32_t gain = Exp2::lookup(level - (14 * (1 << 24)));
if ( ampmodsens_[op] != 0 ) {
uint32_t sensamp = ((int64_t)ampmodsens_[op]) * ((int64_t)gain) >> 24;
sensamp = ((int64_t)sensamp) * ((int64_t)lfo_val) >> 24;
uint32_t amd_level = (((int64_t)amd) * (int64_t)sensamp) >> 24;
gain -= amd_level;
}
params_[op].gain[1] = gain;
}
core_.compute(buf, params_, algorithm_, fb_buf_, fb_shift_, ctrls);
//int32_t gain = pow(2, 10 + level * (1.0 / (1 << 24)));
params_[op].freq = Freqlut::lookup(basepitch_[op] + pitchmod);
int32_t level = env_[op].getsample();
params_[op].level[1] = level;
int32_t gain = Exp2::lookup(level - (14 * (1 << 24)));
if (ampmodsens_[op] != 0) {
uint32_t sensamp = ((int64_t) ampmodsens_[op]) * ((int64_t) gain) >> 24;
sensamp = ((int64_t) sensamp) * ((int64_t) lfo_val) >> 24;
uint32_t amd_level = (((int64_t) amd) * (int64_t) sensamp) >> 24;
gain -= amd_level;
}
params_[op].gain[1] = gain;
}
ctrls->core->compute(buf, params_, algorithm_, fb_buf_, fb_shift_, ctrls);
}
void Dx7Note::keyup() {

@ -44,8 +44,6 @@ class Dx7Note {
void keyup();
// TODO: parameter changes
// TODO: some way of indicating end-of-note. Maybe should be a return
// value from the compute method? (Having a count return from keyup
// is also tempting, but if there's a dynamic parameter change after
@ -56,7 +54,6 @@ class Dx7Note {
void peekVoiceStatus(VoiceStatus &status);
private:
FmCore core_;
Env env_[6];
FmOpParams params_[6];
PitchEnv pitchenv_;

@ -25,26 +25,7 @@
//using namespace std;
struct FmOperatorInfo {
int in;
int out;
};
enum FmOperatorFlags {
OUT_BUS_ONE = 1 << 0,
OUT_BUS_TWO = 1 << 1,
OUT_BUS_ADD = 1 << 2,
IN_BUS_ONE = 1 << 4,
IN_BUS_TWO = 1 << 5,
FB_IN = 1 << 6,
FB_OUT = 1 << 7
};
struct FmAlgorithm {
int ops[6];
};
const FmAlgorithm algorithms[32] = {
const FmAlgorithm FmCore::algorithms[32] = {
{ { 0xc1, 0x11, 0x11, 0x14, 0x01, 0x14 } }, // 1
{ { 0x01, 0x11, 0x11, 0x14, 0xc1, 0x14 } }, // 2
{ { 0xc1, 0x11, 0x14, 0x01, 0x11, 0x14 } }, // 3
@ -109,68 +90,44 @@ void FmCore::dump() {
}
void FmCore::compute(int32_t *output, FmOpParams *params, int algorithm,
int32_t *fb_buf, int feedback_shift, const Controllers *controllers) {
const int kLevelThresh = 1120;
const FmAlgorithm alg = algorithms[algorithm];
bool has_contents[3] = { true, false, false };
for (int op = 0; op < 6; op++) {
int flags = alg.ops[op];
bool add = (flags & OUT_BUS_ADD) != 0;
FmOpParams &param = params[op];
int inbus = (flags >> 4) & 3;
int outbus = flags & 3;
int32_t *outptr = (outbus == 0) ? output : buf_[outbus - 1].get();
int32_t gain1 = param.gain[0];
int32_t gain2 = param.gain[1];
if (gain1 >= kLevelThresh || gain2 >= kLevelThresh) {
if (!has_contents[outbus]) {
add = false;
}
if (inbus == 0 || !has_contents[inbus]) {
// PG: this is my 'dirty' implementation of FB for 2 and 3 operators...
// still needs some tuning...
if ((flags & 0xc0) == 0xc0 && feedback_shift < 16) {
switch ( algorithm ) {
// two operator feedback, process exception for ALGO 6
case 5 :
FmOpKernel::compute_fb2(outptr, params, fb_buf, feedback_shift, controllers);
param.phase += param.freq << LG_N;
params[1].phase += param.freq + params[1].freq << LG_N; // yuk, hack, we already processed op-5
op++; // ignore next operator;
break;
// three operator feedback, process exception for ALGO 4
case 3 :
FmOpKernel::compute_fb3(outptr, params, fb_buf, feedback_shift, controllers);
param.phase += param.freq << LG_N;
params[1].phase += param.freq + params[1].freq << LG_N; // hack, we already processed op-5 - op-4
params[2].phase += param.freq + params[1].freq + params[2].freq << LG_N; // yuk yuk
op += 2; // ignore the 2 other operators
break;
default:
// one operator feedback, normal proces
//cout << "\t" << op << " fb " << inbus << outbus << add << endl;
FmOpKernel::compute_fb(outptr, param.phase, param.freq,
gain1, gain2,
fb_buf, feedback_shift, add, controllers);
param.phase += param.freq << LG_N;
break;
}
has_contents[outbus] = true;
continue;
} else {
// cout << op << " pure " << inbus << outbus << add << endl;
FmOpKernel::compute_pure(outptr, param.phase, param.freq,
gain1, gain2, add, controllers);
int32_t *fb_buf, int feedback_shift, const Controllers *controller) {
const int kLevelThresh = 1120;
const FmAlgorithm alg = algorithms[algorithm];
bool has_contents[3] = { true, false, false };
for (int op = 0; op < 6; op++) {
int flags = alg.ops[op];
bool add = (flags & OUT_BUS_ADD) != 0;
FmOpParams &param = params[op];
int inbus = (flags >> 4) & 3;
int outbus = flags & 3;
int32_t *outptr = (outbus == 0) ? output : buf_[outbus - 1].get();
int32_t gain1 = param.gain[0];
int32_t gain2 = param.gain[1];
if (gain1 >= kLevelThresh || gain2 >= kLevelThresh) {
if (!has_contents[outbus]) {
add = false;
}
if (inbus == 0 || !has_contents[inbus]) {
// todo: more than one op in a feedback loop
if ((flags & 0xc0) == 0xc0 && feedback_shift < 16) {
// cout << op << " fb " << inbus << outbus << add << endl;
FmOpKernel::compute_fb(outptr, param.phase, param.freq,
gain1, gain2,
fb_buf, feedback_shift, add);
} else {
// cout << op << " pure " << inbus << outbus << add << endl;
FmOpKernel::compute_pure(outptr, param.phase, param.freq,
gain1, gain2, add);
}
} else {
// cout << op << " normal " << inbus << outbus << " " << param.freq << add << endl;
FmOpKernel::compute(outptr, buf_[inbus - 1].get(),
param.phase, param.freq, gain1, gain2, add);
}
has_contents[outbus] = true;
} else if (!add) {
has_contents[outbus] = false;
}
} else {
// cout << op << " normal " << inbus << outbus << " " << param.freq << add << endl;
FmOpKernel::compute(outptr, buf_[inbus - 1].get(),
param.phase, param.freq, gain1, gain2, add, controllers);
}
has_contents[outbus] = true;
} else if (!add) {
has_contents[outbus] = false;
param.phase += param.freq << LG_N;
}
param.phase += param.freq << LG_N;
}
}
}

@ -22,13 +22,37 @@
#include "synth.h"
#include "controllers.h"
class FmOperatorInfo {
public:
int in;
int out;
};
enum FmOperatorFlags {
OUT_BUS_ONE = 1 << 0,
OUT_BUS_TWO = 1 << 1,
OUT_BUS_ADD = 1 << 2,
IN_BUS_ONE = 1 << 4,
IN_BUS_TWO = 1 << 5,
FB_IN = 1 << 6,
FB_OUT = 1 << 7
};
class FmAlgorithm {
public:
int ops[6];
};
class FmCore {
public:
virtual ~FmCore() {};
static void dump();
void compute(int32_t *output, FmOpParams *params, int algorithm,
int32_t *fb_buf, int32_t feedback_gain, const Controllers *controller);
private:
virtual void compute(int32_t *output, FmOpParams *params, int algorithm,
int32_t *fb_buf, int32_t feedback_gain, const Controllers *controller);
protected:
AlignedBuf<int32_t, N>buf_[2];
const static FmAlgorithm algorithms[32];
};
#endif // __FM_CORE_H

@ -46,7 +46,7 @@ static bool hasNeon() {
void FmOpKernel::compute(int32_t *output, const int32_t *input,
int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2, bool add, const Controllers *controllers) {
int32_t gain1, int32_t gain2, bool add) {
int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N;
int32_t gain = gain1;
int32_t phase = phase0;
@ -60,7 +60,6 @@ void FmOpKernel::compute(int32_t *output, const int32_t *input,
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t y = Sin::lookup(phase + input[i]);
y &= controllers->sinBitFilter;
int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24;
output[i] += y1;
phase += freq;
@ -69,7 +68,6 @@ void FmOpKernel::compute(int32_t *output, const int32_t *input,
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t y = Sin::lookup(phase + input[i]);
y &= controllers->sinBitFilter;
int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24;
output[i] = y1;
phase += freq;
@ -79,7 +77,7 @@ void FmOpKernel::compute(int32_t *output, const int32_t *input,
}
void FmOpKernel::compute_pure(int32_t *output, int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2, bool add, const Controllers *controllers) {
int32_t gain1, int32_t gain2, bool add) {
int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N;
int32_t gain = gain1;
int32_t phase = phase0;
@ -93,7 +91,6 @@ void FmOpKernel::compute_pure(int32_t *output, int32_t phase0, int32_t freq,
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t y = Sin::lookup(phase);
y &= controllers->sinBitFilter;
int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24;
output[i] += y1;
phase += freq;
@ -102,7 +99,6 @@ void FmOpKernel::compute_pure(int32_t *output, int32_t phase0, int32_t freq,
for (int i = 0; i < N; i++) {
gain += dgain;
int32_t y = Sin::lookup(phase);
y &= controllers->sinBitFilter;
int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24;
output[i] = y1;
phase += freq;
@ -116,7 +112,7 @@ void FmOpKernel::compute_pure(int32_t *output, int32_t phase0, int32_t freq,
void FmOpKernel::compute_fb(int32_t *output, int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2,
int32_t *fb_buf, int fb_shift, bool add, const Controllers *controllers) {
int32_t *fb_buf, int fb_shift, bool add) {
int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N;
int32_t gain = gain1;
int32_t phase = phase0;
@ -128,7 +124,6 @@ void FmOpKernel::compute_fb(int32_t *output, int32_t phase0, int32_t freq,
int32_t scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase + scaled_fb);
y &= controllers->sinBitFilter;
y = ((int64_t)y * (int64_t)gain) >> 24;
output[i] += y;
phase += freq;
@ -139,7 +134,6 @@ void FmOpKernel::compute_fb(int32_t *output, int32_t phase0, int32_t freq,
int32_t scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase + scaled_fb);
y &= controllers->sinBitFilter;
y = ((int64_t)y * (int64_t)gain) >> 24;
output[i] = y;
phase += freq;
@ -149,96 +143,6 @@ void FmOpKernel::compute_fb(int32_t *output, int32_t phase0, int32_t freq,
fb_buf[1] = y;
}
// exclusively used for ALGO 6 with feedback
void FmOpKernel::compute_fb2(int32_t *output, FmOpParams *parms, int32_t *fb_buf, int fb_shift, const Controllers *cont) {
int32_t dgain[2];
int32_t gain[2];
int32_t phase[2];
int32_t y0 = fb_buf[0];
int32_t y = fb_buf[1];
phase[0] = parms[0].phase;
phase[1] = parms[1].phase;
dgain[0] = (parms[0].gain[1] - parms[0].gain[0] + (N >> 1)) >> LG_N;
dgain[1] = (parms[1].gain[1] - parms[1].gain[0] + (N >> 1)) >> LG_N;
gain[0] = parms[0].gain[0];
gain[1] = parms[1].gain[1];
for (int i = 0; i < N; i++) {
// op 0
gain[0] += dgain[0];
int32_t scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase[0] + scaled_fb);
y = ((int64_t)y * (int64_t)gain) >> 24;
phase[0] += parms[0].freq;
// op 1
gain[1] += dgain[1];
scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase[1] + scaled_fb + y);
y = ((int64_t)y * (int64_t)gain) >> 24;
output[i] = y;
phase[1] += parms[1].freq;
}
fb_buf[0] = y0;
fb_buf[1] = y;
}
// exclusively used for ALGO 4 with feedback
void FmOpKernel::compute_fb3(int32_t *output, FmOpParams *parms, int32_t *fb_buf, int fb_shift, const Controllers *conts) {
int32_t dgain[3];
int32_t gain[3];
int32_t phase[3];
int32_t y0 = fb_buf[0];
int32_t y = fb_buf[1];
phase[0] = parms[0].phase;
phase[1] = parms[1].phase;
phase[2] = parms[2].phase;
dgain[0] = (parms[0].gain[1] - parms[0].gain[0] + (N >> 1)) >> LG_N;
dgain[1] = (parms[1].gain[1] - parms[1].gain[0] + (N >> 1)) >> LG_N;
dgain[2] = (parms[2].gain[1] - parms[2].gain[0] + (N >> 1)) >> LG_N;
gain[0] = parms[0].gain[0];
gain[1] = parms[1].gain[0];
gain[2] = parms[2].gain[0];
for (int i = 0; i < N; i++) {
// op 0
gain[0] += dgain[0];
int32_t scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase[0] + scaled_fb);
y = ((int64_t)y * (int64_t)gain) >> 24;
phase[0] += parms[0].freq;
// op 1
gain[1] += dgain[1];
scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase[1] + scaled_fb + y);
y = ((int64_t)y * (int64_t)gain) >> 24;
phase[1] += parms[1].freq;
// op 2
gain[2] += dgain[2];
scaled_fb = (y0 + y) >> (fb_shift + 1);
y0 = y;
y = Sin::lookup(phase[2] + scaled_fb + y);
y = ((int64_t)y * (int64_t)gain) >> 24;
output[i] = y;
phase[2] += parms[2].freq;
}
fb_buf[0] = y0;
fb_buf[1] = y;
}
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

@ -17,38 +17,33 @@
#ifndef __FM_OP_KERNEL_H
#define __FM_OP_KERNEL_H
#include "controllers.h"
struct FmOpParams {
int32_t gain[2];
int32_t freq;
int32_t phase;
// PG: temporary code, only useful for engine that already calculate the exp value
int32_t level[2];
};
class FmOpKernel {
public:
public:
// gain1 and gain2 represent linear step: gain for sample i is
// gain1 + (1 + i) / 64 * (gain2 - gain1)
// This is the basic FM operator. No feedback.
static void compute(int32_t *output, const int32_t *input,
int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2, bool add, const Controllers *controllers);
int32_t gain1, int32_t gain2, bool add);
// This is a sine generator, no feedback.
static void compute_pure(int32_t *output, int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2, bool add, const Controllers *controllers);
int32_t gain1, int32_t gain2, bool add);
// One op with feedback, no add.
static void compute_fb(int32_t *output, int32_t phase0, int32_t freq,
int32_t gain1, int32_t gain2,
int32_t *fb_buf, int fb_gain, bool add, const Controllers *controllers);
static void compute_fb2(int32_t *output, FmOpParams *params, int32_t *fb_buf, int fb_shift,
const Controllers *controllers);
static void compute_fb3(int32_t *output, FmOpParams *params, int32_t *fb_buf, int fb_shift,
const Controllers *controllers);
int32_t *fb_buf, int fb_gain, bool add);
};
#endif

@ -60,6 +60,8 @@ inline static T max(const T& a, const T& b) {
void dexed_trace(const char *source, const char *fmt, ...);
#define QER(n,b) ( ((float)n)/(1<<b) )
#ifdef _MSC_VER
#define TRACE(fmt, ...) dexed_trace(__FUNCTION__,fmt,##__VA_ARGS__)
#else

Loading…
Cancel
Save