Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 37 additions & 14 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,15 +1,38 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files

# dependencies
node_modules/

# Expo
.expo/
dist/
web-build/
expo-env.d.ts

# Native
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision

# Metro
.metro-health-check*

# debug
npm-debug.*
yarn-debug.*
yarn-error.*

# macOS
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
*.pem

# local env files
.env*.local

# typescript
*.tsbuildinfo

app-example
3 changes: 0 additions & 3 deletions .idea/.gitignore

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/compiler.xml

This file was deleted.

14 changes: 0 additions & 14 deletions .idea/dictionaries/Nick.xml

This file was deleted.

22 changes: 0 additions & 22 deletions .idea/gradle.xml

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/inspectionProfiles/Project_Default.xml

This file was deleted.

30 changes: 0 additions & 30 deletions .idea/jarRepositories.xml

This file was deleted.

16 changes: 0 additions & 16 deletions .idea/misc.xml

This file was deleted.

10 changes: 0 additions & 10 deletions .idea/runConfigurations.xml

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/vcs.xml

This file was deleted.

21 changes: 0 additions & 21 deletions LICENSE

This file was deleted.

97 changes: 50 additions & 47 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,47 +1,50 @@
<h1>VoiceModulation</h1>
<p>This is a lightweight digital audio workstation for android created fully from scratch, open source, and available for free on the Google Play Store.</p>
<a href="https://play.google.com/store/apps/details?id=com.adams.voicemodulation"/>VoiceModulation</a>
<h2>Features</h2>
<ol>
<li>14 time domain variable parameter modulations</li>
<li>dynamic set operations: find/add/delete</li>
<li>project save</li>
<li>undo/redo</li>
</ol>

<h2>Screenshot of VoiceModulation</h2>
<img width="278" alt="app_example" src="https://user-images.githubusercontent.com/39596344/164349760-768b1181-a61b-403d-92e8-bf84fde1a917.png">

<h3>How can I contribute/How are modulations implemented?</h3>
<p><a href="https://github.com/FreddyJohn/VoiceModulation/blob/master/app/src/main/java/com/adams/voicemodulation/MainActivity.java"/>if the user grants the application permission then when you select a modulation it's given conditional inside MainActivity will be met and the moduation parameters will render to the screen by reusing the ModulateControls class</a></p>
<img width="720" alt="selected_mod_condition" src="https://user-images.githubusercontent.com/39596344/164350340-345aaa07-2064-458b-a05f-66c0230f77b3.png">

<p><a href="https://github.com/FreddyJohn/VoiceModulation/blob/master/app/src/main/java/com/adams/voicemodulation/controls/ModulateControls.java"/>Now, in order to hear the selected modulation with your given parameters we override the onClickListener for the play button inside ModulateControls like so</a></p>
<img width="689" alt="modulate_listener" src="https://user-images.githubusercontent.com/39596344/164351043-127604f1-5b11-4efd-beb5-6e385663ac06.png">

<p><a href="https://github.com/FreddyJohn/VoiceModulation/blob/master/app/src/main/java/com/adams/voicemodulation/controls/ModulateControls.java"/>To write this modulation to the Project we override the onLongClickListener for the play button inside ModulateControls like so</a></p>
<img width="618" alt="modulate_write_listener" src="https://user-images.githubusercontent.com/39596344/164351644-94fd3dfc-7bfe-4f96-958e-d6aa76987a7e.png">

<p><a href="https://github.com/FreddyJohn/VoiceModulation/blob/master/app/src/main/java/com/adams/voicemodulation/signal/Modulation.java"/>Finally, inside of of the Modulation class there is numerous modulations that implement the effect interface and override it's modulate method</a></p>
<img width="393" alt="modulation_interface" src="https://user-images.githubusercontent.com/39596344/164351845-66a82f3e-e023-43cc-8565-92c972b61ff4.png">

<p><a href="https://github.com/FreddyJohn/VoiceModulation/blob/master/app/src/main/java/com/adams/voicemodulation/signal/Modulation.java"/>Since we selected Phaser, the Phaser modulation will be called inside of the Modulations class and written to a temporary memory space so that the modulation can either be played or written to the Project</a></p>
<img width="634" alt="phaser_modulation" src="https://user-images.githubusercontent.com/39596344/164352420-9e3a830c-29f2-45f7-abe4-a92569ed29c1.png">

<h4>Why are the Modulations implemented this way?</h4>
<p>If we did not write it this way then we would need a new view for each additional modulation. Writting it this way allows us to take advantage of functional programming and treat the modulations as if they were variables, reusing the UI code for modulations via the ModulateControls class. This makes it extremely simple for anyone to add a new effect. All you must do is create a new modulation by implementing the effect interface and overriding the modulate method inside of the Modulation class. Then create a new conditional inside of MainAcitivity where you pass your new modulation and its arbitrary number parameters to ModulateControls where each parameter can be adjusted by the user</p>

<h2>Future Features & Improvements</h2>
<ol>
<li>Many more time domain modulations</li>
<li>frequency domain operations such as pitch shifting</li>
<li>After modulations are written to Project the changes should propagate to the waveform held in GraphLogic</li>
<li>Improvements to core PieceTable data structure</li>
<li>Better interface for managing projects</li>
<li>real time effects</li>
<li>Improvements to GraphLogic Memory</li>
<li>Multi track projects</li>
<li>Supporting more file formats</li>
<li>writing it again in swift</li>
<li>Anything you would like to add!</li>
</ol>
# Welcome to your Expo app 👋

This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app).

## Get started

1. Install dependencies

```bash
npm install
```

2. Start the app

```bash
npx expo start
```

In the output, you'll find options to open the app in a

- [development build](https://docs.expo.dev/develop/development-builds/introduction/)
- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/)
- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/)
- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo

You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction).

## Get a fresh project

When you're ready, run:

```bash
npm run reset-project
```

This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing.

## Learn more

To learn more about developing your project with Expo, look at the following resources:

- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides).
- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web.

## Join the community

Join our community of developers creating universal apps.

- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute.
- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions.
41 changes: 41 additions & 0 deletions app.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"expo": {
"name": "voice-modulation",
"slug": "voice-modulation",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"scheme": "myapp",
"userInterfaceStyle": "automatic",
"newArchEnabled": true,
"ios": {
"supportsTablet": true
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/images/adaptive-icon.png",
"backgroundColor": "#ffffff"
}
},
"web": {
"bundler": "metro",
"output": "static",
"favicon": "./assets/images/favicon.png"
},
"plugins": [
"expo-router",
[
"expo-splash-screen",
{
"image": "./assets/images/splash-icon.png",
"imageWidth": 200,
"resizeMode": "contain",
"backgroundColor": "#ffffff"
}
]
],
"experiments": {
"typedRoutes": true
}
}
}
45 changes: 45 additions & 0 deletions app/(tabs)/_layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { Tabs } from 'expo-router';
import React from 'react';
import { Platform } from 'react-native';

import { HapticTab } from '@/components/HapticTab';
import { IconSymbol } from '@/components/ui/IconSymbol';
import TabBarBackground from '@/components/ui/TabBarBackground';
import { Colors } from '@/constants/Colors';
import { useColorScheme } from '@/hooks/useColorScheme';

export default function TabLayout() {
const colorScheme = useColorScheme();

return (
<Tabs
screenOptions={{
tabBarActiveTintColor: Colors[colorScheme ?? 'light'].tint,
headerShown: false,
tabBarButton: HapticTab,
tabBarBackground: TabBarBackground,
tabBarStyle: Platform.select({
ios: {
// Use a transparent background on iOS to show the blur effect
position: 'absolute',
},
default: {},
}),
}}>
<Tabs.Screen
name="index"
options={{
title: 'Home',
tabBarIcon: ({ color }) => <IconSymbol size={28} name="house.fill" color={color} />,
}}
/>
<Tabs.Screen
name="explore"
options={{
title: 'Explore',
tabBarIcon: ({ color }) => <IconSymbol size={28} name="paperplane.fill" color={color} />,
}}
/>
</Tabs>
);
}
Loading