Skip to content

Commit

Permalink
The goodlearner speaks. Not really good, not really bad... The phaser…
Browse files Browse the repository at this point in the history
… needs more work.
  • Loading branch information
MiklosPathy committed Oct 13, 2019
1 parent 79847a6 commit a624f33
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 16 deletions.
61 changes: 46 additions & 15 deletions GoodLearner/Eminent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,15 @@ class Eminent : Zplusnthbase
private int phaser_delay;
public int Phaser_Delay { get { return phaser_delay; } set { phaser_delay = value; NotifyPropertyChanged(); } }


private readonly double[] Phase = new double[maxPolyPhony];

private double[] phaserbuffer;
int phaserphase = 0;
double phaserlfophase = 0;

public Waveform CurrentOption { get; set; }

public Eminent()
{
phaserbuffer = new double[echobuffersize];
Expand All @@ -31,7 +36,7 @@ public Eminent()

protected override void SavePresets()
{
throw new NotImplementedException();
//throw new NotImplementedException();
}

protected override void GetPreset(int presetnum)
Expand All @@ -56,21 +61,47 @@ private int limitechophase(int phase)

public override int Read(short[] buffer, int offset, int sampleCount)
{
double currentsamplevalue = 0;

#region Phaser
phaserlfophase += 2 * Math.PI / WaveFormat.SampleRate * Phaser_Freq / 100;
if (phaserlfophase > 2 * Math.PI) phaserlfophase -= 2 * Math.PI;
int phaser = (int)Math.Round((Math.Sin(phaserlfophase) * WaveFormat.SampleRate / Phaser_Delay) + WaveFormat.SampleRate / Phaser_Delay / 2); //0-50 ms delay
//currentsamplevalue = currentsamplevalue + phaserbuffer[limitechophase(phaserphase - phaser)] * ((double)Phaser_Mix_Rate / 100);
//phaserbuffer[phaserphase] = phaserbuffer[phaserphase] + currentsamplevalue * (double)Phaser_Feedback_Rate / 100 / 2;
phaserbuffer[phaserphase] = currentsamplevalue;
currentsamplevalue = currentsamplevalue + phaserbuffer[limitechophase(phaserphase - phaser)] * ((double)Phaser_Mix_Rate / 100);
phaserphase++;
phaserphase = limitechophase(phaserphase);
#endregion Phaser
for (int sample = 0; sample < sampleCount; sample++)
{
double currentsamplevalue = 0;

throw new NotImplementedException();
for (int channel = 0; channel < CurrentPolyphony; channel++)
{
if (Channels[channel].State == ChannelState.KeyOn) Phase[channel] = 0;
if (Channels[channel].State == ChannelState.KeyOn || Channels[channel].State == ChannelState.ReKeyOn) Channels[channel].State = ChannelState.Active;
if (Channels[channel].State == ChannelState.Active || Channels[channel].State == ChannelState.KeyOff)
{
double commonsinpart = 2 * Math.PI / WaveFormat.SampleRate * (Channels[channel].Freq + Bending);
Phase[channel] += commonsinpart;
Z_nthCommon.Phase.Waveformswitcher(CurrentOption, Phase[channel], ref currentsamplevalue);
}
if (Channels[channel].State == ChannelState.KeyOff)
{
if (Phase[channel] > 2 * Math.PI) Channels[channel].State = ChannelState.Inactive;
}
if (Phase[channel] > 2 * Math.PI) Phase[channel] -= 2 * Math.PI;
}
currentsamplevalue = currentsamplevalue / CurrentPolyphony;


#region Phaser
phaserlfophase += 2 * Math.PI / WaveFormat.SampleRate * Phaser_Freq / 100;
if (phaserlfophase > 2 * Math.PI) phaserlfophase -= 2 * Math.PI;
int phaser = (int)Math.Round((Math.Sin(phaserlfophase) * WaveFormat.SampleRate / Phaser_Delay) + WaveFormat.SampleRate / Phaser_Delay / 2); //0-50 ms delay
//currentsamplevalue = currentsamplevalue + phaserbuffer[limitechophase(phaserphase - phaser)] * ((double)Phaser_Mix_Rate / 100);
//phaserbuffer[phaserphase] = phaserbuffer[phaserphase] + currentsamplevalue * (double)Phaser_Feedback_Rate / 100 / 2;
phaserbuffer[phaserphase] = currentsamplevalue;
currentsamplevalue = currentsamplevalue + phaserbuffer[limitechophase(phaserphase - phaser)] * ((double)Phaser_Mix_Rate / 100);
phaserphase++;
phaserphase = limitechophase(phaserphase);
#endregion Phaser

//Filter.Process(ref currentsamplevalue);
//Echo.Process(ref currentsamplevalue);
buffer[sample + offset] = OutLimiter(ref currentsamplevalue);
}

return sampleCount;
}
}
}
98 changes: 97 additions & 1 deletion GoodLearner/MainWindow.xaml
Original file line number Diff line number Diff line change
@@ -1,16 +1,112 @@
<Window x:Class="GoodLearner.MainWindow"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:GoodLearner"
xmlns:Z_nthCommon="clr-namespace:Z_nthCommon;assembly=Z+nthCommon" x:Class="GoodLearner.MainWindow"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<Z_nthCommon:EnumMatchToBooleanConverter x:Key="enumConverter" />
</Window.Resources>
<Grid>
<Slider x:Name="slider_Phaser_Mix_Rate" Value="{Binding Phaser_Mix_Rate, Mode=TwoWay}" HorizontalAlignment="Left" Height="148" Margin="530,10,0,0" VerticalAlignment="Top" Width="20" Orientation="Vertical" Maximum="100"/>
<Slider x:Name="slider_Phaser_Freq" Value="{Binding Phaser_Freq, Mode=TwoWay}" HorizontalAlignment="Left" Height="148" Margin="555,10,0,0" VerticalAlignment="Top" Width="20" Orientation="Vertical" Maximum="100"/>
<Slider x:Name="slider_Phaser_Feedback_Rate" Value="{Binding Phaser_Feedback_Rate, Mode=TwoWay}" HorizontalAlignment="Left" Height="148" Margin="580,10,0,0" VerticalAlignment="Top" Width="20" Orientation="Vertical" Maximum="100"/>
<Slider x:Name="slider_Phaser_Delay" Value="{Binding Phaser_Delay, Mode=TwoWay}" HorizontalAlignment="Left" Height="148" Margin="605,10,0,0" VerticalAlignment="Top" Width="20" Orientation="Vertical" Maximum="100" Minimum="1"/>
<Slider x:Name="slider_Bending" Value="{Binding Bending}" HorizontalAlignment="Left" Margin="10,391,0,0" VerticalAlignment="Top" Width="772" Maximum="200" Minimum="-200" SmallChange="1" Thumb.DragCompleted="slider_Bending_DragCompleted"/>
<Slider x:Name="slider_Latency" Value="{Binding DesiredLatency, Mode=TwoWay}" HorizontalAlignment="Left" Height="148" Margin="10,10,0,0" VerticalAlignment="Top" Width="20" Orientation="Vertical" Maximum="200" Minimum="10"/>
<Slider x:Name="slider_Polyphony" Value="{Binding CurrentPolyphony, Mode=TwoWay}" HorizontalAlignment="Left" Height="148" Margin="35,10,0,0" VerticalAlignment="Top" Width="20" Orientation="Vertical" Minimum="1"/>
<Label x:Name="label_Copy" Content="Latency" HorizontalAlignment="Left" Margin="-22,136,0,0" VerticalAlignment="Top" Height="26" RenderTransformOrigin="1.054,0.904">
<Label.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-90"/>
<TranslateTransform/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Label x:Name="label_Copy1" Content="Polyphony" HorizontalAlignment="Left" Margin="-10,135,0,0" VerticalAlignment="Top" Height="26" RenderTransformOrigin="1.054,0.904">
<Label.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-90"/>
<TranslateTransform/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Slider x:Name="slider_Transpose" Value="{Binding Transpose, Mode=TwoWay}" HorizontalAlignment="Left" Height="148" Margin="60,10,0,0" VerticalAlignment="Top" Width="20" Orientation="Vertical" Minimum="-2" Maximum="2" SmallChange="1"/>
<Label x:Name="label_Transpose" Content="Transpose" HorizontalAlignment="Left" Margin="13,136,0,0" VerticalAlignment="Top" Height="26" RenderTransformOrigin="1.054,0.904">
<Label.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-90"/>
<TranslateTransform/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Label x:Name="label_Count" Content="Mix rate" HorizontalAlignment="Left" Margin="493,144,0,0" VerticalAlignment="Top" Height="26" RenderTransformOrigin="1.054,0.904">
<Label.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-90"/>
<TranslateTransform/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Label x:Name="label_Count_Copy" Content="Freq" HorizontalAlignment="Left" Margin="540,147,0,0" VerticalAlignment="Top" Height="26" RenderTransformOrigin="1.054,0.904">
<Label.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-90"/>
<TranslateTransform/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Label x:Name="label_Count_Copy1" Content="Feedback rate" HorizontalAlignment="Left" Margin="510,146,0,0" VerticalAlignment="Top" Height="26" RenderTransformOrigin="1.054,0.904">
<Label.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-90"/>
<TranslateTransform/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Label x:Name="label_Count_Copy2" Content="Delay" HorizontalAlignment="Left" Margin="582,145,0,0" VerticalAlignment="Top" Height="26" RenderTransformOrigin="1.054,0.904">
<Label.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-90"/>
<TranslateTransform/>
</TransformGroup>
</Label.RenderTransform>
</Label>

<RadioButton Content="Sine" HorizontalAlignment="Left" Height="18" Margin="228,24,0,0" VerticalAlignment="Top" Width="90"
GroupName="Waveform"
IsChecked="{Binding CurrentOption, ConverterParameter=Sine, Converter={StaticResource enumConverter}, Mode=TwoWay}"
/>

<RadioButton Content="Square" HorizontalAlignment="Left" Height="18" Margin="228,78,0,0" VerticalAlignment="Top" Width="90"
GroupName="Waveform"
IsChecked="{Binding CurrentOption, ConverterParameter=Square, Converter={StaticResource enumConverter}, Mode=TwoWay}"
/>
<RadioButton Content="Saw" HorizontalAlignment="Left" Height="18" Margin="228,60,0,0" VerticalAlignment="Top" Width="90"
GroupName="Waveform"
IsChecked="{Binding CurrentOption, ConverterParameter=Saw, Converter={StaticResource enumConverter}, Mode=TwoWay}"
/>
<RadioButton Content="Triangle" HorizontalAlignment="Left" Height="18" Margin="228,42,0,0" VerticalAlignment="Top" Width="90"
GroupName="Waveform"
IsChecked="{Binding CurrentOption, ConverterParameter=Triangle, Converter={StaticResource enumConverter}, Mode=TwoWay}"
/>

</Grid>
</Window>
13 changes: 13 additions & 0 deletions GoodLearner/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,22 @@ namespace GoodLearner
/// </summary>
public partial class MainWindow : Window
{
private Eminent synth = new Eminent();

public MainWindow()
{
synth.LoadState();
//synth.LoadPresets();
DataContext = synth;
Closing += synth.Window_Closed;
KeyDown += synth.Window_KeyDown;
KeyUp += synth.Window_KeyUp;
InitializeComponent();
}

private void slider_Bending_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
slider_Bending.Value = 0;
}
}
}

0 comments on commit a624f33

Please sign in to comment.