├── FMX_Tone_Test.res ├── Images ├── FMX_Tone_Beep.png └── FMX_Tone_WaveChart.png ├── FMX_Tone_Test.dpr ├── README.md ├── FMX_OpenURL.pas ├── LICENSE ├── FMX_Tone_Chart.fmx ├── .gitignore ├── FMX_Tone_Chart.pas ├── AndroidManifest.template.xml ├── Unit_Tone_Test.pas ├── Unit_Tone_Test.fmx ├── FMX_Tone.pas ├── FMX_Tone_Test.deployproj └── FMX_Tone_Test.dproj /FMX_Tone_Test.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidberneda/FMX_Tone_Beep/HEAD/FMX_Tone_Test.res -------------------------------------------------------------------------------- /Images/FMX_Tone_Beep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidberneda/FMX_Tone_Beep/HEAD/Images/FMX_Tone_Beep.png -------------------------------------------------------------------------------- /Images/FMX_Tone_WaveChart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidberneda/FMX_Tone_Beep/HEAD/Images/FMX_Tone_WaveChart.png -------------------------------------------------------------------------------- /FMX_Tone_Test.dpr: -------------------------------------------------------------------------------- 1 | program FMX_Tone_Test; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | Unit_Tone_Test in 'Unit_Tone_Test.pas' {ToneDemo}, 7 | FMX_Tone in 'FMX_Tone.pas', 8 | FMX_OpenURL in 'FMX_OpenURL.pas'; 9 | 10 | {$R *.res} 11 | 12 | begin 13 | {$IFOPT D+} 14 | ReportMemoryLeaksOnShutdown:=True; 15 | {$ENDIF} 16 | Application.Initialize; 17 | Application.CreateForm(TToneDemo, ToneDemo); 18 | Application.Run; 19 | end. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FMX_Tone_Beep 2 | Delphi multi-platform Firemonkey FMX Beep Tone, for Windows and Android 3 | 4 | 5 | Play a "Beep", with optional Hertz frequency and duration. 6 | 7 | ```delphi 8 | TTone.Play(440, 1000) // <--- "La" note, 1 second. 9 | 10 | TTone.Beep(200) // Standard "beep" sound, 200 milliseconds 11 | ``` 12 | 13 | 14 | ![FMX Tone Beep](Images/FMX_Tone_Beep.png "FMX Tone Beep Test Demo") 15 | 16 | ![Wave Chart](Images/FMX_Tone_WaveChart.png "Wave TeeChart") 17 | 18 | 19 | -------------------------------------------------------------------------------- /FMX_OpenURL.pas: -------------------------------------------------------------------------------- 1 | unit FMX_OpenURL; 2 | 3 | interface 4 | 5 | type 6 | TOpenURL=class 7 | class procedure Go(const URL:String); 8 | end; 9 | 10 | implementation 11 | 12 | uses 13 | {$IFDEF POSIX} 14 | Posix.Stdlib; 15 | {$ENDIF} 16 | 17 | {$IFDEF MSWINDOWS} 18 | Winapi.Windows, 19 | Winapi.ShellAPI; 20 | {$ENDIF} 21 | 22 | class procedure TOpenURL.Go(const URL: string); 23 | begin 24 | {$IFDEF ANDROID} 25 | { 26 | tmpIntent:=TJIntent.Create; 27 | tmpIntent.setAction(TJIntent.JavaClass.ACTION_VIEW); 28 | tmpIntent.setData(TJnet_Uri.JavaClass.parse(StringToJString(URL))); 29 | MainActivity.startActivity(tmpIntent); 30 | Exit; 31 | } 32 | {$ENDIF} 33 | 34 | {$IFDEF POSIX} 35 | _system(PAnsiChar('open '+AnsiString(URL))); 36 | {$ENDIF} 37 | 38 | {$IFDEF MSWINDOWS} 39 | ShellExecute(0,'OPEN',PChar(URL),'','',SW_SHOWNORMAL); 40 | {$ENDIF} 41 | end; 42 | 43 | end. 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /FMX_Tone_Chart.fmx: -------------------------------------------------------------------------------- 1 | object FormChart: TFormChart 2 | Left = 0 3 | Top = 0 4 | Caption = 'Sound Wave Chart' 5 | ClientHeight = 472 6 | ClientWidth = 797 7 | Position = ScreenCenter 8 | FormFactor.Width = 320 9 | FormFactor.Height = 480 10 | FormFactor.Devices = [Desktop] 11 | DesignerMasterStyle = 0 12 | object Chart1: TChart 13 | Foot.Font.StyleExt = {00040000000200000004000000} 14 | Legend.Title.Font.StyleExt = {00070000000000000004000000} 15 | Legend.Visible = False 16 | SubFoot.Font.StyleExt = {00040000000200000004000000} 17 | Title.Text.Strings = ( 18 | 'TChart') 19 | BottomAxis.Title.Caption = 'Sample' 20 | View3D = False 21 | Zoom.Brush.Kind = None 22 | Zoom.Pen.Fill.Color = claSilver 23 | Align = Client 24 | TabOrder = 1 25 | Size.Width = 797.000000000000000000 26 | Size.Height = 422.000000000000000000 27 | Size.PlatformDefault = False 28 | ColorPaletteIndex = 1 29 | object Series1: TFastLineSeries 30 | HoverElement = [] 31 | LinePen.Color = xFF9999FF 32 | LinePen.Fill.Color = xFF9999FF 33 | XValues.Name = 'X' 34 | XValues.Order = loAscending 35 | YValues.Name = 'Y' 36 | YValues.Order = loNone 37 | end 38 | end 39 | object Layout1: TLayout 40 | Align = Top 41 | Size.Width = 797.000000000000000000 42 | Size.Height = 50.000000000000000000 43 | Size.PlatformDefault = False 44 | TabOrder = 3 45 | object Button1: TButton 46 | Position.X = 14.000000000000000000 47 | Position.Y = 12.000000000000000000 48 | TabOrder = 0 49 | Text = '&Play' 50 | OnClick = Button1Click 51 | end 52 | end 53 | end 54 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | *.~* 64 | 65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 66 | *.stat 67 | 68 | # Boss dependency manager vendor folder https://github.com/HashLoad/boss 69 | modules/ 70 | Android/ 71 | Android64/ 72 | Linux64/ 73 | -------------------------------------------------------------------------------- /FMX_Tone_Chart.pas: -------------------------------------------------------------------------------- 1 | unit FMX_Tone_Chart; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMXTee.Engine, 8 | FMXTee.Series, FMXTee.Procs, FMXTee.Chart, FMX.Controls.Presentation, 9 | FMX.StdCtrls, FMX.Layouts; 10 | 11 | type 12 | TFormChart = class(TForm) 13 | Chart1: TChart; 14 | Series1: TFastLineSeries; 15 | Layout1: TLayout; 16 | Button1: TButton; 17 | procedure Button1Click(Sender: TObject); 18 | private 19 | { Private declarations } 20 | 21 | Samples : TArray; 22 | 23 | procedure AddSamples; 24 | public 25 | { Public declarations } 26 | class procedure Edit(const AOwner:TComponent; 27 | const AFrequency:Single; 28 | const ADuration:Integer); static; 29 | end; 30 | 31 | implementation 32 | 33 | {$R *.fmx} 34 | 35 | uses 36 | FMX_Tone; 37 | 38 | { TFormChart } 39 | 40 | procedure TFormChart.Button1Click(Sender: TObject); 41 | begin 42 | TTone.Play(Samples); 43 | end; 44 | 45 | class procedure TFormChart.Edit(const AOwner:TComponent; 46 | const AFrequency: Single; 47 | const ADuration: Integer); 48 | begin 49 | with TFormChart.Create(nil) do 50 | try 51 | Samples:=TTone.GenerateSamples(AFrequency,ADuration); 52 | 53 | Chart1.Title.Caption:='Frequency: '+FloatToStr(AFrequency)+ 54 | ' Hz. Duration: '+ADuration.ToString+' msec.'; 55 | 56 | AddSamples; 57 | 58 | Chart1.Axes.Left.SetMinMax(-2,2); 59 | 60 | ShowModal(procedure(Modal:TModalResult) 61 | begin 62 | end); 63 | finally 64 | {$IFDEF MSWINDOWS} 65 | Free; 66 | {$ENDIF} 67 | end; 68 | end; 69 | 70 | procedure TFormChart.AddSamples; 71 | var t : Integer; 72 | begin 73 | Series1.BeginUpdate; 74 | try 75 | Series1.Clear; 76 | 77 | for t:=0 to High(Samples) do 78 | Series1.Add(Samples[t]); 79 | finally 80 | Series1.EndUpdate; 81 | end; 82 | end; 83 | 84 | end. 85 | -------------------------------------------------------------------------------- /AndroidManifest.template.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | <%uses-permission%> 11 | 12 | 22 | 23 | <%provider%> 24 | <%application-meta-data%> 25 | <%uses-libraries%> 26 | <%services%> 27 | 29 | 34 | 35 | 37 | 38 | 39 | 40 | 41 | 42 | <%activity%> 43 | <%receivers%> 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Unit_Tone_Test.pas: -------------------------------------------------------------------------------- 1 | unit Unit_Tone_Test; 2 | 3 | interface 4 | 5 | // https://github.com/davidberneda/FMX_Tone_Beep 6 | 7 | // Enable this DEFINE if you have TeeChart components installed. 8 | {$DEFINE TEECHART} // <-- remove the "." 9 | 10 | uses 11 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 12 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 13 | FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.Layouts, FMX.ListBox; 14 | 15 | type 16 | TToneDemo = class(TForm) 17 | Button1: TButton; 18 | Button2: TButton; 19 | TBDuration: TTrackBar; 20 | TextDuration: TText; 21 | Label1: TLabel; 22 | Label2: TLabel; 23 | TBFrequency: TTrackBar; 24 | TextFrequency: TText; 25 | Layout1: TLayout; 26 | RectangleDo: TRectangle; 27 | RectangleSi: TRectangle; 28 | RectangleLa: TRectangle; 29 | RectangleSol: TRectangle; 30 | RectangleFa: TRectangle; 31 | RectangleMi: TRectangle; 32 | RectangleRe: TRectangle; 33 | RectangleReB: TRectangle; 34 | RectangleMiB: TRectangle; 35 | RectangleSolB: TRectangle; 36 | RectangleLaB: TRectangle; 37 | RectangleSiB: TRectangle; 38 | GitHub: TText; 39 | ButtonChart: TButton; 40 | CBUsePCM: TCheckBox; 41 | CBWave: TComboBox; 42 | CBSampleRate: TComboBox; 43 | TBVolume: TTrackBar; 44 | TextVolume: TText; 45 | Label3: TLabel; 46 | procedure Button1Click(Sender: TObject); 47 | procedure Button2Click(Sender: TObject); 48 | procedure TBDurationChange(Sender: TObject); 49 | procedure TBFrequencyChange(Sender: TObject); 50 | procedure RectangleDoMouseDown(Sender: TObject; Button: TMouseButton; 51 | Shift: TShiftState; X, Y: Single); 52 | procedure FormCreate(Sender: TObject); 53 | procedure GitHubClick(Sender: TObject); 54 | procedure ButtonChartClick(Sender: TObject); 55 | procedure CBUsePCMChange(Sender: TObject); 56 | procedure CBWaveChange(Sender: TObject); 57 | procedure CBSampleRateChange(Sender: TObject); 58 | procedure TBVolumeChange(Sender: TObject); 59 | procedure FormShow(Sender: TObject); 60 | private 61 | { Private declarations } 62 | 63 | function Duration:Integer; 64 | public 65 | { Public declarations } 66 | end; 67 | 68 | var 69 | ToneDemo: TToneDemo; 70 | 71 | implementation 72 | 73 | {$R *.fmx} 74 | 75 | uses 76 | FMX_Tone, 77 | 78 | {$IFDEF TEECHART} 79 | FMX_Tone_Chart, 80 | {$ENDIF} 81 | 82 | FMX_OpenURL; 83 | 84 | procedure TToneDemo.ButtonChartClick(Sender: TObject); 85 | begin 86 | {$IFDEF TEECHART} 87 | TFormChart.Edit(Self, TBFrequency.Value, Round(TBDuration.Value)); 88 | {$ENDIF} 89 | end; 90 | 91 | function TToneDemo.Duration:Integer; 92 | begin 93 | result:=Round(TBDuration.Value); 94 | end; 95 | 96 | procedure TToneDemo.FormCreate(Sender: TObject); 97 | begin 98 | CBUsePCM.IsChecked:=TTone.UsePCM; 99 | 100 | {$IFNDEF MSWINDOWS} 101 | CBUsePCM.Visible:=False; 102 | {$ENDIF} 103 | 104 | {$IFNDEF TEECHART} 105 | ButtonChart.Visible:=False; 106 | {$ENDIF} 107 | end; 108 | 109 | procedure TToneDemo.FormShow(Sender: TObject); 110 | begin 111 | TBVolume.Value:=TTone.Volume; 112 | end; 113 | 114 | procedure TToneDemo.GitHubClick(Sender: TObject); 115 | begin 116 | TOpenURL.Go(GitHub.Text); 117 | end; 118 | 119 | procedure TToneDemo.Button1Click(Sender: TObject); 120 | begin 121 | TTone.Beep(Duration); 122 | end; 123 | 124 | procedure TToneDemo.Button2Click(Sender: TObject); 125 | begin 126 | TTone.Play(Round(TBFrequency.Value), Duration); 127 | end; 128 | 129 | procedure TToneDemo.CBSampleRateChange(Sender: TObject); 130 | begin 131 | case CBSampleRate.ItemIndex of 132 | 0 : TTone.SampleRate:=TSampleRate.SampleRate8000; 133 | 1 : TTone.SampleRate:=TSampleRate.SampleRate11025; 134 | 2 : TTone.SampleRate:=TSampleRate.SampleRate22050; 135 | 3 : TTone.SampleRate:=TSampleRate.SampleRate44100; 136 | end; 137 | end; 138 | 139 | procedure TToneDemo.CBUsePCMChange(Sender: TObject); 140 | begin 141 | TTone.UsePCM:=CBUsePCM.IsChecked; 142 | 143 | CBWave.Enabled:=TTone.UsePCM; 144 | CBSampleRate.Enabled:=TTone.UsePCM; 145 | 146 | TBVolume.Enabled:=TTone.UsePCM; 147 | TextVolume.Enabled:=TTone.UsePCM; 148 | end; 149 | 150 | procedure TToneDemo.CBWaveChange(Sender: TObject); 151 | begin 152 | case CBWave.ItemIndex of 153 | 0: TTone.WaveStyle:=TWaveStyle.Sine; 154 | 1: TTone.WaveStyle:=TWaveStyle.Square; 155 | end; 156 | end; 157 | 158 | procedure TToneDemo.RectangleDoMouseDown(Sender: TObject; Button: TMouseButton; 159 | Shift: TShiftState; X, Y: Single); 160 | begin 161 | if Sender=RectangleDo then TTone.Play(261.63, Duration) else 162 | if Sender=RectangleReB then TTone.Play(277.18, Duration) else 163 | if Sender=RectangleRe then TTone.Play(293.66, Duration) else 164 | if Sender=RectangleMiB then TTone.Play(311.13, Duration) else 165 | if Sender=RectangleMi then TTone.Play(329.63, Duration) else 166 | if Sender=RectangleFa then TTone.Play(349.23, Duration) else 167 | if Sender=RectangleSolB then TTone.Play(369.99, Duration) else 168 | if Sender=RectangleSol then TTone.Play(392.00, Duration) else 169 | if Sender=RectangleLaB then TTone.Play(415.30, Duration) else 170 | if Sender=RectangleLa then TTone.Play(440.00, Duration) else 171 | if Sender=RectangleSiB then TTone.Play(466.16, Duration) else 172 | if Sender=RectangleSi then TTone.Play(493.88, Duration); 173 | end; 174 | 175 | procedure TToneDemo.TBDurationChange(Sender: TObject); 176 | begin 177 | TextDuration.Text := Round(TBDuration.Value).ToString+' msec.'; 178 | end; 179 | 180 | procedure TToneDemo.TBFrequencyChange(Sender: TObject); 181 | begin 182 | TextFrequency.Text := Round(TBFrequency.Value).ToString+' Hertz'; 183 | end; 184 | 185 | procedure TToneDemo.TBVolumeChange(Sender: TObject); 186 | begin 187 | TTone.Volume:=Round(TBVolume.Value); 188 | TextVolume.Text:=TTone.Volume.ToString+' %'; 189 | end; 190 | 191 | end. 192 | -------------------------------------------------------------------------------- /Unit_Tone_Test.fmx: -------------------------------------------------------------------------------- 1 | object ToneDemo: TToneDemo 2 | Left = 0 3 | Top = 0 4 | Caption = 'FMX Tone Test Demo' 5 | ClientHeight = 490 6 | ClientWidth = 351 7 | Position = ScreenCenter 8 | FormFactor.Width = 320 9 | FormFactor.Height = 480 10 | FormFactor.Devices = [Desktop] 11 | OnCreate = FormCreate 12 | OnShow = FormShow 13 | DesignerMasterStyle = 0 14 | object Button1: TButton 15 | Position.X = 17.000000000000000000 16 | Position.Y = 14.000000000000000000 17 | TabOrder = 1 18 | Text = '&Beep' 19 | OnClick = Button1Click 20 | end 21 | object Button2: TButton 22 | Position.X = 18.000000000000000000 23 | Position.Y = 217.000000000000000000 24 | TabOrder = 0 25 | Text = '&Play' 26 | OnClick = Button2Click 27 | end 28 | object TBDuration: TTrackBar 29 | CanParentFocus = True 30 | Max = 1000.000000000000000000 31 | Min = 1.000000000000000000 32 | Orientation = Horizontal 33 | Position.X = 18.000000000000000000 34 | Position.Y = 95.000000000000000000 35 | TabOrder = 3 36 | Value = 200.000000000000000000 37 | OnChange = TBDurationChange 38 | end 39 | object TextDuration: TText 40 | Position.X = 126.000000000000000000 41 | Position.Y = 97.000000000000000000 42 | Size.Width = 114.000000000000000000 43 | Size.Height = 16.000000000000000000 44 | Size.PlatformDefault = False 45 | Text = '200 msec.' 46 | end 47 | object Label1: TLabel 48 | FocusControl = TBDuration 49 | Position.X = 16.000000000000000000 50 | Position.Y = 55.000000000000000000 51 | Size.Width = 120.000000000000000000 52 | Size.Height = 39.000000000000000000 53 | Size.PlatformDefault = False 54 | Text = '&Duration:' 55 | TabOrder = 7 56 | end 57 | object Label2: TLabel 58 | FocusControl = TBFrequency 59 | Position.X = 18.000000000000000000 60 | Position.Y = 125.000000000000000000 61 | Size.Width = 120.000000000000000000 62 | Size.Height = 46.000000000000000000 63 | Size.PlatformDefault = False 64 | Text = '&Frequency:' 65 | TabOrder = 5 66 | end 67 | object TBFrequency: TTrackBar 68 | CanParentFocus = True 69 | Max = 3000.000000000000000000 70 | Min = 1.000000000000000000 71 | Orientation = Horizontal 72 | Position.X = 18.000000000000000000 73 | Position.Y = 177.000000000000000000 74 | TabOrder = 2 75 | Value = 1000.000000000000000000 76 | OnChange = TBFrequencyChange 77 | end 78 | object TextFrequency: TText 79 | Position.X = 126.000000000000000000 80 | Position.Y = 179.000000000000000000 81 | Size.Width = 114.000000000000000000 82 | Size.Height = 16.000000000000000000 83 | Size.PlatformDefault = False 84 | Text = '1000 Hertz' 85 | end 86 | object Layout1: TLayout 87 | Position.X = 18.000000000000000000 88 | Position.Y = 342.000000000000000000 89 | Size.Width = 210.000000000000000000 90 | Size.Height = 77.000000000000000000 91 | Size.PlatformDefault = False 92 | TabOrder = 9 93 | object RectangleDo: TRectangle 94 | Align = Left 95 | Cursor = crHandPoint 96 | Fill.Color = claWhite 97 | Hint = 'Do' 98 | Size.Width = 30.000000000000000000 99 | Size.Height = 77.000000000000000000 100 | Size.PlatformDefault = False 101 | OnMouseDown = RectangleDoMouseDown 102 | end 103 | object RectangleSi: TRectangle 104 | Align = Left 105 | Cursor = crHandPoint 106 | Fill.Color = claWhite 107 | Hint = 'Si' 108 | Position.X = 180.000000000000000000 109 | Size.Width = 30.000000000000000000 110 | Size.Height = 77.000000000000000000 111 | Size.PlatformDefault = False 112 | OnMouseDown = RectangleDoMouseDown 113 | end 114 | object RectangleLa: TRectangle 115 | Align = Left 116 | Cursor = crHandPoint 117 | Fill.Color = claWhite 118 | Hint = 'La' 119 | Position.X = 150.000000000000000000 120 | Size.Width = 30.000000000000000000 121 | Size.Height = 77.000000000000000000 122 | Size.PlatformDefault = False 123 | OnMouseDown = RectangleDoMouseDown 124 | end 125 | object RectangleSol: TRectangle 126 | Align = Left 127 | Cursor = crHandPoint 128 | Fill.Color = claWhite 129 | Hint = 'Sol' 130 | Position.X = 120.000000000000000000 131 | Size.Width = 30.000000000000000000 132 | Size.Height = 77.000000000000000000 133 | Size.PlatformDefault = False 134 | OnMouseDown = RectangleDoMouseDown 135 | end 136 | object RectangleFa: TRectangle 137 | Align = Left 138 | Cursor = crHandPoint 139 | Fill.Color = claWhite 140 | Hint = 'Fa' 141 | Position.X = 90.000000000000000000 142 | Size.Width = 30.000000000000000000 143 | Size.Height = 77.000000000000000000 144 | Size.PlatformDefault = False 145 | OnMouseDown = RectangleDoMouseDown 146 | end 147 | object RectangleMi: TRectangle 148 | Align = Left 149 | Cursor = crHandPoint 150 | Fill.Color = claWhite 151 | Hint = 'Mi' 152 | Position.X = 60.000000000000000000 153 | Size.Width = 30.000000000000000000 154 | Size.Height = 77.000000000000000000 155 | Size.PlatformDefault = False 156 | OnMouseDown = RectangleDoMouseDown 157 | end 158 | object RectangleRe: TRectangle 159 | Align = Left 160 | Cursor = crHandPoint 161 | Fill.Color = claWhite 162 | Hint = 'Re' 163 | Position.X = 30.000000000000000000 164 | Size.Width = 30.000000000000000000 165 | Size.Height = 77.000000000000000000 166 | Size.PlatformDefault = False 167 | OnMouseDown = RectangleDoMouseDown 168 | end 169 | object RectangleReB: TRectangle 170 | Cursor = crHandPoint 171 | Fill.Color = claBlack 172 | Position.X = 23.000000000000000000 173 | Size.Width = 14.000000000000000000 174 | Size.Height = 48.000000000000000000 175 | Size.PlatformDefault = False 176 | OnMouseDown = RectangleDoMouseDown 177 | end 178 | object RectangleMiB: TRectangle 179 | Cursor = crHandPoint 180 | Fill.Color = claBlack 181 | Position.X = 53.000000000000000000 182 | Size.Width = 14.000000000000000000 183 | Size.Height = 48.000000000000000000 184 | Size.PlatformDefault = False 185 | OnMouseDown = RectangleDoMouseDown 186 | end 187 | object RectangleSolB: TRectangle 188 | Cursor = crHandPoint 189 | Fill.Color = claBlack 190 | Position.X = 113.000000000000000000 191 | Size.Width = 14.000000000000000000 192 | Size.Height = 48.000000000000000000 193 | Size.PlatformDefault = False 194 | OnMouseDown = RectangleDoMouseDown 195 | end 196 | object RectangleLaB: TRectangle 197 | Cursor = crHandPoint 198 | Fill.Color = claBlack 199 | Position.X = 143.000000000000000000 200 | Size.Width = 14.000000000000000000 201 | Size.Height = 48.000000000000000000 202 | Size.PlatformDefault = False 203 | OnMouseDown = RectangleDoMouseDown 204 | end 205 | object RectangleSiB: TRectangle 206 | Cursor = crHandPoint 207 | Fill.Color = claBlack 208 | Position.X = 173.000000000000000000 209 | Size.Width = 14.000000000000000000 210 | Size.Height = 48.000000000000000000 211 | Size.PlatformDefault = False 212 | OnMouseDown = RectangleDoMouseDown 213 | end 214 | end 215 | object GitHub: TText 216 | Cursor = crHandPoint 217 | Position.X = 18.000000000000000000 218 | Position.Y = 443.000000000000000000 219 | Size.Width = 321.000000000000000000 220 | Size.Height = 17.000000000000000000 221 | Size.PlatformDefault = False 222 | Text = 'https://github.com/davidberneda/FMX_Tone_Beep' 223 | TextSettings.FontColor = claBlue 224 | TextSettings.HorzAlign = Leading 225 | OnClick = GitHubClick 226 | end 227 | object ButtonChart: TButton 228 | Position.X = 117.000000000000000000 229 | Position.Y = 14.000000000000000000 230 | TabOrder = 11 231 | Text = '&Chart' 232 | OnClick = ButtonChartClick 233 | end 234 | object CBUsePCM: TCheckBox 235 | Position.X = 18.000000000000000000 236 | Position.Y = 256.000000000000000000 237 | Size.Width = 140.000000000000000000 238 | Size.Height = 19.000000000000000000 239 | Size.PlatformDefault = False 240 | TabOrder = 12 241 | Text = '&Use PCM' 242 | OnChange = CBUsePCMChange 243 | end 244 | object CBWave: TComboBox 245 | Enabled = False 246 | Items.Strings = ( 247 | 'Sine' 248 | 'Square') 249 | ItemIndex = 0 250 | Position.X = 18.000000000000000000 251 | Position.Y = 283.000000000000000000 252 | Size.Width = 102.000000000000000000 253 | Size.Height = 32.000000000000000000 254 | Size.PlatformDefault = False 255 | TabOrder = 18 256 | OnChange = CBWaveChange 257 | end 258 | object CBSampleRate: TComboBox 259 | Enabled = False 260 | Items.Strings = ( 261 | '8000 Hz' 262 | '11025 Hz' 263 | '22050 Hz' 264 | '44100 Hz') 265 | ItemIndex = 0 266 | Position.X = 143.000000000000000000 267 | Position.Y = 283.000000000000000000 268 | Size.Width = 102.000000000000000000 269 | Size.Height = 32.000000000000000000 270 | Size.PlatformDefault = False 271 | TabOrder = 17 272 | OnChange = CBSampleRateChange 273 | end 274 | object TBVolume: TTrackBar 275 | CanParentFocus = True 276 | Enabled = False 277 | Orientation = Horizontal 278 | Position.X = 138.000000000000000000 279 | Position.Y = 252.000000000000000000 280 | TabOrder = 19 281 | OnChange = TBVolumeChange 282 | end 283 | object TextVolume: TText 284 | Enabled = False 285 | Position.X = 246.000000000000000000 286 | Position.Y = 252.000000000000000000 287 | Size.Width = 56.000000000000000000 288 | Size.Height = 16.000000000000000000 289 | Size.PlatformDefault = False 290 | Text = '%' 291 | end 292 | object Label3: TLabel 293 | FocusControl = TBVolume 294 | Position.X = 138.000000000000000000 295 | Position.Y = 211.000000000000000000 296 | Size.Width = 120.000000000000000000 297 | Size.Height = 39.000000000000000000 298 | Size.PlatformDefault = False 299 | Text = '&Volume:' 300 | TabOrder = 6 301 | end 302 | end 303 | -------------------------------------------------------------------------------- /FMX_Tone.pas: -------------------------------------------------------------------------------- 1 | unit FMX_Tone; 2 | 3 | interface 4 | 5 | (* 6 | https://github.com/davidberneda/FMX_Tone_Beep 7 | 8 | EXAMPLE: 9 | 10 | TTone.Play(440, 1000) // <--- "La" note, 1 second. 11 | 12 | Delphi multi-platform implementation of sound "Beep" generation. 13 | 14 | Currently supported: 15 | 16 | - Windows 32 and 64 bit. 17 | - Android 32 and 64 bit. 18 | 19 | 20 | Android code ported from Java: 21 | https://stackoverflow.com/a/9106394 22 | 23 | *) 24 | type 25 | TWaveStyle=(Sine,Square); // TODO: Triangle, SawTooth 26 | 27 | TSampleRate=(SampleRate8000,SampleRate11025, 28 | SampleRate22050,SampleRate44100); 29 | 30 | TVolume=Byte; // 0..100 31 | 32 | TTone=record 33 | private 34 | {$IFDEF ANDROID} 35 | class var FVolume:TVolume; 36 | {$ENDIF} 37 | 38 | class function GetVolume:TVolume; static; 39 | class procedure SetVolume(Value:TVolume); static; 40 | public 41 | class var SampleRate : TSampleRate; // Default = 8000 (8kHz) 42 | class var UsePCM : Boolean; // Default = Windows:False Android:True 43 | class var WaveStyle : TWaveStyle; // Default = Sine 44 | 45 | // Duration in Milliseconds (minimum 2 in Windows) 46 | class procedure Beep(const ADuration: Integer); static; 47 | 48 | // Frequency in Hertz 49 | class procedure Play(const AFrequency:Single; const ADuration:Integer); overload; static; 50 | 51 | // Play a custom array of samples (values in range -1..1) 52 | class procedure Play(const ASamples:TArray); overload; static; 53 | 54 | class function GenerateSamples(const AFrequency:Single; const ADuration:Integer):TArray; static; 55 | 56 | class property Volume:TVolume read GetVolume write SetVolume; 57 | end; 58 | 59 | implementation 60 | 61 | uses 62 | {$IFDEF MSWINDOWS} 63 | Winapi.Windows, Winapi.MMSystem, 64 | {$ELSE} 65 | {$IFDEF ANDROID} 66 | Androidapi.Jni, 67 | Androidapi.JNIBridge, 68 | Androidapi.JNI.Media, 69 | {$ENDIF} 70 | {$ENDIF} 71 | 72 | System.SysUtils, 73 | System.Math; 74 | 75 | class procedure TTone.Beep(const ADuration: Integer); 76 | {$IFDEF MSWINDOWS} 77 | begin 78 | Winapi.Windows.Beep(1000,ADuration); 79 | {$ELSE} 80 | {$IFDEF LINUX} 81 | begin 82 | // TODO 83 | {$ELSE} 84 | {$IFDEF ANDROID} 85 | var 86 | tmpVolume: Integer; 87 | StreamType: Integer; 88 | ToneType: Integer; 89 | ToneGenerator: JToneGenerator; 90 | begin 91 | tmpVolume := TJToneGenerator.JavaClass.MAX_VOLUME; 92 | 93 | StreamType := TJAudioManager.JavaClass.STREAM_ALARM; 94 | ToneType := TJToneGenerator.JavaClass.TONE_DTMF_0; 95 | 96 | ToneGenerator := TJToneGenerator.JavaClass.init(StreamType, tmpVolume); 97 | ToneGenerator.startTone(ToneType, ADuration); 98 | {$ELSE} 99 | begin 100 | // TODO: MacOS, iOS 101 | {$ENDIF} 102 | {$ENDIF} 103 | {$ENDIF} 104 | end; 105 | 106 | function GetSampleRate:Integer; 107 | begin 108 | case TTone.SampleRate of 109 | SampleRate11025: result:=11025; 110 | SampleRate22050: result:=22050; 111 | SampleRate44100: result:=44100; 112 | else 113 | //SampleRate8000: 114 | result:=8000; 115 | end; 116 | end; 117 | 118 | class function TTone.GenerateSamples(const AFrequency:Single; const ADuration:Integer):TArray; 119 | var 120 | Samples : TArray; 121 | tmp : Single; 122 | tmpFreq : Integer; 123 | 124 | procedure SetGenerated(const Sample:Integer; const Val:Single); 125 | begin 126 | case WaveStyle of 127 | TWaveStyle.Sine: 128 | Samples[Sample]:=Sin(Sample*tmp)*Val*0.5; 129 | 130 | TWaveStyle.Square: 131 | if (Sample div tmpFreq) mod 2 = 0 then // <-- not correct 132 | Samples[Sample]:= 1*tmp*Val 133 | else 134 | Samples[Sample]:= -1*tmp*Val; 135 | end; 136 | end; 137 | 138 | var 139 | NumSamples : Integer; 140 | i, ramp : Integer; 141 | begin 142 | NumSamples := Round(ADuration * GetSampleRate * 0.001 * 0.5); 143 | SetLength(Samples,NumSamples); 144 | 145 | case WaveStyle of 146 | TWaveStyle.Sine: tmp:=(AFrequency * 2 * PI) / GetSampleRate; 147 | else 148 | begin 149 | tmp:=0.5; 150 | tmpFreq:=Round(0.5*GetSampleRate/AFrequency); 151 | end; 152 | end; 153 | 154 | // Amplitude ramp as a percent of sample count 155 | ramp := NumSamples div 20; 156 | 157 | // Ramp amplitude up (to avoid clicks) 158 | for i:=0 to ramp-1 do 159 | SetGenerated(i,i/ramp); // Ramp up to maximum 160 | 161 | // Max amplitude for most of the samples 162 | for i:=ramp to (NumSamples-1) - ramp do 163 | SetGenerated(i,1); // scale to maximum amplitude 164 | 165 | // Ramp amplitude down 166 | for i:=1 + (NumSamples-1) - ramp to NumSamples-1 do 167 | SetGenerated(i,((NumSamples-1)-i)/ramp); // Ramp down to zero 168 | 169 | result:=Samples; 170 | end; 171 | 172 | {$IFDEF MSWINDOWS} 173 | procedure CheckError(const Err:Cardinal); 174 | begin 175 | if Err<>MMSYSERR_NOERROR then 176 | raiseLastOSError(Err); 177 | end; 178 | 179 | function InitAudioSys:TWaveFormatEx; 180 | begin 181 | with result do 182 | begin 183 | wFormatTag := WAVE_FORMAT_PCM; 184 | nChannels := 1; // Mono 185 | nSamplesPerSec := GetSampleRate; 186 | wBitsPerSample := 16; 187 | nAvgBytesPerSec := nChannels * nSamplesPerSec * wBitsPerSample div 8; 188 | nBlockAlign := nChannels * wBitsPerSample div 8; 189 | cbSize := 0; 190 | end; 191 | end; 192 | 193 | {$ENDIF} 194 | 195 | class function TTone.GetVolume: TVolume; 196 | {$IFDEF MSWINDOWS} 197 | var tmp : DWORD; 198 | wo: HWAVEOUT; 199 | fmt: TWaveFormatEx; 200 | {$ENDIF} 201 | begin 202 | {$IFDEF MSWINDOWS} 203 | fmt:=InitAudioSys; 204 | 205 | CheckError(waveOutOpen(@wo, WAVE_MAPPER, @fmt, 0, 0, CALLBACK_NULL)); 206 | try 207 | CheckError(waveOutGetVolume(wo,@tmp)); 208 | 209 | result:=(100*(tmp shr 16)) div $FFFF; 210 | finally 211 | CheckError(waveOutClose(wo)); 212 | end; 213 | 214 | {$ELSE} 215 | result:=FVolume; 216 | {$ENDIF} 217 | end; 218 | 219 | // Converts and array of singles to an array of bytes, two bytes per single clamped to a 16bit word. 220 | function PCM16Bit(const ASamples:TArray):{$IFDEF ANDROID}TJavaArray{$ELSE}TArray{$ENDIF}; 221 | var idx, 222 | t, 223 | tmp : Integer; 224 | begin 225 | {$IFDEF ANDROID} 226 | result:=TJavaArray.Create(2*Length(ASamples)); 227 | {$ELSE} 228 | SetLength(result,2*Length(ASamples)); 229 | {$ENDIF} 230 | 231 | idx:=0; 232 | 233 | for t:=0 to High(ASamples) do 234 | begin 235 | tmp:=Round(ASamples[t]*32767); 236 | 237 | result[idx] := tmp and $FF; 238 | Inc(idx); 239 | 240 | result[idx] := (tmp and $FF00) shr 8; 241 | Inc(idx); 242 | end; 243 | end; 244 | 245 | class procedure TTone.Play(const ASamples: TArray); 246 | 247 | {$IFDEF MSWINDOWS} 248 | procedure InitHeader(var hdr: TWaveHdr; const Channels:Byte; const Samples:TArray); 249 | begin 250 | ZeroMemory(@hdr, sizeof(hdr)); 251 | 252 | with hdr do 253 | begin 254 | lpData := @Samples[0]; 255 | dwBufferLength := Channels * Length(Samples) * SizeOf(Byte); 256 | dwFlags := 0; 257 | end; 258 | end; 259 | 260 | var 261 | wo: HWAVEOUT; 262 | fmt: TWaveFormatEx; 263 | hdr: TWaveHdr; 264 | begin 265 | fmt:=InitAudioSys; 266 | 267 | CheckError(waveOutOpen(@wo, WAVE_MAPPER, @fmt, 0, 0, CALLBACK_NULL)); 268 | try 269 | InitHeader(hdr,fmt.nChannels,PCM16Bit(ASamples)); 270 | CheckError(waveOutPrepareHeader(wo, @hdr, SizeOf(hdr))); 271 | CheckError(waveOutWrite(wo, @hdr, SizeOf(hdr))); 272 | 273 | // TODO: Callback to allow cancel waiting (asynchronous playing) 274 | 275 | // Block until sound play finishes: 276 | while (WHDR_DONE and hdr.dwFlags)<>WHDR_DONE do 277 | ; 278 | 279 | CheckError(waveOutUnprepareHeader(wo, @hdr, SizeOf(hdr))); 280 | finally 281 | CheckError(waveOutClose(wo)); 282 | end; 283 | {$ELSE} 284 | {$IFDEF ANDROID} 285 | var 286 | BufferSize : Integer; 287 | iaudioTrack : JAudioTrack; 288 | generatedSnd : TJavaArray; 289 | begin 290 | generatedSnd:=PCM16Bit(ASamples); 291 | 292 | BufferSize := TJAudioTrack.JavaClass.getMinBufferSize(GetSampleRate, 293 | TJAudioFormat.JavaClass.CHANNEL_OUT_MONO, 294 | TJAudioFormat.JavaClass.ENCODING_PCM_16BIT); 295 | 296 | iaudioTrack:= TJAudioTrack.JavaClass.init(TJAudioManager.JavaClass.STREAM_MUSIC, 297 | GetSampleRate, TJAudioFormat.JavaClass.CHANNEL_OUT_MONO, 298 | TJAudioFormat.JavaClass.ENCODING_PCM_16BIT, BufferSize, 299 | TJAudioTrack.JavaClass.MODE_STREAM); 300 | try 301 | iaudioTrack.setVolume(Volume*0.01); 302 | 303 | // Play the track 304 | iaudioTrack.play; 305 | iaudioTrack.write(generatedSnd, 0, generatedSnd.Length); // Load the track 306 | 307 | finally 308 | if iaudioTrack<>nil then 309 | iaudioTrack.release; // Track play done. Release track. 310 | end; 311 | {$ENDIF} 312 | {$ENDIF} 313 | end; 314 | 315 | class procedure TTone.SetVolume(Value: TVolume); 316 | {$IFDEF MSWINDOWS} 317 | var tmp : DWORD; 318 | wo: HWAVEOUT; 319 | fmt: TWaveFormatEx; 320 | {$ENDIF} 321 | begin 322 | {$IFDEF MSWINDOWS} 323 | fmt:=InitAudioSys; 324 | 325 | CheckError(waveOutOpen(@wo, WAVE_MAPPER, @fmt, 0, 0, CALLBACK_NULL)); 326 | try 327 | tmp:=Round(Value*$FFFF*0.01); 328 | tmp:=(tmp shl 16)+tmp; 329 | CheckError(waveOutSetVolume(wo,tmp)); 330 | finally 331 | CheckError(waveOutClose(wo)); 332 | end; 333 | 334 | {$ELSE} 335 | FVolume:=Value; 336 | {$ENDIF} 337 | end; 338 | 339 | function Generate(const AFrequency:Single; const ADuration:Integer):TArray; 340 | begin 341 | result:=TTone.GenerateSamples(AFrequency,ADuration); 342 | end; 343 | 344 | {$IFDEF MSWINDOWS} 345 | // Code from: 346 | // https://stackoverflow.com/questions/26917558/playing-pcm-wav-file-in-delphi 347 | procedure PlayPCM(const AFrequency:Single; const ADuration:Integer); 348 | begin 349 | TTone.Play(Generate(AFrequency,ADuration)); 350 | end; 351 | {$ENDIF} 352 | 353 | class procedure TTone.Play(const AFrequency:Single; const ADuration:Integer); 354 | {$IFDEF MSWINDOWS} 355 | begin 356 | if UsePCM then 357 | PlayPCM(AFrequency,ADuration) 358 | else 359 | Winapi.Windows.Beep(Round(AFrequency),ADuration); 360 | {$ELSE} 361 | {$IFDEF LINUX} 362 | begin 363 | // TODO 364 | {$ELSE} 365 | {$IFDEF ANDROID} 366 | begin 367 | TTone.Play(Generate(AFrequency,ADuration)); 368 | {$ENDIF} 369 | {$ENDIF} 370 | {$ENDIF} 371 | end; 372 | 373 | {$IFDEF ANDROID} 374 | initialization 375 | TTone.Volume:=100; 376 | TTone.UsePCM:=True; 377 | finalization 378 | {$ENDIF} 379 | end. 380 | -------------------------------------------------------------------------------- /FMX_Tone_Test.deployproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 5 | 6 | 7 | 835c85c5 8 | david 9 | 10 | 11 | 12 | 13 | 14 | FMX_Tone_Test\ 15 | FMX_Tone_Test.exe 16 | ProjectOutput 17 | 0 18 | 19 | 20 | True 21 | True 22 | 23 | 24 | 25 | 26 | FMX_Tone_Test\res\drawable-hdpi\ 27 | ic_launcher.png 28 | Android_LauncherIcon72 29 | 1 30 | 31 | 32 | True 33 | 34 | 35 | FMX_Tone_Test\ 36 | AndroidManifest.xml 37 | ProjectAndroidManifest 38 | 1 39 | 40 | 41 | True 42 | 43 | 44 | FMX_Tone_Test\res\drawable-xxhdpi\ 45 | ic_launcher.png 46 | Android_LauncherIcon144 47 | 1 48 | 49 | 50 | True 51 | 52 | 53 | FMX_Tone_Test\res\drawable-xxxhdpi\ 54 | ic_launcher.png 55 | Android_LauncherIcon192 56 | 1 57 | 58 | 59 | True 60 | 61 | 62 | FMX_Tone_Test\res\drawable-mdpi\ 63 | ic_launcher.png 64 | Android_LauncherIcon48 65 | 1 66 | 67 | 68 | True 69 | 70 | 71 | FMX_Tone_Test\res\drawable-xhdpi\ 72 | ic_notification.png 73 | Android_NotificationIcon48 74 | 1 75 | 76 | 77 | True 78 | 79 | 80 | FMX_Tone_Test\res\drawable-large\ 81 | splash_image.png 82 | Android_SplashImage640 83 | 1 84 | 85 | 86 | True 87 | 88 | 89 | FMX_Tone_Test\library\lib\armeabi\ 90 | libFMX_Tone_Test.so 91 | AndroidLibnativeArmeabiFile 92 | 1 93 | 94 | 95 | True 96 | 97 | 98 | FMX_Tone_Test\res\values\ 99 | colors.xml 100 | Android_Colors 101 | 1 102 | 103 | 104 | True 105 | 106 | 107 | FMX_Tone_Test\res\drawable-hdpi\ 108 | ic_notification.png 109 | Android_NotificationIcon36 110 | 1 111 | 112 | 113 | True 114 | 115 | 116 | FMX_Tone_Test\res\drawable-xxxhdpi\ 117 | ic_notification.png 118 | Android_NotificationIcon96 119 | 1 120 | 121 | 122 | True 123 | 124 | 125 | FMX_Tone_Test\library\lib\arm64-v8a\ 126 | libFMX_Tone_Test.so 127 | ProjectOutput 128 | 1 129 | 130 | 131 | True 132 | True 133 | 134 | 135 | FMX_Tone_Test\res\drawable\ 136 | splash_image_def.xml 137 | AndroidSplashImageDef 138 | 1 139 | 140 | 141 | True 142 | 143 | 144 | FMX_Tone_Test\library\lib\mips\ 145 | libFMX_Tone_Test.so 146 | AndroidLibnativeMipsFile 147 | 1 148 | 149 | 150 | True 151 | 152 | 153 | FMX_Tone_Test\res\drawable-xhdpi\ 154 | ic_launcher.png 155 | Android_LauncherIcon96 156 | 1 157 | 158 | 159 | True 160 | 161 | 162 | FMX_Tone_Test\library\lib\armeabi-v7a\ 163 | libFMX_Tone_Test.so 164 | AndroidLibnativeArmeabiv7aFile 165 | 1 166 | 167 | 168 | True 169 | 170 | 171 | FMX_Tone_Test\res\drawable-mdpi\ 172 | ic_notification.png 173 | Android_NotificationIcon24 174 | 1 175 | 176 | 177 | True 178 | 179 | 180 | FMX_Tone_Test\res\drawable-ldpi\ 181 | ic_launcher.png 182 | Android_LauncherIcon36 183 | 1 184 | 185 | 186 | True 187 | 188 | 189 | FMX_Tone_Test\res\drawable-xlarge\ 190 | splash_image.png 191 | Android_SplashImage960 192 | 1 193 | 194 | 195 | True 196 | 197 | 198 | FMX_Tone_Test\res\drawable-small\ 199 | splash_image.png 200 | Android_SplashImage426 201 | 1 202 | 203 | 204 | True 205 | 206 | 207 | FMX_Tone_Test\classes\ 208 | FMX_Tone_Test.classes 209 | AndroidClasses 210 | 64 211 | 212 | 213 | True 214 | 215 | 216 | FMX_Tone_Test\res\values\ 217 | styles.xml 218 | AndroidSplashStyles 219 | 1 220 | 221 | 222 | True 223 | 224 | 225 | FMX_Tone_Test\res\values\ 226 | strings.xml 227 | Android_Strings 228 | 1 229 | 230 | 231 | True 232 | 233 | 234 | FMX_Tone_Test\res\values-v21\ 235 | styles.xml 236 | AndroidSplashStylesV21 237 | 1 238 | 239 | 240 | True 241 | 242 | 243 | FMX_Tone_Test\res\drawable-xxhdpi\ 244 | ic_notification.png 245 | Android_NotificationIcon72 246 | 1 247 | 248 | 249 | True 250 | 251 | 252 | FMX_Tone_Test\res\drawable-normal\ 253 | splash_image.png 254 | Android_SplashImage470 255 | 1 256 | 257 | 258 | True 259 | 260 | 261 | 262 | 263 | FMX_Tone_Test\res\drawable-large\ 264 | splash_image.png 265 | Android_SplashImage640 266 | 1 267 | 268 | 269 | True 270 | 271 | 272 | FMX_Tone_Test\res\drawable-large\ 273 | splash_image.png 274 | Android_SplashImage640 275 | 1 276 | 277 | 278 | True 279 | 280 | 281 | FMX_Tone_Test\res\values\ 282 | strings.xml 283 | Android_Strings 284 | 1 285 | 286 | 287 | True 288 | 289 | 290 | FMX_Tone_Test\library\lib\armeabi-v7a\ 291 | libFMX_Tone_Test.so 292 | ProjectOutput 293 | 1 294 | 295 | 296 | True 297 | True 298 | 299 | 300 | FMX_Tone_Test\res\values\ 301 | colors.xml 302 | Android_Colors 303 | 1 304 | 305 | 306 | True 307 | 308 | 309 | FMX_Tone_Test\res\drawable\ 310 | splash_image_def.xml 311 | AndroidSplashImageDef 312 | 1 313 | 314 | 315 | True 316 | 317 | 318 | FMX_Tone_Test\classes\ 319 | FMX_Tone_Test.classes 320 | AndroidClasses 321 | 64 322 | 323 | 324 | True 325 | 326 | 327 | FMX_Tone_Test\res\values\ 328 | styles.xml 329 | AndroidSplashStyles 330 | 1 331 | 332 | 333 | True 334 | 335 | 336 | FMX_Tone_Test\res\drawable-hdpi\ 337 | ic_launcher.png 338 | Android_LauncherIcon72 339 | 1 340 | 341 | 342 | True 343 | 344 | 345 | FMX_Tone_Test\res\drawable-hdpi\ 346 | ic_launcher.png 347 | Android_LauncherIcon72 348 | 1 349 | 350 | 351 | True 352 | 353 | 354 | FMX_Tone_Test\res\drawable-normal\ 355 | splash_image.png 356 | Android_SplashImage470 357 | 1 358 | 359 | 360 | True 361 | 362 | 363 | FMX_Tone_Test\res\drawable-xxhdpi\ 364 | ic_notification.png 365 | Android_NotificationIcon72 366 | 1 367 | 368 | 369 | True 370 | 371 | 372 | FMX_Tone_Test\res\drawable-xxhdpi\ 373 | ic_notification.png 374 | Android_NotificationIcon72 375 | 1 376 | 377 | 378 | True 379 | 380 | 381 | FMX_Tone_Test\res\drawable-normal\ 382 | splash_image.png 383 | Android_SplashImage470 384 | 1 385 | 386 | 387 | True 388 | 389 | 390 | FMX_Tone_Test\res\drawable-xxhdpi\ 391 | ic_launcher.png 392 | Android_LauncherIcon144 393 | 1 394 | 395 | 396 | True 397 | 398 | 399 | FMX_Tone_Test\res\drawable-xxhdpi\ 400 | ic_launcher.png 401 | Android_LauncherIcon144 402 | 1 403 | 404 | 405 | True 406 | 407 | 408 | FMX_Tone_Test\res\drawable-xxxhdpi\ 409 | ic_launcher.png 410 | Android_LauncherIcon192 411 | 1 412 | 413 | 414 | True 415 | 416 | 417 | FMX_Tone_Test\res\drawable-xxxhdpi\ 418 | ic_launcher.png 419 | Android_LauncherIcon192 420 | 1 421 | 422 | 423 | True 424 | 425 | 426 | FMX_Tone_Test\res\drawable-mdpi\ 427 | ic_launcher.png 428 | Android_LauncherIcon48 429 | 1 430 | 431 | 432 | True 433 | 434 | 435 | FMX_Tone_Test\res\drawable-mdpi\ 436 | ic_launcher.png 437 | Android_LauncherIcon48 438 | 1 439 | 440 | 441 | True 442 | 443 | 444 | FMX_Tone_Test\library\lib\armeabi-v7a\ 445 | gdbserver 446 | AndroidGDBServer 447 | 1 448 | 449 | 450 | True 451 | 452 | 453 | FMX_Tone_Test\library\lib\armeabi-v7a\ 454 | gdbserver 455 | AndroidGDBServer 456 | 1 457 | 458 | 459 | True 460 | 461 | 462 | FMX_Tone_Test\res\drawable-xhdpi\ 463 | ic_launcher.png 464 | Android_LauncherIcon96 465 | 1 466 | 467 | 468 | True 469 | 470 | 471 | FMX_Tone_Test\res\drawable-xhdpi\ 472 | ic_launcher.png 473 | Android_LauncherIcon96 474 | 1 475 | 476 | 477 | True 478 | 479 | 480 | FMX_Tone_Test\res\drawable-xlarge\ 481 | splash_image.png 482 | Android_SplashImage960 483 | 1 484 | 485 | 486 | True 487 | 488 | 489 | FMX_Tone_Test\res\drawable-xlarge\ 490 | splash_image.png 491 | Android_SplashImage960 492 | 1 493 | 494 | 495 | True 496 | 497 | 498 | FMX_Tone_Test\ 499 | AndroidManifest.xml 500 | ProjectAndroidManifest 501 | 1 502 | 503 | 504 | True 505 | 506 | 507 | FMX_Tone_Test\res\values\ 508 | strings.xml 509 | Android_Strings 510 | 1 511 | 512 | 513 | True 514 | 515 | 516 | FMX_Tone_Test\classes\ 517 | FMX_Tone_Test.classes 518 | AndroidClasses 519 | 64 520 | 521 | 522 | True 523 | 524 | 525 | FMX_Tone_Test\res\values\ 526 | styles.xml 527 | AndroidSplashStyles 528 | 1 529 | 530 | 531 | True 532 | 533 | 534 | FMX_Tone_Test\res\values-v21\ 535 | styles.xml 536 | AndroidSplashStylesV21 537 | 1 538 | 539 | 540 | True 541 | 542 | 543 | FMX_Tone_Test\res\drawable-xhdpi\ 544 | ic_notification.png 545 | Android_NotificationIcon48 546 | 1 547 | 548 | 549 | True 550 | 551 | 552 | FMX_Tone_Test\res\drawable-xhdpi\ 553 | ic_notification.png 554 | Android_NotificationIcon48 555 | 1 556 | 557 | 558 | True 559 | 560 | 561 | FMX_Tone_Test\res\values-v21\ 562 | styles.xml 563 | AndroidSplashStylesV21 564 | 1 565 | 566 | 567 | True 568 | 569 | 570 | FMX_Tone_Test\ 571 | AndroidManifest.xml 572 | ProjectAndroidManifest 573 | 1 574 | 575 | 576 | True 577 | 578 | 579 | FMX_Tone_Test\library\lib\armeabi\ 580 | libFMX_Tone_Test.so 581 | AndroidLibnativeArmeabiFile 582 | 1 583 | 584 | 585 | True 586 | 587 | 588 | FMX_Tone_Test\library\lib\armeabi\ 589 | libFMX_Tone_Test.so 590 | AndroidLibnativeArmeabiFile 591 | 1 592 | 593 | 594 | True 595 | 596 | 597 | FMX_Tone_Test\res\drawable-mdpi\ 598 | ic_notification.png 599 | Android_NotificationIcon24 600 | 1 601 | 602 | 603 | True 604 | 605 | 606 | FMX_Tone_Test\res\drawable-mdpi\ 607 | ic_notification.png 608 | Android_NotificationIcon24 609 | 1 610 | 611 | 612 | True 613 | 614 | 615 | FMX_Tone_Test\res\drawable-small\ 616 | splash_image.png 617 | Android_SplashImage426 618 | 1 619 | 620 | 621 | True 622 | 623 | 624 | FMX_Tone_Test\res\drawable-small\ 625 | splash_image.png 626 | Android_SplashImage426 627 | 1 628 | 629 | 630 | True 631 | 632 | 633 | FMX_Tone_Test\res\drawable-ldpi\ 634 | ic_launcher.png 635 | Android_LauncherIcon36 636 | 1 637 | 638 | 639 | True 640 | 641 | 642 | FMX_Tone_Test\res\drawable-ldpi\ 643 | ic_launcher.png 644 | Android_LauncherIcon36 645 | 1 646 | 647 | 648 | True 649 | 650 | 651 | FMX_Tone_Test\res\drawable-hdpi\ 652 | ic_notification.png 653 | Android_NotificationIcon36 654 | 1 655 | 656 | 657 | True 658 | 659 | 660 | FMX_Tone_Test\res\drawable-hdpi\ 661 | ic_notification.png 662 | Android_NotificationIcon36 663 | 1 664 | 665 | 666 | True 667 | 668 | 669 | FMX_Tone_Test\library\lib\mips\ 670 | libFMX_Tone_Test.so 671 | AndroidLibnativeMipsFile 672 | 1 673 | 674 | 675 | True 676 | 677 | 678 | FMX_Tone_Test\library\lib\mips\ 679 | libFMX_Tone_Test.so 680 | AndroidLibnativeMipsFile 681 | 1 682 | 683 | 684 | True 685 | 686 | 687 | FMX_Tone_Test\library\lib\armeabi-v7a\ 688 | libFMX_Tone_Test.so 689 | ProjectOutput 690 | 1 691 | 692 | 693 | True 694 | True 695 | 696 | 697 | FMX_Tone_Test\res\values\ 698 | colors.xml 699 | Android_Colors 700 | 1 701 | 702 | 703 | True 704 | 705 | 706 | FMX_Tone_Test\res\drawable\ 707 | splash_image_def.xml 708 | AndroidSplashImageDef 709 | 1 710 | 711 | 712 | True 713 | 714 | 715 | FMX_Tone_Test\res\drawable-xxxhdpi\ 716 | ic_notification.png 717 | Android_NotificationIcon96 718 | 1 719 | 720 | 721 | True 722 | 723 | 724 | FMX_Tone_Test\res\drawable-xxxhdpi\ 725 | ic_notification.png 726 | Android_NotificationIcon96 727 | 1 728 | 729 | 730 | True 731 | 732 | 733 | 734 | -------------------------------------------------------------------------------- /FMX_Tone_Test.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {31DFFD2C-E9D0-485B-9367-C2345642DAC5} 4 | 19.5 5 | FMX 6 | True 7 | Release 8 | Win32 9 | 32787 10 | Application 11 | FMX_Tone_Test.dpr 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Cfg_1 44 | true 45 | true 46 | 47 | 48 | true 49 | Cfg_1 50 | true 51 | true 52 | 53 | 54 | true 55 | Cfg_1 56 | true 57 | true 58 | 59 | 60 | true 61 | Base 62 | true 63 | 64 | 65 | true 66 | Cfg_2 67 | true 68 | true 69 | 70 | 71 | true 72 | Cfg_2 73 | true 74 | true 75 | 76 | 77 | .\$(Platform)\$(Config) 78 | .\$(Platform)\$(Config) 79 | false 80 | false 81 | false 82 | false 83 | false 84 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 85 | true 86 | true 87 | true 88 | true 89 | true 90 | true 91 | true 92 | true 93 | $(BDS)\bin\delphi_PROJECTICON.ico 94 | $(BDS)\bin\delphi_PROJECTICNS.icns 95 | FMX_Tone_Test 96 | 97 | 98 | fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;fmxase;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 99 | package=com.davidberneda.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 100 | Debug 101 | true 102 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 103 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 104 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 105 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 106 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 107 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 108 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 109 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 110 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 111 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 112 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 113 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 114 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 115 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 116 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 117 | annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar 118 | 1 119 | #000000 120 | 121 | 122 | fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 123 | package=com.davidberneda.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 124 | Debug 125 | true 126 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 127 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 128 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 129 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 130 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 131 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 132 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 133 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 134 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 135 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 136 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 137 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 138 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 139 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 140 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 141 | annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar 142 | 1 143 | #000000 144 | 145 | 146 | vclwinx;DataSnapServer;FMXTeeLanguage928;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;TeeUI928;appanalytics;IndyProtocols;vclx;TeeTree2D28Tee9;IndyIPClient;dbxcds;vcledge;TeeGL928;bindcompvclwinx;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FmxTeeUI928;FireDACASADriver;VCLTeeGrid;soapmidas;vclactnband;TeeImport928;fmxFireDAC;dbexpress;FMXTree28;FireDACInfxDriver;DBXMySQLDriver;TeeLanguage928;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;TeePro928;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;FMXTeeDB928;vcldb;vclFireDAC;FMXTeePro928;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;TeeDB928;FMXTee928;DBXSybaseASEDriver;TeeImage928;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;TeeWorld928;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;Tee928;DatasnapConnectorsFreePascal;soaprtl;FMXTeeImport928;soapserver;FireDACIBDriver;$(DCC_UsePackage) 147 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 148 | Debug 149 | true 150 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.davidberneda.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 151 | 1033 152 | $(BDS)\bin\default_app.manifest 153 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 154 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 155 | none 156 | 157 | 158 | vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;VCLTeeGrid;soapmidas;vclactnband;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 159 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 160 | Debug 161 | true 162 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.davidberneda.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 163 | 1033 164 | $(BDS)\bin\default_app.manifest 165 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 166 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 167 | none 168 | 169 | 170 | DEBUG;$(DCC_Define) 171 | true 172 | false 173 | true 174 | true 175 | true 176 | true 177 | true 178 | 179 | 180 | 1 181 | package=com.davidberneda.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 182 | #000000 183 | 184 | 185 | false 186 | PerMonitorV2 187 | true 188 | 1033 189 | 190 | 191 | PerMonitorV2 192 | 193 | 194 | false 195 | RELEASE;$(DCC_Define) 196 | 0 197 | 0 198 | 199 | 200 | PerMonitorV2 201 | 202 | 203 | PerMonitorV2 204 | 205 | 206 | 207 | MainSource 208 | 209 | 210 |
ToneDemo
211 | fmx 212 |
213 | 214 | 215 | 216 | Base 217 | 218 | 219 | Cfg_1 220 | Base 221 | 222 | 223 | Cfg_2 224 | Base 225 | 226 |
227 | 228 | Delphi.Personality.12 229 | Application 230 | 231 | 232 | 233 | FMX_Tone_Test.dpr 234 | 235 | 236 | Embarcadero C++Builder Office 2000 Servers Package 237 | Embarcadero C++Builder Office XP Servers Package 238 | Microsoft Office 2000 Sample Automation Server Wrapper Components 239 | Microsoft Office XP Sample Automation Server Wrapper Components 240 | 241 | 242 | 243 | 244 | 245 | true 246 | 247 | 248 | 249 | 250 | true 251 | 252 | 253 | 254 | 255 | true 256 | 257 | 258 | 259 | 260 | ic_launcher.png 261 | true 262 | 263 | 264 | 265 | 266 | ic_launcher.png 267 | true 268 | 269 | 270 | 271 | 272 | ic_launcher.png 273 | true 274 | 275 | 276 | 277 | 278 | ic_launcher.png 279 | true 280 | 281 | 282 | 283 | 284 | ic_launcher.png 285 | true 286 | 287 | 288 | 289 | 290 | ic_launcher.png 291 | true 292 | 293 | 294 | 295 | 296 | ic_launcher.png 297 | true 298 | 299 | 300 | 301 | 302 | ic_launcher.png 303 | true 304 | 305 | 306 | 307 | 308 | ic_launcher.png 309 | true 310 | 311 | 312 | 313 | 314 | ic_launcher.png 315 | true 316 | 317 | 318 | 319 | 320 | ic_launcher.png 321 | true 322 | 323 | 324 | 325 | 326 | ic_launcher.png 327 | true 328 | 329 | 330 | 331 | 332 | ic_launcher.png 333 | true 334 | 335 | 336 | 337 | 338 | ic_launcher.png 339 | true 340 | 341 | 342 | 343 | 344 | ic_launcher.png 345 | true 346 | 347 | 348 | 349 | 350 | ic_launcher.png 351 | true 352 | 353 | 354 | 355 | 356 | ic_launcher.png 357 | true 358 | 359 | 360 | 361 | 362 | ic_launcher.png 363 | true 364 | 365 | 366 | 367 | 368 | ic_notification.png 369 | true 370 | 371 | 372 | 373 | 374 | ic_notification.png 375 | true 376 | 377 | 378 | 379 | 380 | ic_notification.png 381 | true 382 | 383 | 384 | 385 | 386 | ic_notification.png 387 | true 388 | 389 | 390 | 391 | 392 | ic_notification.png 393 | true 394 | 395 | 396 | 397 | 398 | ic_notification.png 399 | true 400 | 401 | 402 | 403 | 404 | ic_notification.png 405 | true 406 | 407 | 408 | 409 | 410 | ic_notification.png 411 | true 412 | 413 | 414 | 415 | 416 | ic_notification.png 417 | true 418 | 419 | 420 | 421 | 422 | ic_notification.png 423 | true 424 | 425 | 426 | 427 | 428 | ic_notification.png 429 | true 430 | 431 | 432 | 433 | 434 | ic_notification.png 435 | true 436 | 437 | 438 | 439 | 440 | ic_notification.png 441 | true 442 | 443 | 444 | 445 | 446 | ic_notification.png 447 | true 448 | 449 | 450 | 451 | 452 | ic_notification.png 453 | true 454 | 455 | 456 | 457 | 458 | splash_image.png 459 | true 460 | 461 | 462 | 463 | 464 | splash_image.png 465 | true 466 | 467 | 468 | 469 | 470 | splash_image.png 471 | true 472 | 473 | 474 | 475 | 476 | splash_image.png 477 | true 478 | 479 | 480 | 481 | 482 | splash_image.png 483 | true 484 | 485 | 486 | 487 | 488 | splash_image.png 489 | true 490 | 491 | 492 | 493 | 494 | splash_image.png 495 | true 496 | 497 | 498 | 499 | 500 | splash_image.png 501 | true 502 | 503 | 504 | 505 | 506 | splash_image.png 507 | true 508 | 509 | 510 | 511 | 512 | splash_image.png 513 | true 514 | 515 | 516 | 517 | 518 | splash_image.png 519 | true 520 | 521 | 522 | 523 | 524 | splash_image.png 525 | true 526 | 527 | 528 | 529 | 530 | libFMX_Tone_Test.so 531 | true 532 | 533 | 534 | 535 | 536 | libFMX_Tone_Test.so 537 | true 538 | 539 | 540 | 541 | 542 | libFMX_Tone_Test.so 543 | true 544 | 545 | 546 | 547 | 548 | libFMX_Tone_Test.so 549 | true 550 | 551 | 552 | 553 | 554 | libFMX_Tone_Test.so 555 | true 556 | 557 | 558 | 559 | 560 | libFMX_Tone_Test.so 561 | true 562 | 563 | 564 | 565 | 566 | libFMX_Tone_Test.so 567 | true 568 | 569 | 570 | 571 | 572 | true 573 | 574 | 575 | 576 | 577 | true 578 | 579 | 580 | 581 | 582 | true 583 | 584 | 585 | 586 | 587 | 64 588 | true 589 | 590 | 591 | 592 | 593 | true 594 | 595 | 596 | 597 | 598 | libFMX_Tone_Test.so 599 | true 600 | 601 | 602 | 603 | 604 | true 605 | 606 | 607 | 608 | 609 | true 610 | 611 | 612 | 613 | 614 | styles.xml 615 | true 616 | 617 | 618 | 619 | 620 | true 621 | 622 | 623 | 624 | 625 | true 626 | 627 | 628 | 629 | 630 | 64 631 | true 632 | 633 | 634 | 635 | 636 | true 637 | 638 | 639 | 640 | 641 | libFMX_Tone_Test.so 642 | true 643 | 644 | 645 | 646 | 647 | true 648 | 649 | 650 | 651 | 652 | true 653 | 654 | 655 | 656 | 657 | styles.xml 658 | true 659 | 660 | 661 | 662 | 663 | true 664 | 665 | 666 | 667 | 668 | true 669 | 670 | 671 | 672 | 673 | 64 674 | true 675 | 676 | 677 | 678 | 679 | true 680 | 681 | 682 | 683 | 684 | libFMX_Tone_Test.so 685 | true 686 | 687 | 688 | 689 | 690 | true 691 | 692 | 693 | 694 | 695 | true 696 | 697 | 698 | 699 | 700 | styles.xml 701 | true 702 | 703 | 704 | 705 | 706 | true 707 | 708 | 709 | 710 | 711 | FMX_Tone_Test.exe 712 | true 713 | 714 | 715 | 716 | 717 | 1 718 | 719 | 720 | Contents\MacOS 721 | 1 722 | 723 | 724 | 0 725 | 726 | 727 | 728 | 729 | classes 730 | 64 731 | 732 | 733 | classes 734 | 64 735 | 736 | 737 | 738 | 739 | res\xml 740 | 1 741 | 742 | 743 | res\xml 744 | 1 745 | 746 | 747 | 748 | 749 | library\lib\armeabi-v7a 750 | 1 751 | 752 | 753 | 754 | 755 | library\lib\armeabi 756 | 1 757 | 758 | 759 | library\lib\armeabi 760 | 1 761 | 762 | 763 | 764 | 765 | library\lib\armeabi-v7a 766 | 1 767 | 768 | 769 | 770 | 771 | library\lib\mips 772 | 1 773 | 774 | 775 | library\lib\mips 776 | 1 777 | 778 | 779 | 780 | 781 | library\lib\armeabi-v7a 782 | 1 783 | 784 | 785 | library\lib\arm64-v8a 786 | 1 787 | 788 | 789 | 790 | 791 | library\lib\armeabi-v7a 792 | 1 793 | 794 | 795 | 796 | 797 | res\drawable 798 | 1 799 | 800 | 801 | res\drawable 802 | 1 803 | 804 | 805 | 806 | 807 | res\values 808 | 1 809 | 810 | 811 | res\values 812 | 1 813 | 814 | 815 | 816 | 817 | res\values-v21 818 | 1 819 | 820 | 821 | res\values-v21 822 | 1 823 | 824 | 825 | 826 | 827 | res\values 828 | 1 829 | 830 | 831 | res\values 832 | 1 833 | 834 | 835 | 836 | 837 | res\drawable 838 | 1 839 | 840 | 841 | res\drawable 842 | 1 843 | 844 | 845 | 846 | 847 | res\drawable-xxhdpi 848 | 1 849 | 850 | 851 | res\drawable-xxhdpi 852 | 1 853 | 854 | 855 | 856 | 857 | res\drawable-xxxhdpi 858 | 1 859 | 860 | 861 | res\drawable-xxxhdpi 862 | 1 863 | 864 | 865 | 866 | 867 | res\drawable-ldpi 868 | 1 869 | 870 | 871 | res\drawable-ldpi 872 | 1 873 | 874 | 875 | 876 | 877 | res\drawable-mdpi 878 | 1 879 | 880 | 881 | res\drawable-mdpi 882 | 1 883 | 884 | 885 | 886 | 887 | res\drawable-hdpi 888 | 1 889 | 890 | 891 | res\drawable-hdpi 892 | 1 893 | 894 | 895 | 896 | 897 | res\drawable-xhdpi 898 | 1 899 | 900 | 901 | res\drawable-xhdpi 902 | 1 903 | 904 | 905 | 906 | 907 | res\drawable-mdpi 908 | 1 909 | 910 | 911 | res\drawable-mdpi 912 | 1 913 | 914 | 915 | 916 | 917 | res\drawable-hdpi 918 | 1 919 | 920 | 921 | res\drawable-hdpi 922 | 1 923 | 924 | 925 | 926 | 927 | res\drawable-xhdpi 928 | 1 929 | 930 | 931 | res\drawable-xhdpi 932 | 1 933 | 934 | 935 | 936 | 937 | res\drawable-xxhdpi 938 | 1 939 | 940 | 941 | res\drawable-xxhdpi 942 | 1 943 | 944 | 945 | 946 | 947 | res\drawable-xxxhdpi 948 | 1 949 | 950 | 951 | res\drawable-xxxhdpi 952 | 1 953 | 954 | 955 | 956 | 957 | res\drawable-small 958 | 1 959 | 960 | 961 | res\drawable-small 962 | 1 963 | 964 | 965 | 966 | 967 | res\drawable-normal 968 | 1 969 | 970 | 971 | res\drawable-normal 972 | 1 973 | 974 | 975 | 976 | 977 | res\drawable-large 978 | 1 979 | 980 | 981 | res\drawable-large 982 | 1 983 | 984 | 985 | 986 | 987 | res\drawable-xlarge 988 | 1 989 | 990 | 991 | res\drawable-xlarge 992 | 1 993 | 994 | 995 | 996 | 997 | res\values 998 | 1 999 | 1000 | 1001 | res\values 1002 | 1 1003 | 1004 | 1005 | 1006 | 1007 | 1 1008 | 1009 | 1010 | Contents\MacOS 1011 | 1 1012 | 1013 | 1014 | 0 1015 | 1016 | 1017 | 1018 | 1019 | Contents\MacOS 1020 | 1 1021 | .framework 1022 | 1023 | 1024 | Contents\MacOS 1025 | 1 1026 | .framework 1027 | 1028 | 1029 | Contents\MacOS 1030 | 1 1031 | .framework 1032 | 1033 | 1034 | 0 1035 | 1036 | 1037 | 1038 | 1039 | 1 1040 | .dylib 1041 | 1042 | 1043 | 1 1044 | .dylib 1045 | 1046 | 1047 | 1 1048 | .dylib 1049 | 1050 | 1051 | Contents\MacOS 1052 | 1 1053 | .dylib 1054 | 1055 | 1056 | Contents\MacOS 1057 | 1 1058 | .dylib 1059 | 1060 | 1061 | Contents\MacOS 1062 | 1 1063 | .dylib 1064 | 1065 | 1066 | 0 1067 | .dll;.bpl 1068 | 1069 | 1070 | 1071 | 1072 | 1 1073 | .dylib 1074 | 1075 | 1076 | 1 1077 | .dylib 1078 | 1079 | 1080 | 1 1081 | .dylib 1082 | 1083 | 1084 | Contents\MacOS 1085 | 1 1086 | .dylib 1087 | 1088 | 1089 | Contents\MacOS 1090 | 1 1091 | .dylib 1092 | 1093 | 1094 | Contents\MacOS 1095 | 1 1096 | .dylib 1097 | 1098 | 1099 | 0 1100 | .bpl 1101 | 1102 | 1103 | 1104 | 1105 | 0 1106 | 1107 | 1108 | 0 1109 | 1110 | 1111 | 0 1112 | 1113 | 1114 | 0 1115 | 1116 | 1117 | 0 1118 | 1119 | 1120 | Contents\Resources\StartUp\ 1121 | 0 1122 | 1123 | 1124 | Contents\Resources\StartUp\ 1125 | 0 1126 | 1127 | 1128 | Contents\Resources\StartUp\ 1129 | 0 1130 | 1131 | 1132 | 0 1133 | 1134 | 1135 | 1136 | 1137 | 1 1138 | 1139 | 1140 | 1 1141 | 1142 | 1143 | 1144 | 1145 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1146 | 1 1147 | 1148 | 1149 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1150 | 1 1151 | 1152 | 1153 | 1154 | 1155 | ..\ 1156 | 1 1157 | 1158 | 1159 | ..\ 1160 | 1 1161 | 1162 | 1163 | ..\ 1164 | 1 1165 | 1166 | 1167 | 1168 | 1169 | Contents 1170 | 1 1171 | 1172 | 1173 | Contents 1174 | 1 1175 | 1176 | 1177 | Contents 1178 | 1 1179 | 1180 | 1181 | 1182 | 1183 | Contents\Resources 1184 | 1 1185 | 1186 | 1187 | Contents\Resources 1188 | 1 1189 | 1190 | 1191 | Contents\Resources 1192 | 1 1193 | 1194 | 1195 | 1196 | 1197 | library\lib\armeabi-v7a 1198 | 1 1199 | 1200 | 1201 | library\lib\arm64-v8a 1202 | 1 1203 | 1204 | 1205 | 1 1206 | 1207 | 1208 | 1 1209 | 1210 | 1211 | 1 1212 | 1213 | 1214 | 1 1215 | 1216 | 1217 | Contents\MacOS 1218 | 1 1219 | 1220 | 1221 | Contents\MacOS 1222 | 1 1223 | 1224 | 1225 | Contents\MacOS 1226 | 1 1227 | 1228 | 1229 | 0 1230 | 1231 | 1232 | 1233 | 1234 | library\lib\armeabi-v7a 1235 | 1 1236 | 1237 | 1238 | 1239 | 1240 | 1 1241 | 1242 | 1243 | 1 1244 | 1245 | 1246 | 1247 | 1248 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1249 | 1 1250 | 1251 | 1252 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1253 | 1 1254 | 1255 | 1256 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1257 | 1 1258 | 1259 | 1260 | 1261 | 1262 | ..\ 1263 | 1 1264 | 1265 | 1266 | ..\ 1267 | 1 1268 | 1269 | 1270 | ..\ 1271 | 1 1272 | 1273 | 1274 | 1275 | 1276 | 1 1277 | 1278 | 1279 | 1 1280 | 1281 | 1282 | 1 1283 | 1284 | 1285 | 1286 | 1287 | ..\$(PROJECTNAME).launchscreen 1288 | 64 1289 | 1290 | 1291 | ..\$(PROJECTNAME).launchscreen 1292 | 64 1293 | 1294 | 1295 | 1296 | 1297 | 1 1298 | 1299 | 1300 | 1 1301 | 1302 | 1303 | 1 1304 | 1305 | 1306 | 1307 | 1308 | Assets 1309 | 1 1310 | 1311 | 1312 | Assets 1313 | 1 1314 | 1315 | 1316 | 1317 | 1318 | Assets 1319 | 1 1320 | 1321 | 1322 | Assets 1323 | 1 1324 | 1325 | 1326 | 1327 | 1328 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1329 | 1 1330 | 1331 | 1332 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1333 | 1 1334 | 1335 | 1336 | 1337 | 1338 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1339 | 1 1340 | 1341 | 1342 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1343 | 1 1344 | 1345 | 1346 | 1347 | 1348 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1349 | 1 1350 | 1351 | 1352 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1353 | 1 1354 | 1355 | 1356 | 1357 | 1358 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1359 | 1 1360 | 1361 | 1362 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1363 | 1 1364 | 1365 | 1366 | 1367 | 1368 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1369 | 1 1370 | 1371 | 1372 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1373 | 1 1374 | 1375 | 1376 | 1377 | 1378 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1379 | 1 1380 | 1381 | 1382 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1383 | 1 1384 | 1385 | 1386 | 1387 | 1388 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1389 | 1 1390 | 1391 | 1392 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1393 | 1 1394 | 1395 | 1396 | 1397 | 1398 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1399 | 1 1400 | 1401 | 1402 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1403 | 1 1404 | 1405 | 1406 | 1407 | 1408 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1409 | 1 1410 | 1411 | 1412 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1413 | 1 1414 | 1415 | 1416 | 1417 | 1418 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1419 | 1 1420 | 1421 | 1422 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1423 | 1 1424 | 1425 | 1426 | 1427 | 1428 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1429 | 1 1430 | 1431 | 1432 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1433 | 1 1434 | 1435 | 1436 | 1437 | 1438 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1439 | 1 1440 | 1441 | 1442 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1443 | 1 1444 | 1445 | 1446 | 1447 | 1448 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1449 | 1 1450 | 1451 | 1452 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1453 | 1 1454 | 1455 | 1456 | 1457 | 1458 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1459 | 1 1460 | 1461 | 1462 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1463 | 1 1464 | 1465 | 1466 | 1467 | 1468 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1469 | 1 1470 | 1471 | 1472 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1473 | 1 1474 | 1475 | 1476 | 1477 | 1478 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1479 | 1 1480 | 1481 | 1482 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1483 | 1 1484 | 1485 | 1486 | 1487 | 1488 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1489 | 1 1490 | 1491 | 1492 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1493 | 1 1494 | 1495 | 1496 | 1497 | 1498 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1499 | 1 1500 | 1501 | 1502 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1503 | 1 1504 | 1505 | 1506 | 1507 | 1508 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1509 | 1 1510 | 1511 | 1512 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1513 | 1 1514 | 1515 | 1516 | 1517 | 1518 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1519 | 1 1520 | 1521 | 1522 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1523 | 1 1524 | 1525 | 1526 | 1527 | 1528 | 1529 | 1530 | 1531 | 1532 | 1533 | 1534 | 1535 | 1536 | 1537 | 1538 | 1539 | True 1540 | True 1541 | True 1542 | True 1543 | 1544 | 1545 | 12 1546 | 1547 | 1548 | 1549 | 1550 |
1551 | --------------------------------------------------------------------------------