├── .editorconfig
├── .gitattributes
├── .github
├── ISSUE_TEMPLATE
│ ├── bug-report.yml
│ └── config.yml
└── workflows
│ └── release.yml
├── .gitignore
├── LICENSE.txt
├── Logo
├── openutau.svg
└── openutau_logotype.svg
├── Misc
├── GIFs
│ ├── editor.gif
│ ├── editor2.gif
│ ├── playback.gif
│ ├── undo.gif
│ └── vibrato.gif
└── sync_strings.py
├── OpenUtau.Core
├── Analysis
│ └── Crepe
│ │ ├── Crepe.cs
│ │ ├── LICENSE.txt
│ │ ├── Resources.Designer.cs
│ │ ├── Resources.resx
│ │ └── tiny.onnx
├── Api
│ ├── G2pDictionary.cs
│ ├── G2pDictionaryData.cs
│ ├── G2pFallbacks.cs
│ ├── G2pPack.cs
│ ├── G2pRemapper.cs
│ ├── IG2p.cs
│ ├── Phonemizer.cs
│ ├── PhonemizerFactory.cs
│ ├── PhonemizerRunner.cs
│ └── README.md
├── Audio
│ ├── AudioDevice.cs
│ ├── AudioEngine.cs
│ ├── AudioFrame.cs
│ ├── AudioStreamInfo.cs
│ ├── Bindings
│ │ ├── PaBinding.Delegates.cs
│ │ ├── PaBinding.Enums.cs
│ │ ├── PaBinding.Structs.cs
│ │ └── PaBinding.cs
│ ├── DummyAudioOutput.cs
│ ├── IAudioOutput.cs
│ ├── NAudioOutput.cs
│ └── PortAudioOutput.cs
├── BaseChinesePhonemizer.cs
├── Classic
│ ├── ClassicRenderer.cs
│ ├── ClassicSinger.cs
│ ├── ClassicSingerLoader.cs
│ ├── ExeResampler.cs
│ ├── ExeWavtool.cs
│ ├── Frq.cs
│ ├── IPlugin.cs
│ ├── IResampler.cs
│ ├── IWavtool.cs
│ ├── Ini.cs
│ ├── OtoWatcher.cs
│ ├── Plugin.cs
│ ├── PluginLoader.cs
│ ├── PluginRunner.cs
│ ├── Presamp.cs
│ ├── ResamplerItem.cs
│ ├── ResamplerManifest.cs
│ ├── SharpWavtool.cs
│ ├── ToolsManager.cs
│ ├── Ust.cs
│ ├── UstNote.cs
│ ├── VoiceBank.cs
│ ├── VoicebankConfig.cs
│ ├── VoicebankErrorChecker.cs
│ ├── VoicebankFiles.cs
│ ├── VoicebankInstaller.cs
│ ├── VoicebankLoader.cs
│ ├── WorldlineRenderer.cs
│ └── WorldlineResampler.cs
├── Commands
│ ├── ExpCommands.cs
│ ├── NoteCommands.cs
│ ├── Notifications.cs
│ ├── PartCommands.cs
│ ├── ProjectCommands.cs
│ ├── TrackCommands.cs
│ └── UCommand.cs
├── DefaultPhonemizer.cs
├── DiffSinger
│ ├── DiffSingerConfig.cs
│ ├── DiffSingerDependencyInstaller.cs
│ ├── DiffSingerMandarinPhonemizer.cs
│ ├── DiffSingerRenderer.cs
│ ├── DiffSingerRhythmizerPhonemizer.cs
│ ├── DiffSingerScript.cs
│ ├── DiffSingerSinger.cs
│ ├── DiffSingerUtils.cs
│ └── DiffSingerVocoder.cs
├── DocManager.cs
├── Editing
│ ├── BatchEdit.cs
│ ├── LyricBatchEdits.cs
│ ├── NoteBatchEdits.cs
│ └── README.md
├── Enunu
│ ├── EnunuClient.cs
│ ├── EnunuConfig.cs
│ ├── EnunuEnglishPhonemizer.cs
│ ├── EnunuPhonemizer.cs
│ ├── EnunuRenderer.cs
│ ├── EnunuSinger.cs
│ └── EnunuUtils.cs
├── Format
│ ├── Formats.cs
│ ├── Midi.cs
│ ├── MidiWriter.cs
│ ├── OpusOggWaveReader.cs
│ ├── USTx.cs
│ ├── VSQx.cs
│ └── Wave.cs
├── G2p
│ ├── ArpabetG2p.cs
│ ├── Data
│ │ ├── Resources.Designer.cs
│ │ ├── Resources.resx
│ │ ├── g2p-arpabet.zip
│ │ ├── g2p-es.zip
│ │ ├── g2p-fr.zip
│ │ ├── g2p-it.zip
│ │ ├── g2p-pt.zip
│ │ └── g2p-ru.zip
│ ├── FrenchG2p.cs
│ ├── ItalianG2p.cs
│ ├── PortugueseG2p.cs
│ ├── RussianG2p.cs
│ └── SpanishG2p.cs
├── OpenUtau.Core.csproj
├── PlaybackManager.cs
├── Render
│ ├── IRenderer.cs
│ ├── RenderCache.cs
│ ├── RenderEngine.cs
│ ├── RenderPhrase.cs
│ ├── Renderers.cs
│ └── Worldline.cs
├── SignalChain
│ ├── ExportAdapter.cs
│ ├── Fader.cs
│ ├── ISignalSource.cs
│ ├── MasterAdapter.cs
│ ├── WaveMix.cs
│ └── WaveSource.cs
├── SingerManager.cs
├── ThirdParty
│ └── Deque.cs
├── Ustx
│ ├── UCurve.cs
│ ├── UExpression.cs
│ ├── UNote.cs
│ ├── UPart.cs
│ ├── UPhoneme.cs
│ ├── UProject.cs
│ ├── USinger.cs
│ └── UTrack.cs
├── Util
│ ├── Base64.cs
│ ├── IniFileClass.cs
│ ├── LibraryLoader.cs
│ ├── LocalizedSort.cs
│ ├── LyricsHelper.cs
│ ├── MusicMath.cs
│ ├── NotePresets.cs
│ ├── OS.cs
│ ├── Onnx.cs
│ ├── PathManager.cs
│ ├── Preferences.cs
│ ├── ProcessRunner.cs
│ ├── SingletonBase.cs
│ ├── SplitLyrics.cs
│ ├── TimeAxis.cs
│ ├── Yaml.cs
│ └── Zip.cs
├── VocalShaper
│ ├── Complex.cs
│ ├── VSMath.cs
│ ├── VSVocoder.cs
│ └── World.cs
└── Vogen
│ ├── Data
│ ├── VogenRes.Designer.cs
│ ├── VogenRes.resx
│ ├── f0.man.onnx
│ ├── f0.yue.onnx
│ ├── g2p.man.onnx
│ ├── g2p.yue.onnx
│ ├── po.man.onnx
│ ├── po.yue.onnx
│ └── yue.csv
│ ├── TrieNode.cs
│ ├── VogenBasePhonemizer.cs
│ ├── VogenMandarinPhonemizer.cs
│ ├── VogenRenderer.cs
│ ├── VogenSinger.cs
│ ├── VogenSingerInstaller.cs
│ ├── VogenSingerLoader.cs
│ └── VogenYuePhonemizer.cs
├── OpenUtau.Plugin.Builtin
├── ArpasingPhonemizer.cs
├── BrazilianPortugueseCVCPhonemizer.cs
├── ChineseCVVCPhonemizer.cs
├── ChineseCVVPhonemizer.cs
├── Data
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── arpasing.template.yaml
│ ├── envccv.template.yaml
│ └── xsampa.template.yaml
├── ENDeltaPhonemizer.cs
├── ENtoJAPhonemizer.cs
├── EStoJAPhonemizer.cs
├── EnglishVCCVPhonemizer.cs
├── EnunuOnnx
│ ├── EnunuConfig.cs
│ ├── EnunuOnnxConfig.cs
│ ├── EnunuOnnxEnglishPhonemizer.cs
│ ├── EnunuOnnxPhonemizer.cs
│ ├── HTS.cs
│ ├── HTSLabelFile.cs
│ ├── Merlin.cs
│ ├── Python.cs
│ └── Scaler.cs
├── FrenchCMUSphinxPhonemizer.cs
├── FrenchCVVCPhonemizer.cs
├── FrenchVCCVPhonemizer.cs
├── ItalianCVVCPhonemizer.cs
├── ItalianSyllableBasedPhonemizer.cs
├── JapaneseCVVCPhonemizer.cs
├── JapanesePresampPhonemizer.cs
├── JapaneseVCVPhonemizer.cs
├── KoreanCBNNPhonemizer.cs
├── KoreanCVCCVPhonemizer.cs
├── KoreanCVCPhonemizer.cs
├── KoreanCVVCStandardPronunciationPhonemizer.cs
├── KoreanVCVPhonemizer.cs
├── LatinDiphonePhonemizer.cs
├── OpenUtau.Plugin.Builtin.csproj
├── PolishCVCPhonemizer.cs
├── PresampSamplePhonemizer.cs
├── RussianCVCPhonemizer.cs
├── RussianVCCVPhonemizer.cs
├── SpanishMakkusanPhonemizer.cs
├── SpanishSyllableBasedPhonemizer.cs
├── SpanishVCCVPhonemizer.cs
├── SyllableBasedPhonemizer.cs
├── VietnameseCVVCPhonemizer.cs
├── VietnameseVCVPhonemizer.cs
└── VietnameseVINAPhonemizer.cs
├── OpenUtau.Test
├── App
│ └── AppTest.cs
├── Classic
│ ├── PluginRunnerTest.cs
│ ├── UstTest.cs
│ ├── VoicebankConfigTest.cs
│ └── VoicebankLoaderTest.cs
├── Core
│ ├── G2p
│ │ └── G2pTest.cs
│ ├── SignalChain
│ │ └── WaveSourceTest.cs
│ ├── USTx
│ │ └── UstxYamlTest.cs
│ └── Util
│ │ ├── MusicMathTest.cs
│ │ ├── SplitLyricsTest.cs
│ │ └── TimeAxisTest.cs
├── Files
│ ├── en_arpa
│ │ ├── High
│ │ │ └── oto.ini
│ │ ├── Low
│ │ │ └── oto.ini
│ │ ├── Main
│ │ │ └── oto.ini
│ │ ├── Whisper
│ │ │ └── oto.ini
│ │ ├── character.txt
│ │ └── character.yaml
│ ├── en_delta0
│ │ ├── character.txt
│ │ ├── oto.ini
│ │ └── presamp.ini
│ ├── en_delta7
│ │ ├── character.txt
│ │ ├── oto.ini
│ │ └── presamp.ini
│ ├── en_vccv
│ │ ├── CC-
│ │ │ └── oto.ini
│ │ ├── CCV
│ │ │ └── oto.ini
│ │ ├── CV
│ │ │ └── oto.ini
│ │ ├── CVC_CV
│ │ │ └── oto.ini
│ │ ├── CV_CVC
│ │ │ └── oto.ini
│ │ ├── V
│ │ │ └── oto.ini
│ │ ├── VC
│ │ │ └── oto.ini
│ │ ├── VCC
│ │ │ └── oto.ini
│ │ ├── VV
│ │ │ └── oto.ini
│ │ ├── _CV
│ │ │ └── oto.ini
│ │ └── character.txt
│ ├── ja_cvvc
│ │ ├── A3
│ │ │ └── oto.ini
│ │ ├── B4
│ │ │ └── oto.ini
│ │ ├── C4
│ │ │ └── oto.ini
│ │ ├── F4
│ │ │ └── oto.ini
│ │ ├── character.txt
│ │ ├── character.yaml
│ │ ├── oto.ini
│ │ ├── 弱
│ │ │ ├── oto.ini
│ │ │ ├── 弱_A3
│ │ │ │ └── oto.ini
│ │ │ ├── 弱_B4
│ │ │ │ └── oto.ini
│ │ │ ├── 弱_C4
│ │ │ │ └── oto.ini
│ │ │ └── 弱_E4
│ │ │ │ └── oto.ini
│ │ └── 強
│ │ │ ├── oto.ini
│ │ │ ├── 強_B3
│ │ │ └── oto.ini
│ │ │ ├── 強_B4
│ │ │ └── oto.ini
│ │ │ └── 強_F4
│ │ │ └── oto.ini
│ ├── ja_presamp
│ │ ├── - a
│ │ │ └── oto.ini
│ │ ├── C
│ │ │ └── oto.ini
│ │ ├── a -
│ │ │ └── oto.ini
│ │ ├── beach A3
│ │ │ └── oto.ini
│ │ ├── beach A4
│ │ │ └── oto.ini
│ │ ├── beach C5
│ │ │ └── oto.ini
│ │ ├── beach D4
│ │ │ └── oto.ini
│ │ ├── beach F4
│ │ │ └── oto.ini
│ │ ├── beach vv A4
│ │ │ └── oto.ini
│ │ ├── beach vv A4C5
│ │ │ └── oto.ini
│ │ ├── boat D4
│ │ │ └── oto.ini
│ │ ├── character.txt
│ │ ├── character.yaml
│ │ ├── nebura B3
│ │ │ └── oto.ini
│ │ ├── nebura C5
│ │ │ └── oto.ini
│ │ ├── nebura E3
│ │ │ └── oto.ini
│ │ ├── nebura E4
│ │ │ └── oto.ini
│ │ ├── nebura G#3
│ │ │ └── oto.ini
│ │ ├── nebura G#4
│ │ │ └── oto.ini
│ │ ├── oto.ini
│ │ ├── presamp.ini
│ │ ├── sand A3
│ │ │ └── oto.ini
│ │ ├── sand D4
│ │ │ └── oto.ini
│ │ ├── shell A3
│ │ │ └── oto.ini
│ │ ├── shell A4
│ │ │ └── oto.ini
│ │ ├── shell D4
│ │ │ └── oto.ini
│ │ ├── shell F4
│ │ │ └── oto.ini
│ │ ├── wave A3
│ │ │ └── oto.ini
│ │ ├── wave D4
│ │ │ └── oto.ini
│ │ └── wave F4
│ │ │ └── oto.ini
│ ├── ja_vcv
│ │ ├── C_A3
│ │ │ └── oto.ini
│ │ ├── C_C5
│ │ │ └── oto.ini
│ │ ├── C_D4
│ │ │ └── oto.ini
│ │ ├── C_G4
│ │ │ └── oto.ini
│ │ ├── N_A3
│ │ │ └── oto.ini
│ │ ├── N_C5
│ │ │ └── oto.ini
│ │ ├── N_D4
│ │ │ └── oto.ini
│ │ ├── N_G4
│ │ │ └── oto.ini
│ │ ├── W_A3
│ │ │ └── oto.ini
│ │ ├── W_D4
│ │ │ └── oto.ini
│ │ ├── W_G4
│ │ │ └── oto.ini
│ │ ├── character.txt
│ │ └── character.yaml
│ └── sine.wav
├── OpenUtau.Test.csproj
├── Plugins
│ ├── EnArpaTest.cs
│ ├── EnDeltaTest.cs
│ ├── EnToJaTest.cs
│ ├── EnVCCVTest.cs
│ ├── JaCvvcTest.cs
│ ├── JaPresampTest.cs
│ ├── JaVcvTest.cs
│ ├── PhonemizerTest.cs
│ └── PhonemizerTestBase.cs
└── Usts
│ └── _dummy.ust
├── OpenUtau.sln
├── OpenUtau
├── App.axaml
├── App.axaml.cs
├── Assets
│ ├── OpenUtau.icns
│ ├── logotype-w.png
│ ├── logotype.png
│ └── open-utau.ico
├── Colors
│ ├── Brushes.axaml
│ ├── DarkTheme.axaml
│ └── LightTheme.axaml
├── Controls
│ ├── ExpSelector.axaml
│ ├── ExpSelector.axaml.cs
│ ├── ExpressionCanvas.cs
│ ├── LyricBox.axaml
│ ├── LyricBox.axaml.cs
│ ├── NotesCanvas.cs
│ ├── PartControl.cs
│ ├── PartsCanvas.cs
│ ├── PhonemeCanvas.cs
│ ├── TextLayoutCache.cs
│ ├── TickBackground.cs
│ ├── TrackAdder.axaml
│ ├── TrackAdder.axaml.cs
│ ├── TrackBackground.cs
│ ├── TrackHeader.axaml
│ ├── TrackHeader.axaml.cs
│ ├── TrackHeaderCanvas.cs
│ ├── ViewScaler.axaml
│ ├── ViewScaler.axaml.cs
│ └── WaveformImage.cs
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── Integrations
│ └── VLabelerClient.cs
├── OpenUtau.csproj
├── Program.cs
├── Resources
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ └── Unzipper.exe
├── Strings
│ ├── Strings.axaml
│ ├── Strings.es-ES.axaml
│ ├── Strings.es-MX.axaml
│ ├── Strings.fi-FI.axaml
│ ├── Strings.fr-FR.axaml
│ ├── Strings.id-ID.axaml
│ ├── Strings.it-IT.axaml
│ ├── Strings.ja-JP.axaml
│ ├── Strings.ko-KR.axaml
│ ├── Strings.nl-NL.axaml
│ ├── Strings.pl-PL.axaml
│ ├── Strings.pt-BR.axaml
│ ├── Strings.ru-RU.axaml
│ ├── Strings.th-TH.axaml
│ ├── Strings.vi-VN.axaml
│ ├── Strings.zh-CN.axaml
│ └── Strings.zh-TW.axaml
├── Styles
│ └── Styles.axaml
├── ThemeManager.cs
├── ViewConstants.cs
├── ViewLocator.cs
├── ViewModels
│ ├── Converters.cs
│ ├── DebugViewModel.cs
│ ├── EditSubbanksViewModel.cs
│ ├── ExpSelectorViewModel.cs
│ ├── ExpressionsViewModel.cs
│ ├── LyricBoxViewModel.cs
│ ├── LyricsViewModel.cs
│ ├── MainWindowViewModel.cs
│ ├── MenuItemViewModel.cs
│ ├── NoteDefaultsViewModel.cs
│ ├── NoteSelectionViewModel.cs
│ ├── NotesViewModel.cs
│ ├── NotesViewModelHitTest.cs
│ ├── PhoneticAssistantViewModel.cs
│ ├── PianoRollViewModel.cs
│ ├── PlaybackViewModel.cs
│ ├── PreferencesViewModel.cs
│ ├── SingerSetupViewModel.cs
│ ├── SingersViewModel.cs
│ ├── TrackHeaderViewModel.cs
│ ├── TrackSettingsViewModel.cs
│ ├── TracksViewModel.cs
│ ├── UpdaterViewModel.cs
│ └── ViewModelBase.cs
├── Views
│ ├── DebugWindow.axaml
│ ├── DebugWindow.axaml.cs
│ ├── EditSubbanksDialog.axaml
│ ├── EditSubbanksDialog.axaml.cs
│ ├── ExpressionsDialog.axaml
│ ├── ExpressionsDialog.axaml.cs
│ ├── LyricsDialog.axaml
│ ├── LyricsDialog.axaml.cs
│ ├── MainWindow.axaml
│ ├── MainWindow.axaml.cs
│ ├── MessageBox.axaml
│ ├── MessageBox.axaml.cs
│ ├── NoteDefaultsDialog.axaml
│ ├── NoteDefaultsDialog.axaml.cs
│ ├── NoteEditStates.cs
│ ├── PartEditStates.cs
│ ├── PhoneticAssistant.axaml
│ ├── PhoneticAssistant.axaml.cs
│ ├── PianoRollWindow.axaml
│ ├── PianoRollWindow.axaml.cs
│ ├── PreferencesDialog.axaml
│ ├── PreferencesDialog.axaml.cs
│ ├── SingerSetupDialog.axaml
│ ├── SingerSetupDialog.axaml.cs
│ ├── SingersDialog.axaml
│ ├── SingersDialog.axaml.cs
│ ├── TimeSignatureDialog.axaml
│ ├── TimeSignatureDialog.axaml.cs
│ ├── TrackSettingsDialog.axaml
│ ├── TrackSettingsDialog.axaml.cs
│ ├── TypeInDialog.axaml
│ ├── TypeInDialog.axaml.cs
│ ├── UpdaterDialog.axaml
│ └── UpdaterDialog.axaml.cs
└── nuget.config
├── README.md
├── README_zh.md
├── Unzipper
├── Program.cs
├── Unzip.cs
├── Unzipper.csproj
├── UnzipperForm.Designer.cs
├── UnzipperForm.cs
└── UnzipperForm.resx
├── appveyor.py
├── appveyor.yml
├── py
├── .gitignore
├── README.md
└── g2p
│ ├── dataset.py
│ ├── en_us
│ ├── cfg.yaml
│ └── phones.txt
│ ├── model.py
│ ├── requirements.txt
│ ├── train.py
│ └── trainer.py
└── runtimes
├── linux-arm64
└── native
│ └── libworldline.so
├── linux-x64
└── native
│ ├── libportaudio.so
│ └── libworldline.so
├── osx
└── native
│ ├── libportaudio.dylib
│ └── libworldline.dylib
├── win-x64
└── native
│ ├── portaudio.dll
│ └── worldline.dll
└── win-x86
└── native
├── portaudio.dll
└── worldline.dll
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | *.cs text diff=csharp eol=crlf
5 | *.cshtml text diff=html
6 | *.csx text diff=csharp
7 | *.sln text eol=crlf
8 | *.csproj text eol=crlf
9 | *.xaml text eol=crlf
10 | *.axaml text eol=crlf
11 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug-report.yml:
--------------------------------------------------------------------------------
1 | name: 🐛 Bug Report
2 | description: Create a report to help us reproduce and fix the bug
3 | body:
4 | - type: markdown
5 | attributes:
6 | value: |
7 | GitHub issues are for reporting bugs and crashes. Vague help requests are not efficiently handled here.
8 | For help request please read [Getting-Started](https://github.com/stakira/OpenUtau/wiki/Getting-Started) and [FAQ](https://github.com/stakira/OpenUtau/wiki/FAQ) and other wiki pages first.
9 | If still not resolved, help requests are better handled in the Discord server or QQ group.
10 | - type: checkboxes
11 | attributes:
12 | label: Acknowledgement
13 | options:
14 | - label: I have read Getting-Started and FAQ
15 | required: true
16 | - type: textarea
17 | attributes:
18 | label: 🐛 Describe the bug
19 | description: >
20 | Please provide a clear and concise description of what the bug is.
21 | validations:
22 | required: true
23 | - type: textarea
24 | attributes:
25 | label: Explains how to reproduce the bug
26 | description: |
27 | Explains how to make the bug happen again.
28 | Explains what's the voicebank used, where to get it.
29 | Share the ust or ustx file if you could. Or you could isolate the issue in a small file.
30 | placeholder: |
31 | Example:
32 | 1. Go to '...'
33 | 2. Click on '...'
34 | 3. See error '...'
35 | 4. Voicebank is '...'
36 | 5. Attach ustx
37 | validations:
38 | required: true
39 | - type: input
40 | attributes:
41 | label: OS & Version
42 | description: >
43 | Example: Windows 7, Windows 10, macOS 10.14, macOS 11.16, Ubuntu 20.04
44 | validations:
45 | required: true
46 | - type: textarea
47 | attributes:
48 | label: Logs
49 | description: |
50 | Find the log corresponding to the bug and attach it here.
51 | Log files are under Logs folder.
52 | When in doubt, delete all log files, reproduce the bug, and attach the new log file.
53 | validations:
54 | required: true
55 | - type: markdown
56 | attributes:
57 | value: >
58 | Thanks for contributing!
59 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: Discord Server
4 | url: https://discord.gg/UfpMnqMmEM
5 | about: Ask and answer questions here.
6 | - name: Chinese QQ Group
7 | url: https://qm.qq.com/cgi-bin/qm/qr?k=8EtEpehB1a-nfTNAnngTVqX3o9xoIxmT&jump_from=webapi
8 | about: Ask and answer questions in Chinese here.
9 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 StAkira
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Logo/openutau.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Logo/openutau_logotype.svg:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/Misc/GIFs/editor.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fishaudio/OpenUtau/72e8339f25331e5aa09dff18dd44550efbb71579/Misc/GIFs/editor.gif
--------------------------------------------------------------------------------
/Misc/GIFs/editor2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fishaudio/OpenUtau/72e8339f25331e5aa09dff18dd44550efbb71579/Misc/GIFs/editor2.gif
--------------------------------------------------------------------------------
/Misc/GIFs/playback.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fishaudio/OpenUtau/72e8339f25331e5aa09dff18dd44550efbb71579/Misc/GIFs/playback.gif
--------------------------------------------------------------------------------
/Misc/GIFs/undo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fishaudio/OpenUtau/72e8339f25331e5aa09dff18dd44550efbb71579/Misc/GIFs/undo.gif
--------------------------------------------------------------------------------
/Misc/GIFs/vibrato.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fishaudio/OpenUtau/72e8339f25331e5aa09dff18dd44550efbb71579/Misc/GIFs/vibrato.gif
--------------------------------------------------------------------------------
/OpenUtau.Core/Analysis/Crepe/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2018 Jong Wook Kim
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/OpenUtau.Core/Analysis/Crepe/tiny.onnx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fishaudio/OpenUtau/72e8339f25331e5aa09dff18dd44550efbb71579/OpenUtau.Core/Analysis/Crepe/tiny.onnx
--------------------------------------------------------------------------------
/OpenUtau.Core/Api/G2pDictionaryData.cs:
--------------------------------------------------------------------------------
1 | namespace OpenUtau.Api {
2 | ///
3 | /// Data class used to deserialize yaml dictionary.
4 | ///
5 | public class G2pDictionaryData {
6 | public struct SymbolData {
7 | public string symbol;
8 | public string type;
9 | }
10 |
11 | public struct Entry {
12 | public string grapheme;
13 | public string[] phonemes;
14 | }
15 |
16 | public SymbolData[] symbols;
17 | public Entry[] entries;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Api/G2pFallbacks.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace OpenUtau.Api {
3 | public class G2pFallbacks : IG2p {
4 | IG2p[] dictionaries;
5 |
6 | public G2pFallbacks(IG2p[] dictionaries) {
7 | this.dictionaries = dictionaries;
8 | }
9 |
10 | public bool IsValidSymbol(string symbol) {
11 | foreach (var dict in dictionaries) {
12 | if (dict.IsValidSymbol(symbol)) {
13 | return true;
14 | }
15 | }
16 | return false;
17 | }
18 |
19 | public bool IsVowel(string symbol) {
20 | foreach (var dict in dictionaries) {
21 | if (dict.IsValidSymbol(symbol)) {
22 | return dict.IsVowel(symbol);
23 | }
24 | }
25 | return false;
26 | }
27 |
28 | public string[] Query(string grapheme) {
29 | foreach (var dict in dictionaries) {
30 | var result = dict.Query(grapheme);
31 | if (result != null) {
32 | return result;
33 | }
34 | }
35 | return null;
36 | }
37 |
38 | public string[] UnpackHint(string hint, char separator = ' ') {
39 | foreach (var dict in dictionaries) {
40 | var result = dict.UnpackHint(hint, separator);
41 | if (result != null) {
42 | return result;
43 | }
44 | }
45 | return null;
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Api/G2pRemapper.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Linq;
3 |
4 | namespace OpenUtau.Api {
5 | public class G2pRemapper : IG2p {
6 | private IG2p mapped;
7 | private Dictionary phonemeSymbols; // (phoneme, isVowel)
8 | private Dictionary replacements;
9 |
10 | public G2pRemapper(IG2p mapped,
11 | Dictionary phonemeSymbols,
12 | Dictionary replacements) {
13 | this.mapped = mapped;
14 | this.phonemeSymbols = phonemeSymbols;
15 | this.replacements = replacements;
16 | }
17 |
18 | public bool IsValidSymbol(string symbol) {
19 | return phonemeSymbols.ContainsKey(symbol);
20 | }
21 |
22 | public bool IsVowel(string symbol) {
23 | return phonemeSymbols.TryGetValue(symbol, out var isVowel) && isVowel;
24 | }
25 |
26 | public string[] Query(string grapheme) {
27 | var phonemes = mapped.Query(grapheme);
28 | if (phonemes == null) {
29 | return null;
30 | }
31 | phonemes = phonemes.Clone() as string[];
32 | for (int i = 0; i < phonemes.Length; ++i) {
33 | if (replacements.TryGetValue(phonemes[i], out var replacement)) {
34 | phonemes[i] = replacement;
35 | }
36 | }
37 | return phonemes;
38 | }
39 |
40 | public string[] UnpackHint(string hint, char separator = ' ') {
41 | return hint.Split(separator)
42 | .Where(s => phonemeSymbols.ContainsKey(s))
43 | .ToArray();
44 | }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Api/IG2p.cs:
--------------------------------------------------------------------------------
1 | namespace OpenUtau.Api {
2 | public interface IG2p {
3 | bool IsValidSymbol(string symbol);
4 | bool IsVowel(string symbol);
5 |
6 | ///
7 | /// Produces a list of phonemes from grapheme.
8 | ///
9 | string[] Query(string grapheme);
10 |
11 | ///
12 | /// Produces a list of phonemes from hint, removing invalid symbols.
13 | ///
14 | string[] UnpackHint(string hint, char separator = ' ');
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Api/PhonemizerFactory.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Reflection;
4 |
5 | namespace OpenUtau.Api {
6 | public class PhonemizerFactory {
7 | public Type type;
8 | public string name;
9 | public string tag;
10 | public string author;
11 | public string language;
12 |
13 | public Phonemizer Create() {
14 | var phonemizer = Activator.CreateInstance(type) as Phonemizer;
15 | phonemizer.Name = name;
16 | phonemizer.Tag = tag;
17 | phonemizer.Language = language;
18 | return phonemizer;
19 | }
20 |
21 | public override string ToString() => string.IsNullOrEmpty(author)
22 | ? $"[{tag}] {name}"
23 | : $"[{tag}] {name} (Contributed by {author})";
24 |
25 | private static Dictionary factories = new Dictionary();
26 | public static PhonemizerFactory Get(Type type) {
27 | if (!factories.TryGetValue(type, out var factory)) {
28 | var attr = type.GetCustomAttribute();
29 | if (attr == null || string.IsNullOrEmpty(attr.Name) || string.IsNullOrEmpty(attr.Tag)) {
30 | return null;
31 | }
32 | factory = new PhonemizerFactory() {
33 | type = type,
34 | name = attr.Name,
35 | tag = attr.Tag,
36 | author = attr.Author,
37 | language = attr.Language,
38 | };
39 | factories[type] = factory;
40 | }
41 | return factory;
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Api/README.md:
--------------------------------------------------------------------------------
1 | # OpenUtau API
2 |
3 | API for OpenUtau plugin development. They are also used in OpenUtau.Plugin.Builtin project. You can refer to them as example.
4 |
5 | ## Phonemizer
6 |
7 | Experimental. Subject to change. Feedback welcomed.
8 |
9 | API documented in:
10 | - [Phonemizer.cs](Phonemizer.cs)
11 |
12 | Heavily commented example implementations, from simplest to most complex:
13 | - [DefaultPhonemizer.cs](../DefaultPhonemizer.cs)
14 | - [JapaneseVCVPhonemizer.cs](../../OpenUtau.Plugin.Builtin/JapaneseVCVPhonemizer.cs)
15 | - [ChineseCVVPhonemizer.cs](../../OpenUtau.Plugin.Builtin/ChineseCVVPhonemizer.cs)
16 | - [ArpasingPhonemizer.cs](../../OpenUtau.Plugin.Builtin/ArpasingPhonemizer.cs)
17 |
18 | The main method to implement is:
19 | ```
20 | public abstract Phoneme[] Process(Note[] notes, Note? prevNeighbour, Note? nextNeighbour);
21 | ```
22 | `notes`: A group of notes. The first note contains the lyric. The rest are extender notes with lyric "+" or "+n" (n is a number).
23 | `prevNeighbour` and `nextNeighbour`: Useful info for creating diphones, if applicable. E.g., creating proper leading diphone in VCV.
24 | `returns`: An array of phonemes, positioned relative to the first note.
25 | For actual document read comments in [Phonemizer.cs](Phonemizer.cs).
26 |
27 | A complete Phonemizer should:
28 | 1. Produce phonemes (or diphones) from the lyric, and previous / next notes if exsit.
29 | 2. Distribute phonemes to positions relative to the first note.
30 | 3. Supports phonetic hinting, e.g., lyric like "read", "read[r iy d]" or "[r iy d]".
31 | 4. Supports extender note aligments if the language is multisyllabic, i.e., "+n" notes.
32 |
33 | Tips:
34 | - To load singer specific resouce, Implement resouce loading in SetSinger() and use singer.Location to look for files.
35 | - If uses expensive resource, load it lazily when the phonemizer is created the first time. Use your best adjudgement to decide its lifetime.
36 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Audio/AudioDevice.cs:
--------------------------------------------------------------------------------
1 | using OpenUtau.Audio.Bindings;
2 |
3 | namespace OpenUtau.Audio {
4 | readonly struct AudioDevice {
5 | public int DeviceIndex { get; }
6 | public string Name { get; }
7 | public string HostApi { get; }
8 | public int MaxInputChannels { get; }
9 | public int MaxOutputChannels { get; }
10 | public double DefaultLowInputLatency { get; }
11 | public double DefaultLowOutputLatency { get; }
12 | public double DefaultHighInputLatency { get; }
13 | public double DefaultHighOutputLatency { get; }
14 | public int DefaultSampleRate { get; }
15 | public AudioDevice(PaBinding.PaDeviceInfo device, int deviceIndex) {
16 | var hostApi = PaBinding.GetHostApiInfo(device.hostApi);
17 | DeviceIndex = deviceIndex;
18 | Name = device.name;
19 | HostApi = hostApi.name;
20 | MaxInputChannels = device.maxInputChannels;
21 | MaxOutputChannels = device.maxOutputChannels;
22 | DefaultLowInputLatency = device.defaultLowInputLatency;
23 | DefaultLowOutputLatency = device.defaultLowOutputLatency;
24 | DefaultHighInputLatency = device.defaultHighInputLatency;
25 | DefaultHighOutputLatency = device.defaultHighOutputLatency;
26 | DefaultSampleRate = (int)device.defaultSampleRate;
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Audio/AudioFrame.cs:
--------------------------------------------------------------------------------
1 | namespace OpenUtau.Audio {
2 | public sealed class AudioFrame {
3 | public AudioFrame(double presentationTime, float[] data) {
4 | PresentationTime = presentationTime;
5 | Data = data;
6 | }
7 | public double PresentationTime { get; }
8 | public float[] Data { get; }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Audio/AudioStreamInfo.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace OpenUtau.Audio {
4 | public readonly struct AudioStreamInfo {
5 | public AudioStreamInfo(int channels, int sampleRate, TimeSpan duration) {
6 | Channels = channels;
7 | SampleRate = sampleRate;
8 | Duration = duration;
9 | }
10 | public int Channels { get; }
11 | public int SampleRate { get; }
12 | public TimeSpan Duration { get; }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Audio/Bindings/PaBinding.Enums.cs:
--------------------------------------------------------------------------------
1 | namespace OpenUtau.Audio.Bindings {
2 | internal static partial class PaBinding {
3 | public enum PaSampleFormat : long {
4 | paFloat32 = 0x00000001,
5 | paInt32 = 0x00000002,
6 | paInt24 = 0x00000004,
7 | paInt16 = 0x00000008,
8 | paInt8 = 0x00000010,
9 | paUInt8 = 0x00000020,
10 | paCustomFormat = 0x00010000,
11 | paNonInterleaved = 0x80000000,
12 | }
13 |
14 | public enum PaStreamCallbackFlags : long {
15 | paInputUnderflow = 0x00000001,
16 | paInputOverflow = 0x00000002,
17 | paOutputUnderflow = 0x00000004,
18 | paOutputOverflow = 0x00000008,
19 | paPrimingOutput = 0x00000010
20 | }
21 |
22 | public enum PaStreamCallbackResult {
23 | paContinue = 0,
24 | paComplete = 1,
25 | paAbort = 2
26 | }
27 |
28 | public enum PaStreamFlags : long {
29 | paNoFlag = 0,
30 | paClipOff = 0x00000001,
31 | paDitherOff = 0x00000002,
32 | paPrimeOutputBuffersUsingStreamCallback = 0x00000008,
33 | paPlatformSpecificFlags = 0xFFFF0000
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Audio/Bindings/PaBinding.Structs.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Runtime.InteropServices;
3 |
4 | namespace OpenUtau.Audio.Bindings {
5 | internal static partial class PaBinding {
6 | [StructLayout(LayoutKind.Sequential)]
7 | public readonly struct PaVersionInfo {
8 | public readonly int versionMajor;
9 | public readonly int versionMinor;
10 | public readonly int versionSubMinor;
11 |
12 | [MarshalAs(UnmanagedType.LPStr)]
13 | public readonly string versionControlRevision;
14 |
15 | [MarshalAs(UnmanagedType.LPStr)]
16 | public readonly string verionText;
17 | }
18 |
19 | [StructLayout(LayoutKind.Sequential)]
20 | public struct PaStreamParameters {
21 | public int device;
22 | public int channelCount;
23 | public PaSampleFormat sampleFormat;
24 | public double suggestedLatency;
25 | public IntPtr hostApiSpecificStreamInfo;
26 | }
27 |
28 | [StructLayout(LayoutKind.Sequential)]
29 | public readonly struct PaDeviceInfo {
30 | public readonly int structVersion;
31 |
32 | [MarshalAs(UnmanagedType.LPUTF8Str)]
33 | public readonly string name;
34 |
35 | public readonly int hostApi;
36 | public readonly int maxInputChannels;
37 | public readonly int maxOutputChannels;
38 | public readonly double defaultLowInputLatency;
39 | public readonly double defaultLowOutputLatency;
40 | public readonly double defaultHighInputLatency;
41 | public readonly double defaultHighOutputLatency;
42 | public readonly double defaultSampleRate;
43 | }
44 |
45 | [StructLayout(LayoutKind.Sequential)]
46 | public readonly struct PaHostApiInfo {
47 | public readonly int structVersion;
48 |
49 | public readonly int type;
50 |
51 | [MarshalAs(UnmanagedType.LPStr)]
52 | public readonly string name;
53 |
54 | public readonly int deviceCount;
55 | public readonly int defaultInputDevice;
56 | public readonly int defaultOutputDevice;
57 | }
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Audio/Bindings/PaBinding.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Runtime.InteropServices;
3 |
4 | namespace OpenUtau.Audio.Bindings {
5 | internal static partial class PaBinding {
6 | public static string GetErrorText(int code) => Marshal.PtrToStringAnsi(Pa_GetErrorText(code));
7 |
8 | public static void MaybeThrow(int code) {
9 | if (code >= 0) {
10 | return;
11 | }
12 | throw new Exception(Marshal.PtrToStringAnsi(Pa_GetErrorText(code)));
13 | }
14 |
15 | public static PaDeviceInfo GetDeviceInfo(int device) => Marshal.PtrToStructure(Pa_GetDeviceInfo(device));
16 | public static PaHostApiInfo GetHostApiInfo(int hostApi) => Marshal.PtrToStructure(Pa_GetHostApiInfo(hostApi));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Audio/DummyAudioOutput.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using NAudio.Wave;
4 |
5 | namespace OpenUtau.Audio {
6 | public class DummyAudioOutput : IAudioOutput {
7 | public PlaybackState PlaybackState => PlaybackState.Stopped;
8 | public int DeviceNumber => 0;
9 | public List GetOutputDevices() => new List();
10 | public long GetPosition() => 0;
11 | public void Init(ISampleProvider sampleProvider) { }
12 | public void Pause() { }
13 | public void Play() { }
14 | public void SelectDevice(Guid guid, int deviceNumber) { }
15 | public void Stop() { }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Audio/IAudioOutput.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using NAudio.Wave;
4 |
5 | namespace OpenUtau.Audio {
6 | public class AudioOutputDevice {
7 | public string name;
8 | public string api;
9 | public int deviceNumber;
10 | public Guid guid;
11 | public object data;
12 |
13 | public override string ToString() => $"[{api}] {name}";
14 | }
15 |
16 | public interface IAudioOutput {
17 | PlaybackState PlaybackState { get; }
18 | int DeviceNumber { get; }
19 |
20 | void SelectDevice(Guid guid, int deviceNumber);
21 | void Init(ISampleProvider sampleProvider);
22 | void Pause();
23 | void Play();
24 | void Stop();
25 | long GetPosition();
26 |
27 | List GetOutputDevices();
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/OpenUtau.Core/BaseChinesePhonemizer.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using OpenUtau.Api;
6 | using ToolGood.Words.Pinyin;
7 |
8 | namespace OpenUtau.Core {
9 | public abstract class BaseChinesePhonemizer : Phonemizer {
10 | public static bool IsHanzi(string lyric) {
11 | return lyric.Length == 1 && WordsHelper.IsAllChinese(lyric);
12 | }
13 |
14 | public static Note[] ChangeLyric(Note[] group, string lyric) {
15 | var oldNote = group[0];
16 | group[0] = new Note {
17 | lyric = lyric,
18 | phoneticHint = oldNote.phoneticHint,
19 | tone = oldNote.tone,
20 | position = oldNote.position,
21 | duration = oldNote.duration,
22 | phonemeAttributes = oldNote.phonemeAttributes,
23 | };
24 | return group;
25 | }
26 |
27 | public static string[] Romanize(IEnumerable lyrics) {
28 | var lyricsArray = lyrics.ToArray();
29 | var hanziLyrics = String.Join("", lyricsArray
30 | .Where(IsHanzi));
31 | var pinyinResult = WordsHelper.GetPinyin(hanziLyrics, " ").ToLower().Split();
32 | var pinyinIndex = 0;
33 | for(int i=0; i < lyricsArray.Length; i++) {
34 | if (lyricsArray[i].Length == 1 && WordsHelper.IsAllChinese(lyricsArray[i])) {
35 | lyricsArray[i] = pinyinResult[pinyinIndex];
36 | pinyinIndex++;
37 | }
38 | }
39 | return lyricsArray;
40 | }
41 |
42 | public static void RomanizeNotes(Note[][] groups) {
43 | var ResultLyrics = Romanize(groups.Select(group => group[0].lyric));
44 | Enumerable.Zip(groups, ResultLyrics, ChangeLyric).Last();
45 | }
46 |
47 | public override void SetUp(Note[][] groups) {
48 | RomanizeNotes(groups);
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Classic/ClassicSingerLoader.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Linq;
3 | using OpenUtau.Core;
4 | using OpenUtau.Core.Ustx;
5 |
6 | namespace OpenUtau.Classic {
7 | public static class ClassicSingerLoader {
8 | static USinger AdjustSingerType(Voicebank v) {
9 | switch (v.SingerType) {
10 | case USingerType.Enunu:
11 | return new Core.Enunu.EnunuSinger(v) as USinger;
12 | case USingerType.DiffSinger:
13 | return new Core.DiffSinger.DiffSingerSinger(v) as USinger;
14 | default:
15 | return new ClassicSinger(v) as USinger;
16 | }
17 | }
18 | public static IEnumerable FindAllSingers() {
19 | List singers = new List();
20 | foreach (var path in new string[] {
21 | PathManager.Inst.SingersPathOld,
22 | PathManager.Inst.SingersPath,
23 | PathManager.Inst.AdditionalSingersPath,
24 | }) {
25 | var loader = new VoicebankLoader(path);
26 | singers.AddRange(loader.SearchAll()
27 | .Select(AdjustSingerType));
28 | }
29 | return singers;
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Classic/IPlugin.cs:
--------------------------------------------------------------------------------
1 | namespace OpenUtau.Classic {
2 | public interface IPlugin {
3 | string Encoding { get; }
4 | void Run(string tempFile);
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Classic/IResampler.cs:
--------------------------------------------------------------------------------
1 | using OpenUtau.Core.Ustx;
2 | using Serilog;
3 |
4 | namespace OpenUtau.Classic {
5 | public interface IResampler {
6 | string FilePath { get; }
7 | float[] DoResampler(ResamplerItem args, ILogger logger);
8 | string DoResamplerReturnsFile(ResamplerItem args, ILogger logger);
9 | void CheckPermissions();
10 | ResamplerManifest Manifest { get; }
11 | bool SupportsFlag(string abbr);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/OpenUtau.Core/Classic/IWavtool.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading;
3 |
4 | namespace OpenUtau.Classic {
5 | public interface IWavtool {
6 | //